Fastest: copy a template
Three common follow-ups, ready to use. Each comes as two Make templates: one schedules the call, one cancels it when the customer acts. Add your API key and the address of the scenario that sends the message.
Trial reminder
Day 6, cancelled on upgrade
Invoice follow-up
Day 7, cancelled on payment
Review request
Day 14, cancelled on refund
Prefer modules? The Webhook Scheduler app for Make adds Schedule, Cancel and Search modules: no headers, no JSON.
Or build it yourself
Scenario 1 runs when your trigger fires (new invoice, new lead, form sent). Its HTTP module schedules a webhook and ends. Nothing runs in Make during the wait, so the wait costs no credits.
Scenario 2 starts with a Custom webhook. When the time comes, Webhook Scheduler calls it with the data you chose, and scenario 2 does the follow-up: email, CRM update, anything.
About ten minutes with Make’s built-in HTTP module. You will build scenario 2 first, because scenario 1 needs its address.
- In Make, create a new scenario. Name it, for example,
Invoice follow-up (runs later). - Add the module Webhooks → Custom webhook.
- Click Add to create a webhook, name it
Resume after delay, and click Save. - Click Copy address to clipboard and keep the address at hand: you paste it in step 3.
- Save the scenario. Leave it off for now.
When it worked: you have an address that starts withhttps://hook.and ends with a long code, for examplehttps://hook.eu1.make.com/k3f9….- In Make, create a new scenario. Name it, for example,
- Create a free account (or sign in).
- Open Dashboard → API keys, name the key
Make, and click Create key. - Copy the key. It starts with
wh_live_and is shown only once.
When it worked: the page shows Copy your key now. Below it, the Make / n8n view repeats the settings of the next step with your key already filled in.Open the scenario that should start the wait, or create a new one for the test. After its trigger, add HTTP → Make a request and fill it in field by field:
HTTP → Make a request
- Authentication type
No authentication- URL
https://webhookscheduler.com/api/v1/schedule- Method
POST- Headers
- Click Add a header, then fill the two fields below.
- Headers → Name
Authorization- Headers → Value
Bearer wh_live_YOUR_KEY, with your key in place ofwh_live_YOUR_KEY. Keep the word Bearer and the space.- Body content type
application/json- Body input method
JSON string- Body content
- The JSON below.
- Parse response
Yes
Body contentjson{ "url": "https://hook.eu1.make.com/YOUR_SCENARIO_2_ADDRESS", "runAt": "{{addMinutes(now; 2)}}", "reference": "invoice:test-123", "body": { "invoiceId": "test-123", "email": "test@example.com" } }url: replace the example with the address you copied in step 1.runAt: two minutes from now, for the test. When you paste it, Make turns{{addMinutes(now; 2)}}into a formula and sends the date in the format the API expects. You switch it to three days in step 7.referenceandbody: test values for now. Scenario 2 receivesbodyas its data.
Different labels in your HTTP module? Any version works: a
POSTwith the header above and this JSON as anapplication/jsonbody.- Open scenario 2 and click Run once. It waits for data.
- In another browser tab, open scenario 1 and click Run once. If your trigger needs an event (a new invoice...), create a test one.
- In scenario 1, click the bubble above the HTTP module and open the output. You will see Status code 201 and, under Data, an
idandstatus: PENDING(Scheduled in the dashboard). - Wait about two minutes. Scenario 2 runs: click the bubble above its Custom webhook and you see
invoiceIdandemail.
When it worked: scenario 2 received the bundle. Make now knows its fields, so in scenario 2’s next modules you can mapinvoiceIdandemailfrom the Custom webhook.Another status code? 401 means the key or header is wrong; 400 means the JSON or the
urlis invalid (the response says which field); 403 is a plan limit (API errors).If scenario 2 stopped waiting before the call arrived, Make keeps the call in the webhook’s queue: click Run once again to process it.
Open Dashboard → Jobs. The top row goes to
hook.eu1.make.com/…(your region may differ) with the status Delivered (SUCCESSin the API). Click it: the attempt shows HTTP 200 and Make’s answer, usuallyAccepted.When it worked: the job is Delivered. Your first delayed Make scenario works.Failed with 410 or 404? The address in
urlis wrong or the webhook was deleted: copy it from scenario 2 again (HTTP 410).In scenario 2, switch the scenario ON (its schedule stays Immediately as data arrives). Then switch scenario 1 on. From now on, every trigger in scenario 1 schedules a call, and scenario 2 runs on its own when the call arrives.
When it worked: both scenarios show ON in your scenario list.In scenario 1, edit the HTTP module’s Body content:
- Replace
{{addMinutes(now; 2)}}with{{addDays(now; 3)}}. - Replace each test value with a field from your trigger: select
test-123(keep the quotes around it), delete it, and pick the invoice ID in the mapping panel. Do the same for the email and for the reference, afterinvoice:.
Map IDs, not free text: a double quote breaks the JSON, and
referenceaccepts letters, digits and: . _ / -only.For a fixed time instead, such as 7:30 tomorrow in the scenario’s time zone, use
{{setHour(setMinute(addDays(now; 1); 30); 7)}}.When it worked: the next real trigger creates a job that Jobs shows as Scheduled (PENDINGin the API), three days ahead.- Replace
In the scenario that handles the payment (or reply, or booking), cancel the call that is still waiting. The cancel templates above do this for you. By hand, two ways:
Option A: with the job id
In scenario 1, save the HTTP module’s Data → id with the invoice (a Data store, your CRM, a sheet). In the payment scenario, add one HTTP module:
HTTP → Make a request · cancel by id
- URL
https://webhookscheduler.com/api/v1/jobs/JOB_ID/cancel, with the stored id mapped in place ofJOB_ID- Method
POST- Headers → Name
Authorization- Headers → Value
Bearer wh_live_YOUR_KEY, with your key in place ofwh_live_YOUR_KEY. Keep the word Bearer and the space.- Body content type
Empty
Option B: with your own reference
No id to store: find the open jobs by reference, keep those that can still be canceled, then cancel each.
1 · HTTP → Make a request · find
- URL
https://webhookscheduler.com/api/v1/jobs- Method
GET- Headers → Name
Authorization- Headers → Value
Bearer wh_live_YOUR_KEY, with your key in place ofwh_live_YOUR_KEY. Keep the word Bearer and the space.- Query parameters
reference=invoice:followed by the mapped invoice ID;state=open- Parse response
Yes
2 · Flow Control → Iterator
- Array
- Data → jobs from module 1
Filter on the link from the Iterator to module 3
- Label
Can be canceled- Condition
- the Iterator’s
status, Equal to,PENDING - Add OR rule
- the Iterator’s
status, Equal to,RETRYING
In short: Status equals
PENDINGorRETRYING. APROCESSINGjob is being sent right now and can’t be canceled, so the filter skips it instead of letting the cancel fail.3 · HTTP → Make a request · cancel
- URL
https://webhookscheduler.com/api/v1/jobs/JOB_ID/cancel, with the Iterator’sidmapped in place ofJOB_ID- Method
POST- Headers → Name
Authorization- Headers → Value
Bearer wh_live_YOUR_KEY, with your key in place ofwh_live_YOUR_KEY. Keep the word Bearer and the space.
When it worked: the cancel module answers 200 withstatus: CANCELED(Canceled in the dashboard), and Jobs shows the webhook as Canceled.A webhook can be canceled while it is Scheduled (
PENDING) or Retrying (RETRYING). A cancel can still cross a delivery that is starting, so let scenario 2 check the invoice is still unpaid before it emails anyone. Every scheduled webhook counts toward your monthly quota, canceled ones included: on Free, 100 a month.
Why not Sleep or a Data Store
The Sleep module in Tools delays a scenario for up to 300 seconds. There is no setting to raise it. Make’s own help page gives the answer for longer waits: split the work into two scenarios, one that records what has to happen and one that does it later. The question is what starts the second scenario on the right day.
The native way is a Data Store and a scheduled scenario. Scenario 1 saves the record with a date such as resumeAt = {{addDays(now; 3)}}. Scenario 2 runs on a schedule, uses Search records to find rows where resumeAt is earlier than {{now}}, processes each one, and deletes it so it does not fire twice. Canceling is easy: delete the row when the customer pays.
It works, and if you already have a daily scenario and the exact hour does not matter, it is a fine choice. The cost is the polling. Make’s help page puts it plainly: a scenario that runs every hour uses 24 credits a day, 720 a month, before it processes anything. Checking every 15 minutes, the shortest interval on the Free plan, is about 2,880 runs a month. The Free plan includes 1,000 credits a month. The follow-up can also be late by up to one polling interval, and if the module that sends it fails, nothing retries it unless you build that too.
The scheduled webhook (this guide) costs no credits while it waits, fires at the exact time, is retried if Make does not answer, and is logged. Stay native if you have a few records and a daily check is precise enough; use a scheduled webhook when each record needs its own time, must be cancelable, or needs proof that it ran.
What the free plan covers
On Free you can schedule up to 7 days ahead, 100 webhooks a month, with 4 retries over ~8 min. That is enough for a 3-day invoice reminder or a 7-day follow-up. For a 14-day trial or a 30-day renewal notice you need a paid plan: up to 365 days ahead, and Pro at $29 a month includes 100,000 webhooks with 10 retries over ~8.5 h. Details on the pricing page.
Building this for clients? See the automation agency page. Using n8n instead? Follow the n8n quickstart. Zapier or Bubble? The same call works from any HTTP step: see no-code automations. Comparing tools? See delayed webhook services compared.
Questions
Can the Make Sleep module wait longer than 5 minutes?
No. Sleep delays a scenario for at most 300 seconds. For longer waits, Make suggests splitting the flow into two scenarios: one that saves what must happen, and one that runs it later.
How do I delay a Make scenario for days?
End the first scenario and start a second one later. Either save the record in a Data Store and run a scheduled scenario that looks for due rows, or have the first scenario schedule an HTTP call to the second scenario’s Custom webhook at the exact date.
Does waiting several days use Make credits?
With the Data Store pattern, yes: the scheduled scenario uses credits every time it runs, even when nothing is due (Make counts 720 credits a month for an hourly scenario). With a scheduled webhook, nothing runs in Make during the wait.
How far ahead can I schedule on the free plan?
Up to 7 days ahead, for 100 webhooks a month. Paid plans schedule up to 365 days ahead.
How do I cancel a scheduled webhook from Make?
Send POST /api/v1/jobs/{id}/cancel from an HTTP module with your Authorization header. If you did not store the id, list the open jobs with GET /api/v1/jobs?reference=your-reference&state=open, then cancel each one through an Iterator, with a filter: Status equals PENDING or RETRYING.
What if my Make webhook is down when the time comes?
The call is retried with exponential backoff (4 retries over ~8 min on Free, 10 retries over ~8.5 h on Pro). Every attempt is logged with its status code, and you get an email if it still fails after the last retry. If Make answers 410, the webhook was deleted or turned off: that is not retried.