Skip to content
Help
Open Arbour

Integrations

Connect webhooks to n8n

Add new Arbour enquiries to Google Sheets with an n8n workflow.

Updated 6 Sept 2026

Send new enquiries from Arbour to Google Sheets using n8n's Webhook, HTTP Request and Google Sheets nodes. Set up the Arbour endpoint in Settings → Integrations. No native Arbour connector is needed.

Open integrations

Before you start

You need an n8n account or instance, a Google account that can edit the destination spreadsheet, and Arbour's Manage outbound webhooks and Manage API keys permissions. Create an API key for this workflow and keep it ready to save in n8n's credentials.

Create a blank spreadsheet with these headings in row 1: Enquiry ID, Name, Stage, Event date, Created at. Use fictional enquiry details while testing.

If you host n8n yourself, its webhook URL must be publicly reachable over HTTPS with a valid certificate. Arbour cannot deliver to localhost or a private network address. Check the external webhook URL and reverse proxy configuration before connecting.

Worth a look

Keep the receiver URL private

This visual recipe does not verify Arbour signatures. Anyone with the webhook URL could submit a request. Restrict access to the workflow and store your API key in saved credentials. See Advanced security below for signature verification.

Connect Arbour

  1. 01

    Create an n8n workflow and add a Webhook node. Set HTTP Method to POST, Authentication to None and Respond to Immediately. Keep the generated path and default 200 response. Leave Raw Body off for this recipe.

  2. 02

    Copy the node's Test URL. In Arbour, press Add endpoint, label it n8n enquiries, paste that URL and select only pipeline_item.created. Keep Subscribe to all events off.

  3. 03

    Create the endpoint and save its signing secret securely before closing the dialog. The whsec_... secret is for incoming signature verification; it is not your arb_... API key.

Test receipt

  1. 01

    In n8n, press Listen for test event. In Arbour, open the endpoint with Manage, then press Send test ping. Check that n8n receives an item with body.type equal to ping.

  2. 02

    Listen again, then create a new enquiry in Arbour with fictional details. Check that the received item has body.type equal to pipeline_item.created, body.data.type equal to enquiry and a real body.data.pipelineItemId.

The test listener lasts 120 seconds. Start it again before each test if it has stopped. A ping has empty data, provides no enquiry fields and creates no Arbour delivery-log entry. Use the real enquiry sample for the remaining steps. Compare it with the copyable event and ping examples; n8n places that envelope under body.

Build the automation

Connect the nodes in this order: Webhook → Filter → Get enquiry → Find enquiry row → If → Append Row. Only the If node's true output connects to Append Row.

Keep only new enquiries

Add a Filter node after Webhook. Add these two String → is equal to conditions and combine them with AND. Switch each left-hand field to Expression before pasting it.

ExpressionEquals
{{ $json.body.type }}pipeline_item.created
{{ $json.body.data.type ?? '' }}enquiry

Leave case matching strict. Pings and newly created bookings stop here, before any API or spreadsheet requests. See n8n's Filter settings.

Fetch the enquiry

  1. 01

    Add an HTTP Request node after Filter and rename it Get enquiry. Set Method to GET. Switch URL to Expression and paste the expression below.

  2. 02

    Set Authentication to Generic Credential Type, then choose Bearer Auth. Create a saved credential with your full arb_... key in Bearer Token, without adding Bearer yourself. n8n sends Authorization: Bearer arb_....

  3. 03

    Under Options → Response, choose JSON as Response Format. Leave Include Response Headers and Status and Never Error off, so the output is the record and failed requests stop the workflow. Execute the node with the real enquiry sample.

{{ 'https://api.usearbour.com/v1/pipeline-items/' + encodeURIComponent($json.body.data.pipelineItemId) }}

Keep that host fixed. Do not map a URL from the incoming request or add X-Arbour-Org; the API key already identifies your organisation. See n8n's bearer credentials.

The response contains id, displayName, stage.name, startDate and createdAt. It is the record's current state, which may have changed since the event. A missing event date appears as null.

Check for an existing row

  1. 01

    Add a Google Sheets node named Find enquiry row. Connect your Google account, choose Sheet Within Document → Get Row(s) and select your spreadsheet and sheet.

  2. 02

    Under Filters, select Enquiry ID as the column. Set its value to the expression {{ $json.id }}. Keep the default first matching row behaviour.

  3. 03

    On this node's Settings tab, turn on Always Output Data. Keep On Error set to Stop Workflow. An empty search must continue with an empty item; a failed search must stop.

  4. 04

    Add an If node. Use String → is empty with the expression {{ $json['Enquiry ID'] ?? '' }}. Connect only its true output to the next step. A matching row follows false and stops.

