35 typed entities across 9 domains — one graph
import { $ } from '@headlessly/sdk'
$.Deal.closed(async (deal, $) => {
await $.Subscription.create({ plan: 'pro', customer: deal.contact })
await $.Campaign.create({ name: `Onboard ${deal.name}`, type: 'Email' })
await $.Ticket.create({ subject: `Welcome ${deal.name}`, requester: deal.contact })
})Stop stitching together 15 API keys, 15 webhook endpoints, and hundreds of lines of glue code.
Your agent spends more time on glue code than on the work that matters. There's a better architecture.
The Old Way: Integration Hell
With headless.ly: One Typed Graph
# The old way: 15 API keys
STRIPE_KEY=sk_live_...
HUBSPOT_KEY=pat-na1-...
SENDGRID_KEY=SG.abc123...
ZENDESK_KEY=zd_...
MIXPANEL_TOKEN=mp_...
// 15 webhook endpoints, 15 auth flows
app.post('/webhooks/stripe', handleStripe)
app.post('/webhooks/hubspot', handleHubspot)
app.post('/webhooks/zendesk', handleZendesk)
app.post('/webhooks/sendgrid', handleSendgrid)import { $ } from '@headlessly/sdk'
// Every domain. One import.
$.Deal.closed(async (deal, $) => {
await $.Subscription.create({
plan: 'pro',
customer: deal.contact,
})
await $.Campaign.create({
name: `Onboard ${deal.name}`,
type: 'Email',
})
await $.Ticket.create({
subject: `Welcome ${deal.name}`,
requester: deal.contact,
})
})import { Noun } from 'digital-objects'
export const Contact = Noun('Contact', {
name: 'string!',
email: 'string?#',
stage: 'Lead | Qualified | Customer | Churned | Partner',
company: '-> Company.contacts',
deals: '<- Deal.contact[]',
qualify: 'Qualified',
capture: 'Captured',
assign: 'Assigned',
})CRM, billing, support, projects, marketing, analytics, experiments, and platform automation — one install.