Meldet sich ein neuer Kunde an, müssen mehrere Systeme gleichzeitig aufgesetzt werden: ein Account im Identity-System, ein Kundendatensatz im Billing, ein Kontakt im CRM und eine Willkommens-Mail-Sequenz im Marketing-Tool.
Geht auch nur einer dieser Schritte mittendrin schief, hast du am Ende einen halben Kunden: einen User, der sich einloggen kann, aber keinen Billing-Account hat, oder einen CRM-Kontakt, dem niemand etwas berechnen kann. Das per Hand aufzuräumen ist langsam, fehleranfällig und peinlich, sobald der Kunde es merkt.
dataflows betreibt das komplette Onboarding als einen durablen Workflow. Jeder Schritt wird protokolliert. Fällt einer aus, wird er wiederholt. Kann er endgültig nicht erfolgreich sein, rollt der Workflow die vorherigen Schritte zurück – so gibt es nie halb angelegte Kunden.
Der Workflow kann auch auf träge Ereignisse warten, ohne Server-Ressourcen zu blockieren: eine Mail-Bestätigung, ein manuelles Sales-Review oder die erste Zahlung. Tritt das Ereignis ein, macht der Workflow genau dort weiter, wo er stehengeblieben ist.
// Kunden-Onboarding-Workflow
export const onboarding = defineWorkflow({
id: 'customer-onboarding',
trigger: { type: 'webhook', path: '/signup' },
async run({ event, step }) {
const { email, name } = event.body
const account = await step.run('create-account', () =>
identity.createUser({ email })
)
const customer = await step.run('create-billing', () =>
billing.createCustomer({ email, accountId: account.id })
)
await step.run('create-crm-contact', () =>
crm.contacts.create({ name, email, customerId: customer.id })
)
await step.run('send-welcome', () =>
email.send({
to: email,
template: 'welcome',
data: { name }
})
)
return { accountId: account.id, customerId: customer.id }
},
onFailure: ({ step, context }) => step.run('rollback', () =>
cleanup.undo(context)
)
})