Webhooks: every signature, sent where you need it
A webhook is a message SignMaster sends to an address you choose the moment something happens to an envelope. Point it at Zapier, Make, n8n or your own server, and each signed contract arrives there with everything the signer filled in, without anyone copying it over.
Updated November 5, 2026 · 3 min read
On this page
What you can listen for
| Event | Sent when |
|---|---|
| envelope.sent | An envelope goes out to its signers, from the app, a bulk send, a public link or the API. |
| recipient.viewed | A signer opens their signing link. |
| recipient.completed | One signer finishes. Carries the fields they filled in. |
| envelope.completed | The last signer finishes. Carries every field and a link to the signed PDF. |
| envelope.declined | A signer declines to sign. |
| envelope.voided | You void the envelope. |
| envelope.expired | The signing links expire before everyone signs. |
Each endpoint picks the events it wants, so a Slack alert can listen only for envelope.completed while your CRM hears about every view.
Set it up
- 1
Get an address to send to
In Zapier, add a Webhooks by Zapier trigger and choose Catch Hook; Make and n8n have their own webhook triggers. Copy the URL they give you, or use an https:// address on your own server.
- 2
Add the endpoint
In SignMaster, open Settings › Developers › Webhooks, paste the URL, describe it and tick the events you want.
- 3
Keep the signing secret
SignMaster shows the endpoint's secret once, when you create it. Store it where your code can read it; you can roll a new one at any time.
- 4
Send a test
A test sends a webhook.test message with sample data straight away and shows the status code your endpoint answered with, so you can map fields before a real contract is signed.
What arrives
Every message is JSON with an id starting evt_, a type, created_at and api_version, and a data object built when it's sent, so it always holds the latest details:
- data.envelope: its id, title, status, template_id, bulk_send_id, sent_at and completed_at.
- data.recipients: each person's id, name, email, role, type, status and completed_at. Events about one signer add data.recipient.
- data.fields and data.fields_by_label: on recipient.completed and envelope.completed, every field with its label, type and value, and whether the signer or the sender filled it in.
- data.signed_pdf: on envelope.completed, a link to the signed PDF that works for a day, with its SHA-256 fingerprint.
Map by label
In no-code tools, map from data.fields_by_label. A text box labeled Contract price arrives under that name, so the same Zap works for every contract made from the template.
Signature images are never sent. A file a signer uploaded arrives as its name and a short-lived link.
Check that it came from SignMaster
Each request carries SignMaster-Event-Id, SignMaster-Event-Type and SignMaster-Signature headers. The signature reads t= a Unix timestamp, then v1= a hex HMAC-SHA256 of the timestamp, a dot and the raw request body, keyed with your secret. Compute the same value, compare, and reject old timestamps. Store the event id too: if a message ever arrives twice, you'll know to skip it.
Retries and failures
Any 2xx response counts as delivered. Anything else counts as a failure, including a redirect or no answer within 5 seconds, and SignMaster tries again after 1 minute, 5 minutes, 30 minutes, 2 hours, 6 hours and 24 hours. A message that fails a seventh time is marked dead. The delivery log lists each message with its status, and you can retry one from there.
If an endpoint fails 20 times in a row and hasn't succeeded for 24 hours, SignMaster pauses it and emails the person who created it, so a broken URL doesn't fail quietly for weeks. Fix it and switch it back on.
Which plans include webhooks
Webhooks come with the REST API on Crew and Company. Crew is $49 a month for 5 people, and new workspaces try it free for 14 days. Compare plans.
Questions? Answers.
Do I need to write code to use webhooks?
No. Zapier, Make and n8n each give you a URL to paste into SignMaster, and you map the fields in their editors. Code is only needed if the messages go to your own server.
Can I send signed contracts to Google Sheets or my CRM?
Yes, through webhooks: catch them in Zapier, Make or n8n, then add a step that writes a row or updates a contact. See Zapier and Google Sheets.
What happens if my server is down?
SignMaster keeps retrying for about a day and a half. Nothing is lost while it does, and each message is built when it's sent, so it carries the envelope's latest details.
Is the signed PDF in the message?
A link to it is, on envelope.completed. The link works for a day, so download the file in your workflow rather than storing the link.
