Skip to content

Email sequences · Drip campaigns · Notification engines

Stop building email sequence infrastructure.

Orch8 handles scheduling, rate limits, retries, and conditional branching — so your team ships the product, not the plumbing underneath it.

Use cases

Any sequence. Any cadence. Any language.

Orch8 is a general-purpose time-based orchestration engine. These are the workloads teams reach for it most.

Cold outreach sequences

Multi-touch sequences that pause when they should

Send day-0, day-3, day-7, and day-14 emails. Stop the sequence automatically when someone books a call. Branch based on whether the previous email was opened. No state machine required.

email sequence scheduleropen sourceself-hosted

Onboarding drip campaigns

Onboarding that adapts to user behavior

Trigger onboarding sequences from a signup event. Send contextual emails based on what the user has and hasn't done. Delay until business hours. Respect timezone. Retry on failure without resending.

drip campaign enginemulti-step notificationdurable

SLA-driven follow-ups

Escalate automatically when SLAs slip

Start a follow-up sequence the moment a ticket is created. Escalate to a manager if unresolved after 4 hours. Page on-call if 8 hours pass. Cancel the sequence when the ticket closes.

SLA automationtask queuerate limiting

Billing retries & dunning

Retry payment failures without alienating customers

Attempt charge on failure. Wait 3 days and retry. Send a soft reminder email. Try again after 7 days with a different payment method. Downgrade after 30 days. All configurable, all durable.

durable task queueretry logicbilling automation

How it works

Three steps to a durable sequence

1

Define your sequence as JSON

Describe the steps, delays, conditions, and retry logic in a JSON sequence definition. No SDK required. No new programming model.

{
  "blocks": [
    {
      "type": "step",
      "handler": "send_welcome_email",
      "params": { "to": "{{context.data.email}}" }
    },
    {
      "type": "step",
      "handler": "wait",
      "delay": { "days": 3 }
    },
    {
      "type": "router",
      "routes": [
        { "condition": "{{outputs.email_1.opened}}", "blocks": [...follow_up_a] },
        { "default": true, "blocks": [...follow_up_b] }
      ]
    }
  ]
}
2

Deploy your workers in any language

Workers are plain HTTP handlers. Orch8 calls them via a pull-based REST API. Run them in Node.js, Python, Go, Ruby — anything that can respond to a POST request.

// Node.js worker example
app.post('/workers/send_welcome_email', async (req, res) => {
  const { params, context } = req.body;
  await sendEmail({
    to: params.to,
    subject: "Welcome to the product",
  });
  res.json({ success: true });
});
3

Create instances from your API

Start a sequence instance from anywhere — your signup webhook, a Zapier trigger, a CLI script. Orch8 schedules and tracks execution from start to finish.

POST /sequences/{sequence_id}/instances
{
  "context": {
    "data": {
      "email": "user@example.com",
      "name": "Alex",
      "plan": "pro"
    }
  },
  "idempotency_key": "onboarding-user-42"
}

Durable task queue rate limiting

Protect your sender reputation automatically.

Set a rate_limit_key and a limit on any step. Orch8 tracks usage with a sliding window and defers overages to the next available slot — they never get dropped or lost.

  • Per-resource limits — different limits per ESP, per domain, per user
  • Sliding window — not fixed buckets, accurate under burst traffic
  • Defer-not-drop — overages are rescheduled, nothing disappears
  • Works across concurrent instances — global rate enforcement
  • No Redis required — tracked in PostgreSQL

Step with rate limit

{
  "type": "step",
  "handler": "send_email",
  "rate_limit_key": "esp:sendgrid",
  "rate_limit": {
    "max": 100,
    "window_seconds": 1
  }
}

What happens at the limit

Steps 1–100: execute immediately
Step 101: deferred to next window
Step 101 executes — guaranteed, eventually

What you don't build

6 problems you never have to solve

Every team that runs sequences eventually builds all of these. With Orch8, none of them are your problem.

State machine for sequence position

No tracking which step a user is on, what's been sent, or where to resume on restart. Orch8 owns that state.

Rate limit enforcement layer

No Redis-backed counters, no sliding window logic, no defer queues. Orch8 tracks limits and defers overages automatically.

Retry + backoff logic per step

No exponential backoff implementation, no dead letter queue wiring. Each step configures its own retry behavior inline.

Crash recovery mechanism

No heartbeat polling, no stuck-job detector. Orch8 auto-resets instances that stall mid-execution on restart.

Output deduplication

No checking 'did this email already go out before the crash?' Step outputs are memoized — retries return the cached result.

Timezone-aware scheduler

No Luxon/date-fns gymnastics for business-hours delivery or DST transitions. Delays accept timezone + business-days-only natively.

Ready to stop rebuilding this?

Tell us what you're building. We'll reach out within 24 hours to see if Orch8 is a fit — and walk you through a working example for your use case.

No credit card required. No sales call if you don't want one.