Without Always Output Data, an empty search produces no item and the first enquiry never reaches the append step. These settings are described in n8n's node settings.

Add the row

Add another Google Sheets node on the true branch. Choose Sheet Within Document → Append Row, the same spreadsheet and sheet, then Map Each Column Manually. Paste these values in Expression mode. Keep the node name Get enquiry exactly as above.

Under Options → Cell Format, choose Let n8n format. This sends raw values so an enquiry name starting with = stays text instead of becoming a spreadsheet formula. Dates stay as the text returned by Arbour.

Sheet columnExpression
Enquiry ID{{ $('Get enquiry').first().json.id }}
Name{{ $('Get enquiry').first().json.displayName }}
Stage{{ $('Get enquiry').first().json.stage.name }}
Event date{{ $('Get enquiry').first().json.startDate ?? '' }}
Created at{{ $('Get enquiry').first().json.createdAt }}

These expressions read the earlier API response because the row lookup replaces the current item's fields. Each webhook execution handles one event. A missing event date becomes a blank cell. See n8n's Sheets operations for the lookup and append controls.

Execute the workflow with the captured enquiry and check the row. Execute it again with the same sample, including the lookup: it should stop on the false branch without adding a row. Two simultaneous executions can still both find no row and append. This reduces sequential duplicates; it is not an exactly-once guarantee.

Turn it on

  1. 01

    Save and Publish the workflow. Copy the Webhook node's Production URL, then replace the test URL on your Arbour endpoint with it and save.

  2. 02

    Send a ping and confirm it stops at Filter. Create a second fictional enquiry, then open the workflow's Executions tab to check every node and the completed spreadsheet row.

  3. 03

    Confirm an enquiry without an event date leaves that cell blank, and a newly created booking stops at Filter. Check failed executions regularly and configure n8n error notifications for unattended use.

Production requests appear in Executions, not as live samples in the editor. n8n documents the URL and publication behaviour in its Webhook guide and workflow testing guide.

Troubleshoot

Arbour's delivery success means n8n accepted the webhook. With Respond: Immediately, it does not mean the API request or Sheets action finished. Arbour does not automatically retry an accepted request. Inspect and recover later failures in n8n's Executions.

ProblemWhat to check
No test sample or a 404 from n8nPress Listen for test event again and send within 120 seconds. Check POST, the complete test URL and public HTTPS access.
Only ping fields are availableListen again and create a real enquiry. A ping's empty data cannot populate the mapping.
Production stops receivingCheck the workflow is published, the endpoint uses its production URL and Arbour has not disabled the endpoint after repeated failures.
Get enquiry returns 401 or 403Check the saved credential uses the full API key, not the signing secret. Replace a revoked key and check organisation access.
Get enquiry returns 404Check the mapped ID came from a real event in this organisation. If the record was deleted, skip that event rather than adding an empty row.
API or Sheets returns 429Reduce request volume and retry after the service's rate-limit delay. Arbour allows 600 API requests per minute per key.
No first row, but no errorEnable Always Output Data on Find enquiry row and check that only the If node's true output appends.
Sheets fails after a successful deliveryCheck the Google connection, edit access and unchanged column headings. Fix the failing node, then rerun through the lookup before appending.
Duplicate rowsMatch on Enquiry ID, not Name. Check for another workflow writing to the sheet. Concurrent runs can race; use an atomic unique key or upsert destination if duplicates must be prevented.

Advanced security

n8n's Webhook node exposes request headers under headers, including x-arbour-signature, x-arbour-timestamp and x-arbour-delivery. Its Raw Body option is available for workflows that need the original request data. Enabling it changes how you handle the body; the visual recipe above expects parsed JSON.

An advanced verifier must obtain the exact raw bytes before parsing, not rebuild them with JSON.stringify. Follow the shared signing reference: HMAC-SHA256 over the timestamp, a full stop and raw body, using the complete whsec_... secret. Compare the v1=<hex> signature safely, reject stale timestamps and claim the delivery ID durably before processing. Validate raw-body handling against a known signed request in your n8n version.

Verification inside a workflow that has already responded immediately cannot reject receipt to Arbour. For that requirement, place a verifying HTTPS receiver in front of n8n. It verifies and durably queues accepted events, answers within ten seconds, then forwards accepted work to the private production webhook. Building and hosting that receiver is separate from this guide. Keep API keys and signing secrets out of node expressions and execution samples.

Keep reading
  • Integrations

    Webhooks

    Send Arbour events to n8n, Zapier, Make or your own systems, signed and retried.

  • Integrations

    API keys

    Machine credentials for calling the Arbour API from your own systems.

  • Integrations

    Accounting

    Send issued invoices, payments and refunds to Xero or QuickBooks Online.