@dripctl/sdk
v0.2.1
Published
TypeScript SDK for DripCtl — define email sequences in code
Maintainers
Readme
@dripctl/sdk
Email sequences as code. Zero dependencies. Full types.
TypeScript SDK for dripctl — define email sequences in code, deploy via API, trigger with events.
Install
npm install @dripctl/sdkQuick Start
import { DripCtl } from '@dripctl/sdk';
const dripctl = new DripCtl({
apiKey: process.env.DRIPCTL_API_KEY!,
tenantId: process.env.DRIPCTL_TENANT_ID!,
});
// Fire an event — triggers matching sequences automatically
await dripctl.events.create({
eventType: 'user.signup',
userId: '[email protected]',
payload: { plan: 'free' },
});Define Sequences in Code
import { DripCtl, sequence, send, wait, condition, exit } from '@dripctl/sdk';
const onboarding = sequence('trial-nurture', {
trigger: 'user.signup',
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'),
exit('churned'),
],
}),
],
});
// Deploy it
const dripctl = new DripCtl({ apiKey: '...', tenantId: '...' });
await dripctl.sequences.create(onboarding);API
Constructor
const dripctl = new DripCtl({
apiKey: string, // Your API key (dpct_...)
tenantId: string, // Your tenant UUID
baseUrl?: string, // Default: 'https://api.dripctl.dev'
timeout?: number, // Request timeout in ms (default: 10000)
retry?: {
maxRetries?: number, // Default: 2
backoff?: number, // Base delay in ms (default: 500)
},
});Events
// Trigger matching sequences
await dripctl.events.create({
eventType: 'user.signup',
userId: '[email protected]',
payload: { plan: 'free' },
priority: 'high', // 'low' | 'medium' | 'high' | 'critical'
});Sequences
await dripctl.sequences.create({ name, trigger, definition });
await dripctl.sequences.get(id);
await dripctl.sequences.list();
await dripctl.sequences.update(id, updates);
await dripctl.sequences.delete(id);
await dripctl.sequences.findByTrigger('user.signup');Users
await dripctl.users.create({ email: '[email protected]', properties: { plan: 'free' } });
await dripctl.users.upsert({ email: '[email protected]', properties: { plan: 'pro' } });
await dripctl.users.get(id);
await dripctl.users.list();
await dripctl.users.update(id, updates);
await dripctl.users.delete(id);Runs
const run = await dripctl.runs.get(runId);
const status = await dripctl.runs.getStatus(runId);
// { status: 'running', currentStepIndex: 2, stepsCompleted: 1 }Tenants
const tenant = await dripctl.tenants.get();Builder Functions
Pure helper functions that produce typed data structures — they don't call the API.
import { sequence, send, wait, condition, exit } from '@dripctl/sdk';
send('welcome', { template: 'welcome-v2' })
wait('3 days')
condition('user.activated', { yes: [...], no: [...] })
exit('churned')
sequence('name', { trigger: 'event.type', steps: [...] })Error Handling
import { DripCtlError } from '@dripctl/sdk';
try {
await dripctl.events.create({ eventType: 'test' });
} catch (err) {
if (err instanceof DripCtlError) {
console.log(err.statusCode); // 429
console.log(err.message); // 'Rate limited'
console.log(err.requestId); // For support
}
}The SDK automatically retries on 429 and 5xx errors with exponential backoff.
Requirements
- Node.js 18+ (uses native
fetch) - Also works in Bun, Deno, and edge runtimes (Vercel, Cloudflare Workers)
- Zero runtime dependencies
Links
License
MIT
