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.
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.
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.
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.
How it works
Three steps to a durable sequence
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] }
]
}
]
}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 });
});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
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.