Overview
Four moving parts,and they are all ordinary.
People, with a record of what you are allowed to send them. A graph that decides what happens when. Documents that render into whatever the graph wants to send. And an engine that walks contacts through the graph without losing anyone, double-sending, or breaking when you edit it at half past four on a Friday.
- 1ContactsWho they are and on what basis you may write.
- 2TriggerSomething happens. A run starts.
- 3GraphWaits, conditions, splits, goals, sends.
- 4CreativeOne document rendered to the target channel.
- 5SendYour mailbox or your provider. Suppression checked here.
- 6EventsDelivered, opened, clicked — back onto the contact.
Step six feeds step two. A message being opened is itself a trigger; a link being clicked is a trigger; the absence of either for ninety days is a segment somebody can enter. That loop is the whole product, and everything below is a detail of how one of its six parts is built.
What follows is not a feature list arranged to look impressive. It is the shape of the system, in the order a person actually meets it.
The contact plane
and the account plane never meet.
A customer is you — you sign in with a castomo account, and ClickSomo never sees your password, because identity belongs to a separate service and is verified offline.
A contact is somebody you market to. A contact never signs in, never holds a credential, and never becomes an account. The two planes are kept permanently separate, because you are the data controller for your own contacts and we are the processor — and that is the arrangement that makes the whole thing lawful rather than merely convenient.
It has a practical edge as well. A payment does not create a contact. A booking does not create a contact. There is no quiet back door through which a sibling service can add somebody to your list without a basis for writing to them.
- 1Three identifiersTenant, project and user, as uuids. No password, no profile, no card.
- 2Quotas as numbersContacts, sends, AI generations. No amount, no currency, no invoice — billing vocabulary does not cross this line.
- 3Your contactsYours. Scoped to a tenant and a project together, so a forgotten project sees nothing rather than somebody else's rows.
Two planes, permanently separate
Everything here happens in somebody's pocket.
The engine
A run is a row,
and a wait is a time on it.
One run per contact per funnel version. A worker leases the runs that are due, executes nodes until it reaches a wait or a terminal, and writes the next wake-up time. That is the whole loop, and its plainness is the point.
A node is a pure function
Of the run, the contact and the node — and its effects commit in the same transaction as the run's own advance. A worker killed between "send" and "advance" leaves nothing half-done, which is what makes a retry safe rather than a second e-mail.
Waits are not queued rows
A wait sets wake_at on the run. Nothing downstream is written in advance, so there is nothing downstream to corrupt when you edit the funnel — the failure mode of every tool that pre-materialises a sequence at entry.
Idempotency is an index
Not a check followed by an insert: the window between those two is exactly wide enough to double-send. A unique index over run, node, contact and window is what actually stops it, and it stops it under load too.
The parts, in order
Eight pages,
and then you have read the product.
There is no hidden depth below this. Each page is the real mechanism, not a summary of it.
Contacts & consent
Identity is the e-mail address. The name is stored whole. Consent is a ledger with a lawful basis, and absence is not permission.
Learn moreFunnels & triggers
Fourteen triggers, sixteen actions, seven flow nodes, and the seven awkward cases the engine is tested against.
Learn moreChannels
E-mail, SMS, push and printed letters. Bring your own sending, and one delivery vocabulary whichever provider carries it.
Learn moreCreative
One document, six render targets, merge variables checked at publish, and a warning before Gmail clips your message.
Learn moreTracking & reports
A separate tracking host, signed redirects, one-click unsubscribe, and bot traffic labelled rather than quietly counted.
Learn moreAI & agents
A sentence in, a funnel out — validated the same way a human's is. An MCP server whose best tool is a dry run.
Learn moreThe API
API first, no private endpoints, OpenAPI at /docs, idempotency keys everywhere, signed webhooks out.
How it compares
Where this sits beside Mailchimp, Brevo, ActiveCampaign, Klaviyo and e-clicks.pro — stated as facts about ClickSomo.
Learn moreWhat it costs
Start free, scale by contacts and channels, and pay nothing towards sending because you bring your own.
Learn moreWhat this is not.
It is not a CRM. It holds a mailing list and what that list did, not your pipeline, your deals or your invoices. If you need those, keep the system you have and send it events.
It is not an agent that decides for itself what to send. AI drafts a funnel or a piece of copy at a point you asked it to; the graph it produces is then validated by exactly the same checker that gates a human's, and nothing reaches a real person without a human publishing it. That is a deliberate limit and it is why a run is reproducible.
It is not a mail server, and it never will be. Deliverability reputation belongs to your provider or your own mailbox — which is also why nobody else's bad campaign can damage yours here.
The honest bit: bringing your own sending is a real trade. You configure a mailbox or a provider, add three DNS records and check they verify, and you own the consequence if you send something people report. In exchange you pay nothing towards delivery, your reputation is not pooled with strangers, and switching provider does not change a single thing upstream of it.
Tell us what you send today,
and to how many.
We will show you what it looks like here — usually with the funnel drawn, because that is faster than a paragraph about it.
Open ClickSomo Talk to a person