Like having a well-stocked toolbox and clear blueprints - everything you need to build something amazing
CodeCrafters, a Boulder dev agency, learned this the hard way.
"Client wanted 'simple user onboarding.' We quoted 2 weeks. Six months later, we had spent $180K in developer time building user flows, email automation, analytics dashboards, and journey tracking. It worked, but barely. Every new feature request was a week of development."
The brutal truth: Building from scratch = 6+ months, custom code = endless bugs, analytics = another 2 months, maintenance = ongoing developer tax forever.
"We spent 8 months building user onboarding. Could have built 3 core features instead. Worst part? Our DIY solution was clunky compared to what we could have had on day one."
– Alex Chen, CTO of PeakPerformance
RESTful endpoints that make sense with JSON:API compliance and TypeScript definitions included.
Create users and start onboarding in 3 lines of code with comprehensive docs and runnable examples.
99.9% uptime SLA with multi-region deployment, auto-scaling, and reliable webhook delivery.
const api = new OnboardingAPI({
apiKey: 'your-api-key',
authToken: 'jwt-token'
});const onboarding = await api.createOnboarding({
name: 'Developer Onboarding',
steps: [
{ name: 'Verify Email', required: true },
{ name: 'Generate API Key', required: true },
{ name: 'Make First Call', required: true }
]
});// User registers
const user = await api.registerUser(userId, userData);
// Start their journey
const journey = await api.startOnboarding(user.id, onboarding.id);
// Track progress
const progress = await api.getJourneyStatus(journey.id);{
"data": {
"id": "123",
"type": "user_journey",
"attributes": {
"status": "active",
"current_step": 3,
"completion_percentage": 60
},
"relationships": {
"user": { "data": { "type": "user", "id": "456" } },
"onboarding": { "data": { "type": "onboarding", "id": "789" } }
}
}
}try {
const result = await api.startOnboarding(userId, flowId);
} catch (error) {
if (error.code === 'USER_NOT_FOUND') {
// Handle missing user
} else if (error.code === 'FLOW_INACTIVE') {
// Handle inactive flow
}
}// Get notified of journey events
app.post('/webhooks/onboarding', (req, res) => {
const { event, data } = req.body;
if (event === 'journey.step.completed') {
// User completed a step
unlockFeature(data.user_id, data.step_name);
}
});// Track custom events
await api.logJourneyEvent(journeyId, {
event: 'feature_discovered',
metadata: { feature: 'advanced_search' }
});// Efficient bulk operations
const results = await api.batchUpdateUsers([
{ id: 'user1', data: { role: 'admin' } },
{ id: 'user2', data: { role: 'user' } }
]);// Node.js
npm install @23blocks/onboarding-api
// Python
pip install blocks-onboarding
// Ruby
gem install blocks-onboarding
// Go
go get github.com/23blocks/onboarding-goStop building infrastructure and start building features. Join developers who ship faster with our API-first platform.
P.S. Our API documentation is more comprehensive than the trail maps at Chautauqua Park. And significantly less likely to lead you off a cliff.
P.P.S. We process 2.4M API calls daily with 99.97% success rate. That's more reliable than the shuttle service between Boulder and Denver, and twice as fast.
Get product updates, engineering posts, and new block announcements delivered to your inbox.