Use Make to add a row to Google Sheets when an enquiry is created in Arbour. The webhook supplies the enquiry ID; an API request fetches its details. Set up the Arbour side in Settings → Integrations.
Open integrationsBefore you start
You need permission to Manage outbound webhooks and Manage API keys, a Make account, and a Google account that can edit your spreadsheet. Create an API key named for this scenario and save it securely.
Create a spreadsheet with these headings in row 1, in this order: Enquiry ID, Name, Stage, Event date, Created at. Use a separate test sheet and fictional enquiry details while building.
Keep the webhook URL private
This visual recipe does not verify Arbour signatures. Anyone with the URL can submit requests to it. Restrict access to the scenario and save the API key in Make's keychain. The key has full organisation access. See advanced security below before using this with sensitive records.
Connect Arbour
- 01
Create a Make scenario. Add Webhooks → Custom webhook, then add a webhook named Arbour enquiries. Leave API key authentication unset: Arbour cannot send Make's required
x-make-apikeyheader. Save and copy the generated HTTPS URL. - 02
In Arbour, press Add endpoint. Name it Make enquiries, paste the URL and subscribe only to
pipeline_item.created. Press Create endpoint and save the signing secret separately from the API key. - 03
Keep Make's default webhook acknowledgement. Do not add a response module that waits for the spreadsheet action: Arbour needs a 2xx within ten seconds.
Make's webhook module documentation covers the receiver settings. The default response acknowledges receipt before the later modules finish.
Test receipt
- 01
In Make, choose Run once. In Arbour, open the endpoint and press Send test ping. Check that Make receives it. A ping has empty
data, contains no enquiry ID and creates no Arbour delivery-log entry. - 02
Open the Make webhook settings and choose Detect new values. Create a new enquiry in Arbour using fictional details. Let Make detect that real event, then run the scenario once more with another test enquiry if needed to retain a run for mapping.
- 03
Inspect the webhook output. Confirm the outer
typeispipeline_item.created,data.typeisenquiry, anddata.pipelineItemIdis present. Do not map fields from the ping sample.
These fictional JSON examples show the two payloads. Their placeholder IDs cannot fetch a record.
Ping
{
"version": 1,
"type": "ping",
"occurredAt": "2026-09-06T00:00:00.000Z",
"organizationId": "org_example",
"subject": null,
"data": {}
}
New enquiry
{
"version": 1,
"type": "pipeline_item.created",
"occurredAt": "2026-09-06T00:00:00.000Z",
"organizationId": "org_example",
"subject": { "type": "pipeline_item", "id": "pli_example" },
"data": {
"pipelineItemId": "pli_example",
"type": "enquiry",
"stageId": "stg_example",
"formId": null,
"formSubmissionId": null,
"formSource": null
}
}
Build the automation
The route is Custom webhook → HTTP request → Search Rows → Add a Row, with a filter before the HTTP request and another before adding a row.
Fetch the enquiry
- 01
Add HTTP → Make a request, using the current HTTP app with keychain credentials. Set a filter on the connection leading into it. Require both conditions with AND: webhook
typeequalspipeline_item.created, and webhookdata.typeequalsenquiry. This stops pings and newly created bookings before the API request. - 02
Set the method to GET. Enter
https://api.usearbour.com/v1/pipeline-items/in the URL and append the webhook's mappeddata.pipelineItemIdvalue. Keep the host fixed; do not map a URL from the incoming request. - 03
Choose API key authentication and create a keychain. Give it a recognisable name, set its key to
Bearerfollowed by your completearb_...key, place it in the header and set the parameter name toAuthorization. Do not addX-Arbour-Org: the API key already identifies your organisation. Leave the request body empty. - 04
Enable Parse response and stop on failed HTTP requests. Disable redirects. Save the module, then replay your captured enquiry using the dropdown beside Run once. Inspect the parsed response so its fields become available to map.
See Make's HTTP module and API key keychain settings. The API returns the enquiry's current state, which may have changed since the event. Its response contains id, displayName, stage.name, startDate and createdAt.
Check for an existing row
- 01
Add Google Sheets → Search Rows and connect your Google account. Select the test spreadsheet and sheet, with row 1 as headings. Filter Enquiry ID using text equality against
idfrom the HTTP response. Set the result limit to 1. - 02
Add Google Sheets → Add a Row. On the connection before it, require the search module's Total number of bundles to equal 0, using numeric equality. An existing match stops here and leaves the sheet unchanged.
- 03
Select the same spreadsheet and sheet. Map the fields below from the HTTP response, not the search output. Use raw values for input so names are stored as text rather than interpreted as spreadsheet formulas.
Make documents Google Sheets connections and the search-count filter pattern. Test the empty-sheet case first: it must reach Add a Row with a search count of zero.
| Sheet column | HTTP response value |
|---|---|
| Enquiry ID | id |
| Name | displayName |
| Stage | stage.name |
| Event date | startDate, or an empty string when null |
| Created at | createdAt |
For Event date, use Make's ifempty function with the mapped startDate value first and "" second. Keep both date columns as ISO text for this recipe. See Make's mapping functions and spreadsheet date guidance if you want date arithmetic later.
Turn it on
- 01
Replay the captured enquiry and confirm one row appears. Replay it again after that run finishes. The existing Enquiry ID must stop the second row. Replay the ping too: it must stop before the HTTP request.
- 02
Save the scenario. Set its schedule to Immediately as data arrives and activate it. Keep the same webhook URL in Arbour; Make does not require a separate production URL.
- 03
Create a fresh test enquiry in Arbour. Check the Arbour delivery, the completed Make run and all five spreadsheet columns. Test one enquiry without an event date and confirm the cell stays blank. Create a test booking and confirm it is filtered out.
Make's schedule settings, scenario history and run replay explain where to inspect and replay runs. A replay uses the current scenario and reruns its actions, so retain the Enquiry ID check.
The check reduces duplicates from sequential retries. Concurrent runs can both find no row and add one. Make processes instant webhooks in parallel by default; Process data in order serialises this scenario, but other writers can still race. The sheet is not an exactly-once destination. See Make's webhook processing guidance and Arbour's delivery guidance.
Troubleshoot
| What you see | What to check |
|---|---|
| No sample arrives | Check the copied URL, the enabled Arbour endpoint and its subscription. Start Run once again if the listening session ended, then create a fresh test enquiry. |
| Only ping fields are available | Detect the fields again using a real enquiry. The ping cannot provide data.pipelineItemId. |
| A 410 response | Check that the Make webhook is still attached to the saved scenario. Make expires unattached webhooks after five days. If you replace it, update the Arbour endpoint URL. |
| Requests arrive but nothing runs | Check scenario activation, scheduling and Make's webhook queue. A stopped or disabled scenario is not a completed automation. |
| API request returns 401 | Check the saved API key, its Bearer prefix and whether it was revoked. The webhook signing secret is not an API key. |
| API request returns 404 | Check the mapped ID and the key's organisation. The record may have been deleted before retrieval. Do not add an empty row. |
| API or Sheets returns 429 | Reduce scenario throughput and retry after the service's waiting period. Arbour allows 600 requests per minute per API key. |
| The first row is never added | Check that Search Rows reports a count of zero and the next filter uses numeric equality with zero. Map row values from HTTP, not the empty search result. |
| Duplicate rows | Check the exact Enquiry ID lookup, its filter and concurrent runs. Keep a single writer while testing. |
| Arbour shows delivery, but the sheet is unchanged | Inspect Make's run history for a filter stop or failed module. Check the Google connection, edit access and selected sheet. Fix the fault, then replay the run. |
Arbour delivery means Make accepted the request. It does not mean the API lookup or spreadsheet write succeeded. Arbour does not automatically retry a request Make has already acknowledged. Recover failed later steps in Make and check the sheet before replaying.
Advanced security
The webhook's advanced settings offer Get request headers and JSON pass-through. These expose headers and the original JSON text for a custom verifier. Changing to pass-through changes what later modules receive, so parsing and mapping must happen after verification. These options alone do not check a signature.
Use the Arbour signing reference: HMAC-SHA256 over the timestamp, a full stop and the exact raw body, using the complete whsec_... secret. Compare the v1=<hex> signature safely, check timestamp freshness and deduplicate delivery IDs durably. Confirm byte preservation with a known valid request; parsing and rebuilding JSON is not equivalent. Test altered bodies and stale timestamps too.
If unverified requests must be rejected before Make accepts them, place a verifying HTTPS receiver in front. It verifies and durably queues the event, acknowledges Arbour within ten seconds, then forwards accepted events to the private Make URL. A later Make filter cannot undo an acknowledgement. Building that receiver is separate from this visual guide.