Integration guide
Automate MRRdue with Zapier, Make, or n8n
MRRdue can POST a signed JSON event to any URL you point it at — a recovery email being handed off, a case opening or getting recovered, a card about to expire. Catch that webhook in Zapier, Make, or n8n and route it anywhere: Slack, a spreadsheet, your CRM, your own send tool.
1. Get a webhook URL and point MRRdue at it
Every recipe below starts the same way, regardless of which tool you use:
- In Zapier, Make, or n8n, create a new automation and add its native webhook-catching trigger (see the platform-specific steps further down). Copy the unique URL it gives you.
- In MRRdue, open Settings → External integrations and paste that URL into the outreach endpoint field. Save.
- Click Test endpoint. MRRdue sends a signed
outreach.testpayload; your automation should catch it immediately — use it to confirm the fields before wiring up real logic. - Turn on Event webhooks in the same panel if you also want case-opened / case-recovered / card- expiring notifications, not just outreach handoffs.
2. What you receive
Every request is a POST with a JSON body and three headers your automation can use to verify it really came from MRRdue:
x-mrrdue-event-id— unique per event; use it to de-duplicate if your automation ever fires twice for the same event.x-mrrdue-timestamp— ISO time the request was signed.x-mrrdue-signature—v1=<hex>, an HMAC-SHA256 of{timestamp}.{raw body}keyed with the signing secret shown once in settings when you save or reset the endpoint.
The event types you'll see:
| eventType | Fires when | Requires |
|---|---|---|
failed_payment.outreach.requested | A recovery email is handed off — either you clicked “Send via my delivery system” on a case, or auto-dispatch queued one. | Any workspace with an outreach endpoint configured |
failed_payment.case.opened | A new failed-payment case is created. | Starter and above (event webhooks toggle) |
failed_payment.case.recovered | A case's status changes to recovered. | Starter and above (event webhooks toggle) |
customer.card.expiring | A synced card's expiry date falls inside the alert window. | Starter and above (event webhooks toggle) |
outreach.test | You click “Test endpoint” in settings. | Any workspace with an outreach endpoint configured |
The outreach payload includes customer, invoice, risk, and a message object with the drafted subject/body so your automation can send it through your own tool without calling MRRdue again. Every event includes links.caseUrl, a direct link back to the case in your dashboard.
Respond 200 with { "accepted": true }once you've handled the event. For outreach handoffs specifically, a non-2xx response (or { "accepted": false }) tells MRRdue the send didn't go through; 5xx/429/408 responses get retried with backoff, everything else is treated as final.
3. Zapier recipe
- Create a Zap. For the trigger, use Webhooks by Zapier → Catch Hookand copy the custom URL it generates — that's the URL you paste into MRRdue.
- Send a test event from MRRdue's settings page so Zapier has a sample payload to build the rest of the Zap from.
- (Recommended) Add a Code by Zapier step right after the trigger to verify the signature before doing anything else:
const crypto = require('crypto'); const { timestamp, signature, rawBody, secret } = inputData; const expected = 'v1=' + crypto .createHmac('sha256', secret) .update(`${timestamp}.${rawBody}`) .digest('hex'); if (expected !== signature) throw new Error('Bad signature'); output = { verified: true };MapinputData.timestamp/signaturefrom thex-mrrdue-timestamp/x-mrrdue-signatureheaders Catch Hook exposes,rawBodyfrom the raw request body, andsecretfrom a Zapier Storage value you set to your MRRdue signing secret (never hardcode it in the Zap). - Add whatever action you want next — a few common ones: Slack → Send Channel Message posting
message.subjectandlinks.caseUrlto a #recovery channel; Google Sheets → Create Row logging everyfailed_payment.case.openedfor a running log; or your own email tool's “send email” action fed bymessage.subject/message.body/customer.email.
4. Make (formerly Integromat) recipe
- Create a scenario. Add Webhooks → Custom webhook as the first module, click Add, and copy the generated URL into MRRdue's outreach endpoint field.
- Run the scenario once and trigger MRRdue's “Test endpoint” button — Make will capture the sample payload and let you map fields visually in every module after this one.
- (Recommended) Add a Tools → Run a function (or a Custom Function under Functions) to verify the signature the same way as the Zapier snippet above — Make's custom functions also run on Node.js and support
crypto. Store the signing secret in a Make data store or connection, not inline in the scenario. - Route the verified event with a Router on
eventType: sendfailed_payment.case.openedto a Slack → Create a Message module, logfailed_payment.case.recoveredto Google Sheets → Add a Row for a recovered-revenue tracker, and handfailed_payment.outreach.requestedto your own email-sending module usingmessage.subject/message.body.
5. n8n recipe
- Add a Webhook node, set the method to
POST, and use the production URL it displays as MRRdue's outreach endpoint. n8n gives you the raw body and headers with no extra configuration. - Add a Code node right after it to verify
x-mrrdue-signature— n8n's Code node runs full Node.js, so the same HMAC snippet from the Zapier recipe works with only the input-mapping changed to$input.item.json. Keep the signing secret in an n8n credential or environment variable, not in the node itself. - Use a Switch node on
eventTypeto branch by event, then wire in n8n's native Slack, Google Sheets, HTTP Request, or Email Send nodes — for example, Slack oncase.opened, and an HTTP Request to your own transactional email API onoutreach.requested, passing throughmessage.subject/message.bodyandcustomer.email. - Respond to the webhook explicitly with a Respond to Webhook node returning
{ "accepted": true }once your branch finishes, since n8n's Webhook node doesn't auto-acknowledge the way Zapier/Make do.
Notes
- MRRdue never sends card numbers, bank details, or your connected billing provider's API key through this webhook — only the same case/customer/invoice metadata visible in your dashboard.
- One endpoint serves every event type your workspace has enabled; use the
eventTypefield to branch, not separate URLs. - Rotating the signing secret in settings immediately invalidates the old one — update your automation in the same sitting.