MOTION CRM
Own the database. Skip the rent.
We canceled an $800+/mo HubSpot bill and replaced it with a stack we own outright: one Postgres as the system of record, a suppression gate every send has to pass, cold and transactional mail kept strictly apart, and an AI agent that reads and writes the record directly. Infrastructure runs under $60 a month.
This is not a concept. It is the CRM Tolowa Studio runs its own pipeline on, and this page is the whole architecture — what is live, what is still warming up, what broke on the way, and how each layer maps to the MotionOS framework we build every client engagement through.
<$60
Run cost / month
$800+
HubSpot Professional / month
0
Data synced between systems
1
Postgres, single source of truth
What Is Actually Running
The honest status board. Including what isn’t built.
Most architecture pages show you the finished diagram and let you assume all of it exists. This one marks each piece. Every LIVE row below was checked against the running service, not a dashboard light — last verified July 30, 2026.
Twenty CRM
crm.tolowastudio.com · Railway
System of record. Self-hosted, AGPL, pinned v2.24.1, our own Postgres.
Twenty queue worker
Railway · twenty-crm-worker
Second process. Drains email, workflow, webhook and cron queues. Was missing entirely until we went looking — see the receipts below.
Agent surface
REST · GraphQL · MCP
Claude and Codex read and write the record with a scoped token. The MCP endpoint answers on the running instance.
motion-control
control.tolowastudio.com · Cloudflare Worker
Webhook ingestion, suppression ledger and enforcement gate, unsubscribe flow, campaign command plane, activity write-back into the CRM.
Metabase
metabase.tolowastudio.com · Railway
Reads the CRM Postgres directly through a read-only role that provably cannot write. No export, no drift.
Cloudflare Email + relay
services/smtp-relay · Railway
Transactional and 1:1 mail on the apex domain. Proven end to end through the product UI to a real inbox.
n8n
n8n.tolowastudio.com · Railway
Thin glue only — segment query out, survivors in. Deliberately not the place where suppression logic lives.
Mailgun cold domain
mg.tolowastudio.com
Domain created, all six DNS records live, SPF/DKIM/CNAME valid. Reputation warm-up is calendar time, not code.
Listmonk
planned · Railway
Campaign segmentation, rendering and dispatch. Gated behind the warm-up above. Saying it is live would be the easy lie.
The Thesis
A CRM is four separable jobs HubSpot fused and rented back to you.
01
System of record
One database holding accounts, people, deals, activity.
02
Human surface
A fast object UI for the slice of work you touch by hand.
03
Agent surface
An API so Claude and Codex operate the record directly.
04
Activation + feedback
Push campaigns out, write the results back onto the record.
HubSpot, GoHighLevel, and most SaaS CRMs sell you all four bundled, priced by contact count, with the exit door taped shut. Our stack keeps one Postgres as the only source of truth and lets every other layer read or write into it — nothing else holds authoritative state, and nothing needs to sync.
The Stack
Eight components. One database.
System of record
Twenty CRM
Self-hosted, AGPL, your own Postgres. One database, no sync.
Agent surface
REST · GraphQL · MCP
Claude and Codex read and write the record directly with a scoped API token.
Automation
n8n
Segment queries and glue between systems. Holds no authoritative state.
Campaigns
Listmonk
Dynamic SQL segments, open and click tracking, unsubscribe management.
Cold transport
Mailgun
Isolated subdomain — bulk mail never touches the apex domain.
Transactional
Cloudflare Email
Client mail and 1:1 sales sends, kept off the bulk sender.
Orchestration
motion-control
Webhook ingestion, suppression enforcement, activity write-back.
Read layer
Metabase
Reads the CRM Postgres directly. No export, no drift, no dashboard that can lie.
The design rule is one sentence long: Postgres is truth, the CRM is the face, automation is the nervous system, the campaign engine is the mouth, and the dashboard is the eyes. Every component either writes into that one database or reads from it. Nothing else is allowed to hold authoritative state, which is why there is no sync job anywhere in this system — and therefore nothing that can silently drift.
How It Works
Five workflows. That is the whole product.
A CRM justifies itself through a handful of things people actually do every day. If these five are fast and honest, the rest is decoration. If they are not, no amount of feature list saves it.
01
Look up a name
The workflow that actually kills the old CRM. Search is a chore. A question is a conversation.
- 01You ask the agent about a person or company
- 02Agent queries the CRM API directly
- 03Person, company, open deals, last activity, linked notes
- 04Answer in seconds — no tabs, no filters, no saved view
02
Send one email
The human approval step is a hard gate. It is never automated away, on purpose.
- 01Agent drafts from real CRM context
- 02A human reads it and approves it
- 03Worker sends over the transactional path
- 04The note and activity land back on the contact record
03
Run a campaign
Every send passes the suppression gate first. No exceptions, no bypass, no second code path.
- 01Segment pulled from a Postgres view — one definition, shared by every tool
- 02Every recipient checked against the live suppression ledger
- 03Survivors pushed to the campaign engine, rendered, sent on the cold domain
- 04Delivery, bounce, open, click and complaint events flow back in signed
- 05The campaign record is written beside the contact where an agent can read it
04
Get feedback back
The write-back is the part every DIY CRM skips. Without it you have a mailing list, not a CRM.
- 01Machine signal — bounces and complaints auto-suppress, permanently
- 02Human signal — replies become a task assigned to a person
- 03A scoring pass classifies each reply: interested, not now, referred, dead
- 04Lifecycle stage is written back onto the company record
05
See the whole thing
The dashboard reads the source of truth. It cannot show you a number the database does not hold.
- 01Read-only role against the CRM Postgres — proven unable to write
- 02Campaign metrics mirrored hourly from the orchestration layer
- 03Pipeline by stage and segment, reply rate, days since last touch, consent health
- 04One surface, no exports, nothing reconciled by hand
The Decision You Cannot Undo
Three senders. Never merged.
Sending reputation attaches to a domain, and it is far easier to lose than to rebuild. Cold prospecting volume on the domain your clients receive invoices from is the fastest way to make your own business unreachable. This is the one architectural choice on this page that is genuinely expensive to reverse, so we make it first, every time.
Stream
Sending domain
Volume
Blast radius if the reputation burns
Transactional
apex domain
Low
Catastrophic — client mail dies with it
1:1 sales
apex domain
Low
Catastrophic — same domain, same reputation
Cold / campaign
isolated subdomain
Bulk
Contained — cold only, apex untouched
The corollary
A transactional email service is not a campaign tool and must never be pointed at one. Beyond the vendor’s own policy, the limits make it structurally unsuitable — small per-message recipient caps, conservative daily quotas, no segmentation, no open or click tracking, no unsubscribe management. It is a pipe. We use it as one.
The gate
Every send path calls one suppression check before dispatch. Not a filter copied into each workflow — one gate, one implementation, one place to audit. A campaign sent without it in May 2026 is exactly why the rule exists, and why no new send path ships without calling it.
Division Of Labor
Every layer owns one job. Nothing owns two.
Composable stacks fail in a predictable way: two components quietly start holding the same fact, and six months later nobody knows which one is right. The fix is boring discipline about ownership, written down before anything is wired.
The CRM
Accounts, people, deals, activity, consent. The only authoritative state in the system.
Orchestration
Webhook ingestion, the suppression ledger and its enforcement gate, unsubscribes, activity write-back.
Campaign engine
Segmentation, template rendering, dispatch, per-recipient open and click tracking.
Automation
The thin glue between the three above. Nothing more — glue that holds state becomes a second source of truth.
Inside The Framework
Where the CRM sits in MotionOS.
MotionOS runs in a fixed order — Business OS, then Web OS, then GTM OS — because building collateral before the operating hub exists is how companies end up with beautiful assets and no system underneath them. A CRM is not a fourth thing bolted on the side. It is the shared substrate all three layers write into.
Business OS
The operating hub — decisions, owners, lifecycle stage, cadence.
The CRM is where the account, the relationship, and the stage physically live. Business OS decides what a stage means; the CRM is where it is recorded.
Web OS
The presence layer — the pages, the conversion goal, the instrumentation.
Every form, booking and inbound reply lands as a record instead of an inbox. The site stops being a brochure and starts being an intake surface.
GTM OS
The motion — ICP, channel, pipeline structure, follow-up.
The CRM is GTM OS made physical: segments are queries against the record, sends are gated by it, and every outcome is written back onto it.
This is also why we build it this way for clients rather than reselling a seat. A rented CRM makes your operating system a tenant of someone else’s roadmap. Owning the record means the framework, the site and the go-to-market motion all point at a database you control — and an agent can operate all three without asking a vendor for permission.
Receipts
Four things that were broken while reporting success.
This is the part a vendor page leaves out. Each of these looked fine from the outside — green status, success messages, completed jobs — and each was found by going past the indicator to the actual dependency. If you buy this stack from us, you are largely buying the fact that we already hit these.
Silent data loss
Every uploaded file was being destroyed on redeploy
File storage was pointed at container disk with no persistent volume attached. Nothing errored. Attachments and logos simply vanished on the next deploy. Fixed by moving storage to object storage with a bucket-scoped credential — cheaper and more correct than a volume.
A system that fails silently will pass every health check you write for it.
Never ran at all
The background worker process did not exist
The CRM ships as two processes — an API server and a queue worker. Only the API side had ever been deployed. Every queue (email, workflows, webhooks, cron) had been inert since the instance was stood up. Proof came from reading the job queue’s own event stream: jobs sat in "waiting" forever, never active, never failed. The UI reported success the whole time.
Do not trust the success message. Read the queue.
Platform block
The host blocked outbound mail at the network layer
With the worker running, jobs reported "completed" and no email arrived. The send code fires the request without awaiting it, so the job completes the instant the send is attempted — not when it succeeds. Getting a shell inside the actual container produced the real answer in one line: the network was unreachable on every SMTP port. A platform restriction, identical for every mail vendor.
Verify against the real dependency, from inside the real environment.
The fix
A hundred-line relay instead of a plan upgrade
Rather than pay to unblock a port, we built a small relay that accepts mail on the private internal network and forwards each message over HTTPS to the mail provider’s API — a path the block does not touch. Verified in stages: local round trip, then deployed alone, then reachable from the worker, then finally through the product’s own password-reset flow into a real inbox.
Cheapest verification first. The last test is the real one.
The Comparison
HubSpot. GoHighLevel. MOTION CRM.
Every number below was checked against a vendor pricing page or a primary source in July 2026 — not copied from a comparison blog.
HubSpot
GoHighLevel
MOTION CRM
Entry cost, SMB scale
$800/mo + $3,000 onboarding (Professional)
$97–$297/mo, unlimited contacts
Under $60/mo run cost
3-year TCO
~$32,000+ before overages
~$3,500–$10,700
~$2,160 run cost + build/management
Vendor lock-in
High — workflows live inside HubSpot; export is documented as difficult
Medium-high — sub-account schema doesn’t port; migrating out is unsupported
Low — your Postgres, open API, AGPL source you can fork
AI-agent operability
Official MCP server (mcp.hubspot.com), OAuth-gated, standard objects only — no custom objects
Closed AI suite; no open API for agent orchestration
Native MCP endpoint + full REST/GraphQL on your own database — no vendor gatekeeping
Deliverability control
Shared sending infrastructure; reputation issues partly obscured in reporting
Shared “LC Email” pool — documented reputation bleed from other tenants
Isolated sender domains by design — cold and transactional never share a domain
Customization ceiling
Custom objects/workflows gated behind Professional/Enterprise
White-label and sub-accounts; core data model not extensible
Zero objects out of the box — full schema control, no paywall
Operational burden
None — fully managed SaaS
None — fully managed SaaS
Real — needs in-house DevOps or a managed-service relationship
Best-fit customer
Enterprises needing compliance depth and an established consultant ecosystem
Agencies reselling a cheap all-in-one white-label to SMB clients
Technical founders, or any SMB/agency having Tolowa build and run it instead
What It Costs
The bill, line by line.
CRM (self-hosted, AGPL)
$0 licence
Automation engine
$0 licence
Campaign engine
$0 licence
Dashboard / read layer
$0 licence
Cold email transport
~$15–35 / mo
Transactional email
~$0–5 / mo
Compute + database hosting
existing footprint
Object storage for attachments
cents
Under sixty dollars a month of infrastructure against a HubSpot Professional bill of eight hundred plus a three-thousand-dollar onboarding fee. Over three years that is roughly two thousand against thirty-two thousand, before contact-tier overages.
And that is not the whole story. Someone has to build the integration, patch it, back it up, and answer for it when a queue stops draining at nine on a Friday night. That labor is a real line item whether it sits inside your company or inside a retainer with ours. Anyone selling you self-hosting as free is quietly leaving it off the invoice.
The honest trade is this: you stop renting the software and start paying for the operating capability. The difference is that at the end of it, you still own the database.
Corrected On The Record
We checked our own claims before publishing.
Our first research pass got two things wrong. An adversarial verification pass caught them against primary sources before this page went live. We’d rather show the correction than quietly ship the cleaner story.
Refuted
“HubSpot has no official MCP server.”
Wrong — a reader caught this. HubSpot ships an official remote MCP server at mcp.hubspot.com, OAuth-gated, read/write on standard CRM objects (contacts, companies, deals, tickets, and more). It does not expose custom objects, and you’re still working through HubSpot’s schema, not your own — but the server itself is real and official. Corrected here rather than quietly edited out.
Refuted
“Twenty CRM has no native MCP server.”
Wrong again — caught twice now on this exact category, including once in our own internal architecture doc. Twenty serves a real MCP endpoint on the running instance, authenticated with the same scoped token we already use for REST. We re-verified it against our live instance on the day this page was last updated rather than trusting either the doc or the memory of it.
Confirmed
“GoHighLevel’s AI Employee suite is real.”
Voice AI, Conversation AI, Reviews AI, Content AI, and Agent Studio are shipped and generally available — not vaporware. It just isn’t open to outside agents.
Incomplete on its own
“$60/mo is the whole story.”
That’s the run cost. Someone still has to build the stack and keep it running — patching, backups, on-call. That labor is real, and it’s what Tolowa sells as the managed service.
Questions
Common questions.
Is self-hosting a CRM actually cheaper, or does it just move the cost?
Both. The subscription cost genuinely drops — the CRM, automation engine and campaign engine are free and open source, and transport plus compute run under $60/mo combined. But someone has to build the integration and keep it healthy. That’s real labor, whether it’s in-house or a managed retainer. Anyone who tells you self-hosting is free labor too is skipping a line item.
Why not just use HubSpot’s free tier?
The free tier works until it doesn’t — marketing automation, workflows, and custom objects sit behind the Professional tier at $800/mo plus a mandatory $3,000 onboarding fee, and contact-tier overages auto-escalate your bill with no grace period and no auto-downgrade.
Is GoHighLevel a good alternative to HubSpot?
For a lot of agencies, yes on price — $97–$297/mo unlimited contacts is a real win over HubSpot. The tradeoff is deliverability: GoHighLevel’s built-in email runs on a shared sending pool across all of its sub-accounts, and a documented pattern across agency reports is other tenants’ bad sending behavior dragging down everyone’s reputation — the common fix is routing around GoHighLevel’s own email entirely with a custom SMTP provider.
Can an AI agent actually operate a CRM directly, or is that marketing?
It is real on all three, but not equally. HubSpot ships an official MCP server, Twenty CRM serves one on the running instance, and GoHighLevel’s AI features exist but are closed to outside agents entirely. The real difference isn’t whether an endpoint exists, it’s what it can reach. HubSpot’s is OAuth-gated to their own standard objects, not custom ones. Ours reaches the actual schema, including anything we add to it — no object whitelist and no vendor approval step, because we own the database it is talking to.
Why keep cold email on a separate domain? Isn’t that overkill for a small business?
It is the single decision on this page that cannot be undone cheaply. Sending reputation attaches to a domain. If bulk prospecting and client mail leave from the same domain and the prospecting goes badly, your invoices, proposals and password resets start landing in spam. Separating them costs one DNS setup and a warm-up period. Merging them costs you the ability to reach the clients you already have.
What happens to someone who unsubscribes or bounces?
They are written into a suppression ledger permanently, and every send path checks that ledger before dispatch — it is one gate, not a filter copied into each workflow where someone can forget it. Hard bounces and complaints suppress automatically. Soft, transient failures deliberately do not, because those are worth retrying. Consent state also lives on the contact record itself, so a segment query cannot return someone who asked not to be contacted.
How much of this is actually running versus planned?
The status board near the top of this page is the honest answer, and we keep it current rather than flattering. The record, the agent surface, the orchestration layer, the dashboard and the transactional email path are live and verified against the real dependency. The cold domain is warming. The campaign engine is not deployed yet, because deploying it before the domain is warm would be the fastest way to burn the thing it depends on.
What does Tolowa actually sell here?
Not a DIY tutorial. We build the stack — the record, the automation glue, the campaign layer, the dashboard, the agent wiring — and either hand it off or run it as a managed retainer. The pitch is the outcome: a CRM you own, an agent that can operate it, and infrastructure under $60/mo, without asking a non-technical team to become their own ops department.
Inside MotionOS
The CRM is one piece. See the rest.
Memory Architecture
How agents carry decisions and context across sessions — the same design rule (one source of truth) applied to memory instead of contacts.
Learn more →
Business OS
Where CRM data feeds strategic decisions, lifecycle stage, and venture context.
Learn more →
Technical System
The full MotionOS technical architecture this CRM stack is one layer of.
Learn more →
Want us to
build yours?
We build and can run this stack for you — the cost advantage without asking your team to become an ops department.