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

LIVE

System of record. Self-hosted, AGPL, pinned v2.24.1, our own Postgres.

Twenty queue worker

Railway · twenty-crm-worker

LIVE

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

LIVE

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

LIVE

Webhook ingestion, suppression ledger and enforcement gate, unsubscribe flow, campaign command plane, activity write-back into the CRM.

Metabase

metabase.tolowastudio.com · Railway

LIVE

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

LIVE

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

LIVE

Thin glue only — segment query out, survivors in. Deliberately not the place where suppression logic lives.

Mailgun cold domain

mg.tolowastudio.com

IN BUILD

Domain created, all six DNS records live, SPF/DKIM/CNAME valid. Reputation warm-up is calendar time, not code.

Listmonk

planned · Railway

NOT DEPLOYED

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.

  1. 01You ask the agent about a person or company
  2. 02Agent queries the CRM API directly
  3. 03Person, company, open deals, last activity, linked notes
  4. 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.

  1. 01Agent drafts from real CRM context
  2. 02A human reads it and approves it
  3. 03Worker sends over the transactional path
  4. 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.

  1. 01Segment pulled from a Postgres view — one definition, shared by every tool
  2. 02Every recipient checked against the live suppression ledger
  3. 03Survivors pushed to the campaign engine, rendered, sent on the cold domain
  4. 04Delivery, bounce, open, click and complaint events flow back in signed
  5. 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.

  1. 01Machine signal — bounces and complaints auto-suppress, permanently
  2. 02Human signal — replies become a task assigned to a person
  3. 03A scoring pass classifies each reply: interested, not now, referred, dead
  4. 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.

  1. 01Read-only role against the CRM Postgres — proven unable to write
  2. 02Campaign metrics mirrored hourly from the orchestration layer
  3. 03Pipeline by stage and segment, reply rate, days since last touch, consent health
  4. 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.

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.

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.

Talk to Us