- Workspace webhooks fire on events across your whole workspace. You manage them under Integrations → Webhooks, and they’re what most of this page covers.
- Customer webhooks deliver each lead assigned to one customer to that customer’s own endpoint. See Customer webhooks.
The Webhooks page
Open Webhooks under Integrations in the sidebar. Each row shows the Event, the URL (“Not configured” if it has none), and whether the webhook is Active.

Creating a webhook
Click New webhook and fill in the form.- Event is what triggers the webhook (see Available events). Each webhook listens for one event.
- URL is where the request goes. It must be a public address, since internal and private addresses are rejected.
- Advanced settings (optional) cover Authentication (None, Basic Auth, or Bearer Token), Method (POST, PUT, or GET), Format (JSON or Form), Timeout (3 to 60 seconds, 10 by default), and extra Headers. The defaults suit most CRMs.
- Payload is either the Default payload or a Custom payload (see Payloads).
- Payload version starts on v1 for a new webhook and sets the shape of every request (see Payload versions).


Available events
On the v1 payload version, each request names its event in
type, using the value in the middle column.
Payloads
The Default payload sends every field available for the event in a standard shape. For lead events, that includes all of the lead category’s deliverable fields, and it adapts on its own when you add or remove fields. Pick Custom payload to build your own shape, row by row. Each row has a Key (use dot notation, likecontact.email, to nest values) and a value made of static text, inserted fields, or both. You can also add transformers to a field to reformat its value. Two shortcuts get you started faster.
- Load default mapping fills the builder with the default payload, ready for you to trim or rename.
- Paste JSON takes a sample payload, such as one from your receiver’s docs, and turns it into rows. Values that match an available field become linked fields.
Available fields
The field picker groups what you can insert. Every event has Tenant fields (tenant.id, tenant.name) and the event name, but those only fill in on the Legacy payload version. On v1 they render empty, because the envelope already carries the event type and tenant_id (see Mappings on v1). The rest depends on the event.
- Lead events add Lead (
lead.first_name,lead.email,lead.public_id, and the fields on your lead categories), Buyer (buyer.name,buyer.customer_public_id), Partner, Pricing (price,charged_amount,payout_amount), Assignment, Source, pluslead_typeandlead_category - Customer events add the customer’s details under
customer., such ascustomer.name,customer.email, andcustomer.wallet_balance. Subscription events addsubscription.fields, and User Attached To Customer addsuser.nameanduser.email. - Transaction Updated adds the customer under
customer.and the transaction undertransaction., such astransaction.amountandtransaction.event
{{ lead.email }} becomes a linked field, and so does a bare lead field name like email.
Lead fields
Lead events can include an all lead fields row. It expands to the lead’s deliverable fields when the webhook fires, so new fields show up without editing the webhook. If you’d rather list fields one by one, you can expand the row into individual fields, but that’s a snapshot, so fields added later won’t be included.Public IDs
Leads and customers have stable public IDs that are safe to store in other systems.lead.public_id looks like lead_01arz3ndektsv4rrffq69g5fav, and customer.customer_public_id (or buyer.customer_public_id on lead events) looks like cus_01arz3ndektsv4rrffq69g5fav.
On v1, Juiced’s internal numeric IDs aren’t sent. Each block’s id (such as lead.id, buyer.id, customer.id, and source.id) carries the same value as its public ID, and a lead’s source_id, customer_id, and submission_id carry the public IDs of its source (src_…), customer (cus_…), and submission (subm_…). Lead fields named after other internal ID columns are left out. Legacy keeps sending the internal numeric IDs it always has.
Payload versions
Every workspace webhook and customer webhook sends one of two payload versions. You pick it in the Payload version section of the webhook’s form.
Existing webhooks stay on Legacy and keep receiving exactly what they get today, so nothing changes for your receiver until you switch. v1 is the version to build new receivers against.
The v1 envelope
A v1 request body always has the same six keys.
Here’s a trimmed Lead Assigned body with the default payload.
Mappings on v1
On v1 the envelope is fixed, and the payload you choose fillsdata.
- With the Default payload,
datacarries the full default payload for the event. - With a Custom payload, your mapping shapes
dataand nothing else. You can’t rename or remove the envelope keys. - The
{{ event }}and{{ tenant.* }}fields render empty on v1, because the envelope’stypeandtenant_idalready carry them. On a workspace webhook, Load default mapping addsevent,tenant.id, andtenant.namerows, so delete those on v1 and read the envelope instead.
Switching versions
The Payload version section sits below Payload on the webhook’s form, with a card for Legacy and one for v1. Pick one, and a preview below the cards shows the request your endpoint would receive, built from sample data (on a saved lead webhook, Use a real lead previews one of your leads instead).- When the version you picked differs from the saved one, the preview shows the Current payload next to the payload After save, so you can compare the two before anything changes.
- The Headers list shows the headers the request carries, with credentials hidden.
- When v1 is picked, or you’re switching versions, a note above the payloads sums up what that means for this webhook. It turns amber when saving would change what your endpoint receives, or when your mapping uses
{{ event }}or{{ tenant.* }}fields (it names them, since they’d render empty on v1). - The preview’s
idandcreated_atare samples. Every live event gets its own.
- Your payload now sits under
data, inside the envelope. - The root
tenantblock andeventkey are gone. Readtenant_idandtypeinstead, and note thattypeuses names likelead.assignedwhereeventsent names likeLeadAssigned(LeadAssignedWebhookon customer webhooks). - Numeric IDs become public ID strings like
lead_…andcus_…(see Public IDs), so anything that stores or matches on the old numbers needs updating. - Lead fields titled after an internal ID column, such as an old
state_idfield, aren’t sent. On Legacy they carry Juiced’s internal ID rather than the field’s own value. To send a value of your own, rename the field (see Adding fields to a lead category) and have your sources submit it under the new name.
Handling duplicates
Build your receiver so the same event arriving twice does no harm. On v1, useid to spot repeats, since every automatic retry of an event carries the same id, and so does a replay of the original event. Store the IDs you’ve processed, and skip any event whose id you’ve already seen. Legacy requests have no event ID.
Testing a webhook
Once a webhook exists, its edit page has a Testing section. Pick what to send.- Test with a real lead searches your leads and sends exactly what that lead would produce.
- Generate sample data fills every mapped field with realistic but fake values.
- Add test data manually lets you type the values yourself.


