Webhooks
Webhooks push Dealops events to your systems as they happen, so you don't have to poll for changes. When a quote is signed, an approval is decided, or an opportunity syncs from your CRM, Dealops sends a signed HTTPS POST to an endpoint you register.
How it works
Something happens in Dealops
└─► matching endpoints selected
└─► signed HTTPS POST to your URL
└─► your 2xx ──► done
non-2xx ──► retried with backoff
Each endpoint has its own URL, its own set of subscribed event types, and its own signing secret. You can register several — for example one for billing events and one for a data warehouse — and each is delivered to independently.
Registering an endpoint
Endpoints can be managed from Dealops settings, or through the API:
curl -X POST https://api.dealops.com/external/v1/webhook-configs \
-H "x-api-key: $DEALOPS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Billing sync",
"url": "https://hooks.example.com/dealops",
"eventTypes": ["quote.signed", "quote.crm_submitted"]
}'
The response includes a signingSecret — the only time it is ever returned. Store it before you close the connection; if you lose it, rotate to get a new one. Use it to verify every delivery.
Your URL must be HTTPS, and must resolve to a public address — private, loopback, and link-local ranges are rejected, both when you register and again at delivery time. A localhost tunnel from a development machine works only if it has a real public hostname.
See the API reference for the full set of endpoint-management routes: list, update, delete, rotate the secret, and inspect recent deliveries.
Events you can subscribe to
| Event type | Fires when |
|---|---|
quote.created | A new pricing quote was created. |
quote.updated | A pricing quote was updated. |
quote.exported | A quote document was exported. |
quote.approval_submitted | A quote was submitted for approval. |
quote.approval_decided | An approver approved or rejected a quote. |
quote.approval_recalled | The submitter recalled an in-flight approval. |
quote.crm_submitted | A quote was written back to the CRM. |
quote.deleted | A pricing quote was deleted. |
quote.signature_requested | A signature envelope was sent for a quote. |
quote.signed | All signers completed the envelope. |
quote.signature_declined | A signer declined the envelope. |
quote.signature_voided | An envelope was voided before completion. |
quote.primary_set | The primary quote on an opportunity changed. |
opportunity.created | A new opportunity was created in Dealops. |
opportunity.updated | An opportunity was updated. |
opportunity.deleted | An opportunity was deleted. |
opportunity.refreshed | An opportunity was refreshed from the CRM. |
opportunity.crm_pushed | Dealops pushed opportunity updates back to the CRM. |
quote_proposal.created | A quote proposal was created. |
quote_proposal.quotes_changed | The quote membership on a proposal changed. |
quote_proposal.archived | A quote proposal was archived. |
quote_proposal.unarchived | A quote proposal was un-archived. |
Subscribing to an event type that isn't on this list is rejected at registration. Subscribe only to what you act on — every extra type is traffic your endpoint has to absorb and acknowledge.
Next steps
- Verifying deliveries — the headers, the payload envelope, and the signature check you should run before trusting a request.
- Delivery and retries — what happens when your endpoint is down, how to stay idempotent, and how endpoints get disabled.