Cowliss is in beta: features and pricing may change.
Customer data for developers

Your users,
in code.

Send identify and track. Get profiles, live segments, and journeys you write in TypeScript.

Free usage included every monthNo card requirednpm i @cowliss/cli
cowliss · one event, end to end
your app
 
cowliss
event track receiving200 · stored
Signed Up · deduplicated · source stamped
profile identity resolvinglinked
profile id minted · identifiers linked
segment on write evaluatingentered
entered “New signups” · membership current
journey as code runningversion 3fd5c0db
welcome · pinned to the version it started on
email sent sendingdelivered
delivery log
14:02:11welcome → [email protected]delivered · 214ms
One event, end to end.
01 / Blueprints

Start with a whole program, not a snippet.

One command writes six journeys, their emails and their segments into your repo, as code you own and edit from the first minute.

ecommerce

6 journeys · 9 emails · 4 segments · 4 events

A shopper's whole life with your store, from the first visit to the VIP perk.

STEP 1
Copy the blueprint into your repo
cow init --blueprint ecommerce
STEP 2
Send these 4 events from your app

abandoned-checkout

Reminds someone who left items in their cart, twice at most.

2 emailsSee the flow →

first-order-thanks

Thanks a first-time customer, then asks how the order went once it arrives.

2 emailsSee the flow →

replenishment

Reminds a regular customer to reorder before they run out.

1 emailSee the flow →

vip

Thanks a customer who has spent past the VIP threshold.

1 emailSee the flow →

welcome

Introduces the store to a shopper who has not ordered yet.

1 emailSee the flow →

winback

Invites a customer back who has not ordered in months.

2 emailsSee the flow →
02 / How it works

Four steps from a signup to a welcome email.

STEP 01

Send events

Two calls, identify and track, from anywhere you can make an HTTP request.

POST /v1/track
STEP 02

Get the profile back

Cowliss makes the id, links the two identities, and updates the segments.

GET /v1/profiles/:id
STEP 03

Write the follow-up

TypeScript in your repo. Test it, then ship it.

$ cow push && cow enable
STEP 04

Watch it land

Mail goes out from your own domain, and every send is on the log.

GET /v1/deliveries
03 / What you get

Everything a big company's growth team has, without the growth team.

A · SEGMENTS

Segments are never stale

The list updates the second an event lands, and you can preview one before you save it.

B · RELEASES

Roll back a bad send

Every push is a numbered version, and one command points back at the last good one.

C · EXECUTION

Your code cannot leak

It runs in a sandbox with no network and no secrets, and every email it sends is logged.

D · EVENT LIST

Typos show up at once

List your events in cow.json, and any name you did not list is flagged on its app.

E · DRY RUN

Try a journey before it sends

Run it against a real person and read every mail it would send, delivering none.

F · BACKFILL

Import the past, quietly

Import a year of events without sending a year of welcome emails.

G · MULTI-APP

Run more than one product

Each app keeps its own data, and any segment or journey can be scoped to one.

H · DATA RIGHTS

Answer a GDPR request in a click

Consent, export, and deletion are one call each, from anywhere.

I · ANALYTICS

Keep your own BI tool

A read-only ClickHouse user for the BI tool you already have.

04 / Follow-up emails

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.

cow test

Test a two-day journey in a second. The clock is fake, so nothing waits and nothing sends.

cow push

Nothing ships by accident. A push changes no flag; you turn a journey on when you mean it.

cow enable

Shipping is safe mid-flight. Someone waiting on day two finishes on the code they started on.

your repo

You can leave. The code is yours, in your repo, not locked in our database.

The full journey API →
journeys/welcome.tstypescript
import { defineJourney } from '@cowliss/cli/journeys';

export default defineJourney({
  trigger: { segment: 'new-signups' },
  purpose: 'marketing',
  from: 'Acme <[email protected]>',
  tags: ['lifecycle'],
  run: async (event, api) => {
    await api.send.email({ template: 'welcome' });
    await api.sleep('3d');

    const me = await api.profile.get();
    if (me.traits.plan === 'trial') {
      await api.send.email({
        template: 'tips',
        from: 'Onboarding <[email protected]>',
      });
    } else {
      await api.send.webhook({
        destination: 'crm',
        payload: { profileId: me.id },
      });
    }
  },
});
terminal
$ cow test welcome --scenario scenarios/welcome.json
✓ passed · 4 steps on a virtual clock, nothing sent
$ cow push
built 2 journeys, 4 templates
push #12 stored, compiling 2 journeys.
$ cow enable welcome --env production
welcome is on in production.
05 / Built for agents

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.

◈ Dashboard

For people

Every user on one page: traits, segments, events, journey runs, every email sent.

profiles / segments / journeys deliveries / event names consent · export · erase
$ cow CLI

For your terminal

Build, test, push, turn journeys on and off, and inspect without leaving your repo.

$ cow segments preview \ --predicates - < new-signups.json$ cow journeys dryRun welcome \ --profile-id prof_9x2
⌁ MCP server

For your agents

An MCP server with every operation in it. No scraping, no screenshots, no browser.

tool: journeys_enable { keys: ["welcome"] } → { data: [{ enabled: { production: true }, … }] }
The docs ship an llms.txt, so an agent can read them before it starts.
06 / Pricing

Start free, pay for what you use.

Every feature on both plans. Nobody is charged for a teammate.

Free

$0

  • $0.50 of usage included a month.
  • 1 app and 1 sending domain.
  • No card required.
Plus

$9.99 a month

  • $15 of usage included a month.
  • Up to 15 apps and 10 sending domains.
  • Cancel any time.
What you pay for

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
  • Same rates on both plans. Never per seat.
NOTEPast included usage you top up a wallet that never expires. At zero credit the service stops rather than billing you.
See the rates and estimate your bill →

Customer data,
in code.

Free usage included every month. No card to start.