API-first · TypeScript-native · Your sender

Email sequences as code.
API-first. Your sender.

Define lifecycle emails in TypeScript. Deploy via API. The engine learns from every send to optimize timing, content, and conversions.

Every SaaS team hand-rolls email sequences. Cron jobs. Sidekiq workers. A forgotten script that sends the wrong email at 3am.

You've already built this badly. We built it well.

Define sequences in code

sequences/onboarding.ts
import { sequence, send, wait, condition } from "@dripctl/sdk";

export const onboarding = sequence("trial-nurture", {
  trigger: "user.signup",
  optimize: true, // ← the engine learns what converts
  steps: [
    send("welcome", { template: "welcome-v2" }),
    wait("3 days"),
    condition("user.activated", {
      yes: send("tips", { template: "power-user-tips" }),
      no: [
        send("nudge", { template: "activation-nudge" }),
        wait("2 days"),
        send("last-chance", { template: "trial-ending" }),
      ],
    }),
  ],
});

Version controlled. Code reviewed. Tested in CI. Deployed via API.

API-first. Everything.

No dashboard required. Every operation is an API call. Build email automation into your product, not around it.

Deploy a sequence

curl -X POST https://api.dripctl.dev/v1/sequences \
  -H "Authorization: Bearer sk_..." \
  -d '{
    "name": "trial-nurture",
    "trigger": "user.signup",
    "definition": {
      "steps": [
        { "type": "send", "template": "welcome" },
        { "type": "wait", "delay": "3 days" },
        { "type": "send", "template": "tips" }
      ]
    }
  }'

One call. Sequence is live. Roll back any time.

Trigger with events

curl -X POST https://api.dripctl.dev/v1/events \
  -H "Authorization: Bearer sk_..." \
  -d '{
    "eventType": "user.signup",
    "userId": "jane@acme.com",
    "metadata": {
      "tenantId": "your-tenant-id",
      "plan": "free"
    }
  }'

Events trigger matching sequences automatically.

Manage users

curl -X POST https://api.dripctl.dev/v1/users \
  -H "Authorization: Bearer sk_..." \
  -d '{
    "email": "jane@acme.com",
    "properties": {
      "plan": "free",
      "company": "Acme"
    }
  }'

Upsert user profiles. Properties available in sequence conditions.

Inspect runs

curl https://api.dripctl.dev/v1/runs/run_8f2ka \
  -H "Authorization: Bearer sk_..."

# Response:
{
  "status": "running",
  "currentStep": "wait",
  "resumesAt": "2026-03-24T10:00:00Z",
  "stepsCompleted": 2,
  "emailsSent": 1
}

See exactly where every user is in every sequence.

⌨️

Sequences as TypeScript

Version control. Code review. CI/CD. Define email logic the same way you define everything else — in code. Not drag-and-drop.

🧠

Adaptive Intelligence

Every send, open, and click feeds into an adaptive memory layer. Over time, the engine learns which sequences convert and adjusts timing and content. Currently in development — early adopters shape how it works.

🔌

Bring Your Own Sender

Your Resend or SES account. Your sending reputation. Your infrastructure. dripctl handles the orchestration.

How it works

1

Define

Write sequences in TypeScript using the dripctl SDK. Triggers, conditions, delays, sends — all in code. Push to your repo like any other feature.

2

Deploy

One API call deploys your sequence. Version controlled. Roll back instantly.

3

Learn

Every send, open, click, and conversion is tracked. The engine builds a model of what works. Self-optimization is in development — early access users help shape it.

Built for developers.

The @dripctl/sdk is live on npm. Full API reference and guides ship with the private beta.

npm install @dripctl/sdk

281 commits and counting.

Built by a developer, for developers. Private beta coming soon.

Get early access.

Join the waitlist. We'll let you know when it's ready.