Docs

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:

  1. 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.
  2. In MRRdue, open Settings → External integrations and paste that URL into the outreach endpoint field. Save.
  3. 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.
  4. 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-signaturev1=<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:

eventTypeFires whenRequires
failed_payment.outreach.requestedA 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.openedA new failed-payment case is created.Starter and above (event webhooks toggle)
failed_payment.case.recoveredA case's status changes to recovered.Starter and above (event webhooks toggle)
customer.card.expiringA synced card's expiry date falls inside the alert window.Starter and above (event webhooks toggle)
outreach.testYou 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

  1. 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.
  2. Send a test event from MRRdue's settings page so Zapier has a sample payload to build the rest of the Zap from.
  3. (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 };
    Map inputData.timestamp/signature from the x-mrrdue-timestamp/x-mrrdue-signature headers Catch Hook exposes, rawBody from the raw request body, and secret from a Zapier Storage value you set to your MRRdue signing secret (never hardcode it in the Zap).
  4. Add whatever action you want next — a few common ones: Slack → Send Channel Message posting message.subject and links.caseUrl to a #recovery channel; Google Sheets → Create Row logging every failed_payment.case.openedfor a running log; or your own email tool's “send email” action fed by message.subject / message.body / customer.email.

4. Make (formerly Integromat) recipe

  1. Create a scenario. Add Webhooks → Custom webhook as the first module, click Add, and copy the generated URL into MRRdue's outreach endpoint field.
  2. 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.
  3. (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.
  4. Route the verified event with a Router on eventType: send failed_payment.case.opened to a Slack → Create a Message module, log failed_payment.case.recovered to Google Sheets → Add a Row for a recovered-revenue tracker, and hand failed_payment.outreach.requested to your own email-sending module using message.subject/message.body.

5. n8n recipe

  1. 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.
  2. 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.
  3. 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 on case.opened, and an HTTP Request to your own transactional email API on outreach.requested, passing through message.subject/message.body and customer.email.
  4. 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 eventType field to branch, not separate URLs.
  • Rotating the signing secret in settings immediately invalidates the old one — update your automation in the same sitting.