Integrations
Connects to the tools you already use
Intake API, signed webhooks, Slack notices, Google Calendar sync and spreadsheet links.
API and webhooks
Automate in both directions
Send leads through the API and receive a signed notice on your server, Zapier or Make every time a lead comes in, a call is booked or a sale closes.
Event
Headers
- X-Webhook-Event
- sale.created
- X-Webhook-Delivery
- 3f9a8c10-…
- X-Webhook-Timestamp
- 1791230400
- X-Webhook-Signature
- sha256=
Body
{
"event": "sale.created",
"workspace_id": "6f1c2a4e-…",
"occurred_at": "2026-10-06T09:20:00.000Z",
"data": {
"sale": {
"id": "e7a0…",
"amount": 6000,
"date": "2026-10-06",
"utm_source": "instagram"
},
"lead": {
"id": "9b2e…",
"nombre": "Marta Ruiz",
"email": "marta@ejemplo.com"
},
"closer": {
"slug": "closer_1",
"name": "Nora"
},
"triager": {
"slug": "triager_1",
"name": "Laura"
}
}
}Verify on your server
import crypto from "node:crypto";
// raw = the request body as received (string), before JSON.parse
export function verify(raw, headers, secret) {
const ts = headers["x-webhook-timestamp"];
const expected = "sha256=" + crypto
.createHmac("sha256", secret)
.update(`${ts}.${raw}`)
.digest("hex");
const got = headers["x-webhook-signature"] ?? "";
return got.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(got), Buffer.from(expected));
}A simulation with sample data and the same rules the CRM applies.
Deliveries
If your server fails, the notice comes again
Every delivery is retried after 1, 5, 30, 120 and 720 minutes with the same ID. After about 15 hours without a 2xx answer, it's marked as failed.
Notices in your team's channel
Connect a Slack channel and get a notice for every new lead, booking and sale, with a direct link to the record.
- One-click connection. Authorise the channel from Slack; no URLs or keys to copy.
- Protected credential. The channel URL is stored in a table only the server can access.
Your data, wherever you need it
Live CSV links for Google Sheets or Excel, and export of any table in the CRM.
- Live links. =IMPORTDATA in Google Sheets or Data → From Web in Excel.
- CSV export. Leads, sales, bookings and more, always available.
Up and running in four steps
- 01
Generate the key
In Settings → Integrations. It's shown once and we only keep its hash.
- 02
Send leads
From your site, your forms, Zapier or Make, with a POST to the intake API.
- 03
Pick events
New lead, booking or sale: you decide which notices reach your URL.
- 04
Receive and verify
Every notice arrives signed; you check the signature and process it once.
- Keys we don't keep
- Only their SHA-256 hash is stored; when regenerated, the old one stops working.
- Automatic retries
- After 1, 5, 30, 120 and 720 minutes if your server doesn't answer with a 2xx.
- No duplicate deliveries
- Each event is queued once and keeps its ID across every retry.
- Log and test
- See every delivery with its status and send a test notice whenever you like.
- Live spreadsheets
- =IMPORTDATA in Google Sheets or Data → From Web in Excel.
- Google Calendar per closer
- Each closer connects their account; bookings and cancellations sync.
- Clear limits
- 300 requests per minute per workspace on the intake API.
- Protected credentials
- Slack connections are stored in a table only the server can access.
Integrations
Frequently asked questions
Do I need to code?
No. With Zapier or Make you send leads with an HTTP step and receive webhooks with their webhook trigger. The API is for those who'd rather wire it by hand.
How do I check a notice comes from the CRM?
Compute the HMAC-SHA256 of the timestamp, a dot and the raw body with your signing secret, and compare it with the X-Webhook-Signature header.
What if my server is down?
Delivery is retried for about 15 hours and then marked as failed. You'll see it in the delivery log.
Can I test without real data?
Yes. The test button sends a notice to your URL with the same signature and headers.