Skip to main content
Make (formerly Integromat) drives a bot well once you get past two quirks: its default Accepted reply, and the fact that it must learn your payload shape before you can map fields.

Set up the trigger

1

Add a Custom webhook

Create one, copy the URL, and paste it into your bot’s webhook settings.
2

Teach Make the payload shape

Click Re-determine data structure, then press Verify in your bot settings. Make catches the webhook.verify event and learns the fields.
Until Make has seen a real payload, the mapping panel is empty — you cannot pick response_url or message.text. This step is not optional.
3

Add a Router

Route on event, with routes for webhook.verify and message.created.

Pass verification

On the webhook.verify route, add a Webhook response module:
  • Status: 200
  • Body: {{1.challenge}}
  • Custom headers: none needed
Make often wraps a mapped value in quotes, sending "3f9a8c2e" instead of 3f9a8c2e. We allow exactly one pair of wrapping quotes, so both work. You can also send proper JSON if you like:
with a Content-Type: application/json header — though the content type is ignored either way.

Reply in the same request

For work under 10 seconds, end the route with a Webhook response module:
  • Status: 200
  • Body:
  • Custom headers: Content-Typeapplication/json
Without a Webhook response module, Make replies Accepted the moment the scenario starts. We know that body and block it, so your customer sees nothing at all — no message, no error. If your Make bot is silent, this is why.

Reply later

Anything slower than 10 seconds must confirm first.
1

Confirm

A Webhook response module with Status 200 and an empty Body, placed right after the trigger. The typing dots stay on.
2

Do the work

Anything you like, for up to 45 minutes.
3

POST the answer

Add an HTTP → Make a request module:
  • URL: {{1.response_url}}
  • Method: POST
  • Body type: Raw
  • Content type: JSON (application/json)
  • Request content:
No authorization header — the key lives in the URL.
Always set a mid. Make retries failed modules by default. Without a mid, each retry posts another copy. With one, retries become updates. Building it from {{1.event_id}} keeps it the same across tries.

Send a file

Two modules.
1

Upload

HTTP → Make a request:
  • URL: {{1.response_url}}/files
  • Method: POST
  • Body type: Multipart/form-data
  • Add a field named file, type File, mapped from the earlier module’s file data
  • You can also add a filename text field
Turn on Parse response, and you get file.file_id back.
2

Post the message

HTTP → Make a request:
  • URL: {{1.response_url}}
  • Body type: RawJSON
  • Request content:

Show progress

Several HTTP modules pointing at the same response_url, all sharing one mid:
Then the same mid with "state": "success". One bubble, changing.

Handle button clicks

Clicks hit the same webhook with event set to interaction.button_clicked. Add a Router branch and map:
  • {{1.action_id}} — which action
  • {{1.value}} — your data
  • {{1.message_metadata}} — state you attached when sending
Run Re-determine data structure and click a real button once, or Make will not know these fields exist.

Fixing problems

No Webhook response module, so Make replied Accepted and we blocked it. Add one.
Make has not learned the structure. Click Re-determine data structure, then trigger a real event.
Make sure the scenario is ON, not just open in the editor, and that the reply body maps {{1.challenge}}. The wizard shows what we received.
Make retried, and you have no mid. Add "mid": "reply-{{1.event_id}}".
Usually Body type is not Raw + JSON, so Make sent form data instead. Check the issues list in the reply, or your bot’s delivery log.