Your users,
in code.
Send identify and track. Get profiles, live segments, and journeys you write in TypeScript.
Four steps from a signup to a welcome email.
Send events
Two calls, identify and track, from anywhere you can make an HTTP request.
Get the profile back
Cowliss makes the id, links the two identities, and updates the segments.
Write the follow-up
TypeScript in your repo. Test it, then ship it.
Watch it land
Mail goes out from your own domain, and every send is on the log.
Everything a big company's growth team has, without the growth team.
Segments are never stale
The list updates the second an event lands, and you can preview one before you save it.
Roll back a bad send
Every push is a numbered version, and one command points back at the last good one.
Your code cannot leak
It runs in a sandbox with no network and no secrets, and every email it sends is logged.
Typos never reach your data
Say which events you expect. A misspelled one is held for review, not silently kept.
A place to test safely
A development send does everything a real one does, except reach an inbox.
Import the past, quietly
Import a year of events without sending a year of welcome emails.
Run more than one product
Each app keeps its own data, and any segment or journey can be scoped to one.
Answer a GDPR request in a click
Consent, export, and deletion are one call each, from anywhere.
Keep your own BI tool
A read-only ClickHouse user for the BI tool you already have.
Your welcome email is a file in your repo.
You write it in TypeScript, review it in a pull request, and ship it like any other code. There is no canvas to drag boxes around on.
Test a two-day journey in a second. The clock is fake, so nothing waits and nothing sends.
Nothing ships by accident. Push when you are ready, and deploy when you mean it.
Shipping is safe mid-flight. Someone waiting on day two finishes on the code they started on.
You can leave. The code is yours, in your repo, not locked in our database.
import { defineJourney } from '@cowliss/cli/journeys'; export default defineJourney({ trigger: { segment: 'new-signups' }, purpose: 'emailMarketing', tags: ['lifecycle'], run: async (event, api) => { await api.email.send({ template: 'welcome' }); await api.sleep('3d'); const me = await api.profile.get(); if (me.traits.plan === 'trial') { await api.email.send({ template: 'tips' }); } else { await api.webhook.send({ destination: 'crm', payload: { profileId: me.id }, }); } }, });
$ cow test welcome --scenario scenarios/welcome.json ✓ passed · 4 steps on a virtual clock, nothing sent $ cow push built 2 journeys, 4 templates rel_7b3k #12 ready (6 artifacts uploaded). $ cow deploy --env production rel_7b3k #12 deployed to production.
Your agent can do anything you can do here.
Every button in the dashboard is also a CLI command and an MCP tool, built from the same typed definition. Point an agent at it and it has the whole product.
For people
Every user on one page: traits, segments, events, journey runs, every email sent.
For your terminal
Build, test, push, deploy, inspect, and roll back without leaving your repo.
For your agents
An MCP server with every operation in it. No scraping, no screenshots, no browser.
llms.txt, so an agent can read them before it starts.Free until you are big enough to notice.
No plans, no seats, no contract. Nobody is charged for a teammate.
$1 free, every month
- $1 of usage every month. No card required.
- Resets each UTC month. Does not roll over.
Four things are counted
- Events ingested · $2 per 10,000
- Emails sent · $4 per 10,000
- Webhooks delivered · $2 per 10,000
- Journey runs · $2 per 10,000
- Per event and per send. Never per seat.
Top up when you want to
- One-time top-ups of $10 / $50 / $200, through Stripe.
- Credit never expires.
- Nothing recurring, ever.
Customer data,
in code.
Free allowance every month. No card to start.