Open sourceApache-2.0 · self-hosted

Sales sequences, as code.

Build your own sales sequencing infrastructure without building it from scratch.

No per-seat pricing. No black boxes. Just infrastructure you control.

Use cases

Choose an example

Why teams own their sequencing

Price is the obvious reason. Here are the others.

Headless by design

OpenSequence has no UI of its own. Reps run sequences from the CRM they already use.

Data in your Postgres

Contacts, messages and replies live in your own Postgres, in the region you choose. No vendor stores your prospect data.

Your deliverability

Mail leaves each rep's own Gmail, not a shared sending pool. Another company's bad list cannot hurt your domain's reputation.

Sequences as code

A sequence is versioned JSON. Diff it, review it in a pull request and test it against mock providers in CI.

Agent-native

The MCP server ships with the engine. An agent with an enroll key can enroll contacts and read journeys, but cannot edit sequences, senders or settings.

No black boxes

The engine writes every decision to a ledger, with the branch it took and the facts it read. One GET returns the whole journey.

Multi-tenant

One deployment holds a project per customer, each with its own keys. Add sequencing to your own SaaS without building the engine.

Extensible

Channels, node types and providers register by name. Add WhatsApp or your own dialer without forking the engine.

You can vibe-code a sequence. Not a sequencing service.

The first version takes a weekend. The next two years go to edge cases, and you find each one in production.

Read how it is built

If you build it yourself

  1. Day 1

    A cron job and a loop send the first email. It works, and everyone moves on.

  2. Week 3

    A worker restarts mid-send. Forty prospects get the same email twice.

  3. Month 2

    The code matches replies by subject line, so people who answered still get the follow-up.

  4. Month 6

    Texts arrive at 11 pm in the contact's time zone. Opt-outs climb, and you are the one on call.

Nine problems you would have to solve

Hover or tap a card to see how OpenSequence solves it
MCP server included

Have your agent build and run your sequences.

Your agent drafts sequences, enrolls people and reads the results, through the same API as your backend.

Connect your agent
agent · acme-crm opensequence

Build a sequence for UK facilities managers: an intro email, a threaded follow-up after 3 days, then a call task.

Thought for 3s

Three steps, and it should stop when someone replies or books. I will check the definition before writing it to the repo.

validate_sequence_definition
{ entry: "intro", nodes: 4, exit_on: ["reply", "meeting_booked"] } ↳ Valid. 4 nodes, no warnings.
Write
sequences/uk-facilities.ts ↳ +34 lines
Bash
npx tsx sequences/uk-facilities.ts ↳ Published seq_01JB8Q… as v1

Published UK facilities (v1). It stops on a reply or a booked meeting.

Enroll the 40 leads from this morning with Max as the sender.

Thought for 2s

First make sure Max can send, then dry-run the enrollment before writing anything.

get_sender_readiness
{ sender: "max" } ↳ Ready. Gmail connected, 120 sends left today.
preview_enrollment
{ sequence: "uk-facilities", contacts: 40, sender: "max" } ↳ 38 ready, 2 already in a sequence
enroll_contacts
{ sequence: "uk-facilities", contacts: 38, sender: "max" } ↳ 38 enrolled

Enrolled 38. I skipped two people who are already in "Q4 renewals". First emails go out tomorrow from 09:00, in each lead's own time zone.

Ask about replies, rewrite a step, pause a sender…

Connect in one line

  • Claude Code
  • Cursor
  • Codex
  • Any MCP client
  • Scoped by its key

    An enroll key cannot touch senders or settings.

  • Hosted or local

    Run one HTTP endpoint for the team, or stdio on a laptop.

  • Same rules

    The engine refuses double enrollment for agents too, and logs every call.

Questions

What people ask before the quickstart.

Is this a free alternative to Apollo, Lemlist or Outreach?
It is the sequencing part of those tools, as an open source engine you run. It covers multi-step email, SMS and call-task sequences, replies and exits, webhooks and analytics, all behind an API, so your own product is the UI. There is no per-seat price. You pay for the Postgres and the container it runs on. It is not a prospect database or a warm-up service.
What does headless mean here?
OpenSequence has no user interface. Your CRM, an internal tool or an agent shows sequences, enrollments, tasks and analytics, and talks to the engine through the API. You keep your design, your permissions and your workflow.
Is it really fully configurable through the API?
Yes. Projects, keys, senders, channels, contacts, sequences and versions, enrollments, tasks, webhooks, settings and analytics are all endpoints, 81 operations in the OpenAPI file. The TypeScript SDK and the MCP server call the same API, and the oseq CLI runs the same use cases.
How do agents use it?
Connect the MCP server with an API key. Claude Code, Cursor and any MCP client get tools to list sequences, upsert contacts, preview and enroll, read a journey and pull analytics. Give agents a key with the enroll scope, and they cannot edit sequences, senders or settings.
Does it send email itself?
Yes, through the Gmail API with each sender's own consent and your own Google OAuth client. It sets its own Message-ID, adds List-Unsubscribe, replies in thread when asked, and never exceeds the channel's daily limit. There is no shared sending pool.
What do I need to run it?
You need the Docker image (Node 22), Postgres 14 or newer, and Redis only if you want it as the queue. Migrations run at boot. One process serves the API and runs the workers, and you can split the roles when you scale.

Stop paying per seat to send sequences.

Start the image, create a project and follow the six calls in the quickstart. Mock providers are on in development, so nothing leaves your machine until you connect a real account.

Start building