Deliveries
Click a webhook in the list, or Overview on its edit page, to see how it’s doing. The title shows whether it’s Active or Paused, and the header has Pause webhook (or Enable webhook) and Edit.

- Stats show Total deliveries, Success rate, Failed, Average duration, and Last delivery.
- Details list the Endpoint, Method, Format, and Trigger.
- Deliveries are split into Live and Tests, with Filters for the result and delivery date. Each row shows when it was sent, the lead (for lead events), the result with its response code and duration, and the delivery ID.
Replaying deliveries
Once your receiver is back on its feet, replay what it missed. A panel above the delivery history shows how far back you can go. Deliveries can be replayed for 90 days, or 180 days if they failed or needed a retry. Older ones have been removed. To replay one delivery, click Replay on its row, or open it and click Replay at the bottom. Juiced queues the replay, and it appears in the history as a new delivery once it’s sent. The original stays as it was. The note beside the button in the open delivery tells you which kind of replay you’ll get. Either kind is sent with the webhook’s current URL, method, format, authentication, and headers, so fix a wrong URL or expired credentials first and the replay picks it up.- The original event goes out again when the webhook is on v1 and the delivery is a v1 delivery whose data Juiced kept. Your receiver gets the same
id,created_at,type, anddataas the first time, so it can spot the repeat, and a failed replay is retried like any other v1 delivery. - A new event built from the lead’s current data goes out otherwise. That covers Legacy webhooks, v1 deliveries sent before replay existed, and deliveries sent while the webhook was on Legacy. It goes out as a single delivery with no scheduled retries and, on v1, a new
id. This kind needs a lead behind the delivery, so a delivery for any other event can only be replayed as the original event.
- The dates are when each event was first sent, so replaying an outage finds every event from it however many times some have been replayed since.
- Only the latest delivery of each event is replayed, and only once it has finished. The status you pick applies to that latest delivery, so Failed skips an event whose last replay succeeded.
- Replays go out at 5 per second, so your receiver isn’t flooded.
- A bulk replay that matches more than 1,000 deliveries is refused, with the count, so you can narrow the dates or status.
- Each webhook runs one bulk replay at a time, and Bulk replay stays disabled until the current one finishes.
- Queueing means Juiced is still creating the replays.
- Sending means the replays are going out. On v1, retries can keep a bulk replay here for hours.
- Finished means every replay is done. The badge is Finished instead when some of them failed.
- Stalled means Juiced gave up creating the replays after an hour, so some were never queued. It doesn’t block a new bulk replay.
Reliability
- Automatic retries kick in when your endpoint returns a server error (5xx), or the connection fails before the request is sent. Juiced tries again, for up to 3 attempts in total. Client errors (4xx) and timeouts after the request was sent aren’t retried, so your receiver never gets the same event twice by accident.
- Timeouts follow the webhook’s Timeout setting, which is how long each request waits for a response.
- Isolation means each webhook is delivered on its own, so a failing endpoint doesn’t hold up the others.
Customer webhooks
Customer webhooks send each lead assigned to a customer straight to that customer’s endpoint, such as their CRM. You can set them up from the customer’s Webhooks tab (see Customers), and customers can manage their own from their portal (see Webhooks in the customer portal). They use the same form, payload builder, payload versions, testing, and deliveries view as workspace webhooks. On v1, theirtype is always lead.assigned.
Related guides
Sending events to your webhook
Create a webhook, pick an event, shape the payload, and test the delivery.

