Alerts & automation
n8n workflows for Microsoft Bookings
n8n suits teams that want bookings to reach internal systems, often self-hosted, with full control over each step. BookingsXP sends a signed JSON webhook for every confirmed widget booking, and n8n's Webhook node can receive it, verify it and pass it on.
- Plan
- Plan: ProNeeds Pro ($19 a month) or Business ($49 a month).
- In short
- Trigger an n8n workflow from the Webhook node, with room to verify the HMAC signature before anything else runs.
- Microsoft Bookings
- Stays your system of record. Bookings land in Outlook and Teams and Microsoft sends the invites and reminders.
How it works
What happens with n8n
- n8n's Webhook node exposes a test URL and a production URL. The test URL only listens while you click "Listen for test event"; the production URL works while the workflow is active.
- BookingsXP posts the booking.created envelope with a BookingsXP-Signature header (t=…,v1=…).
- With the Webhook node's Raw Body option on, you can compute HMAC-SHA256 over "<t>.<raw body>" with the Crypto node and compare it with v1 before continuing.
Setup
Set up n8n
Step 1: Turn on Store bookings
Dashboard → widget → Data & access → "Store bookings in BookingsXP".
Step 2: Add a Webhook node
HTTP Method: POST. Path: something unguessable, such as bookingsxp-7f3a. Respond: Immediately. Under Options, add Raw Body if you plan to verify signatures.
Step 3: Add the production URL to BookingsXP
Dashboard → Integrations → Add an endpoint → Webhook (JSON). Paste the Production URL, not the test URL, and copy the signing secret shown after saving. Activate the workflow.
Step 4: Verify the signature
Split the header into t and v1, use a Crypto node (Action: Hmac, Type: SHA256, Secret: your whsec_ secret) on the string t + "." + raw body, and add an If node that stops when the result differs from v1.
Code node alternative // Mode: Run Once for All Items (self-hosted: allow the crypto module) const crypto = require("crypto"); const item = $input.first(); const header = item.json.headers["bookingsxp-signature"]; const { t, v1 } = Object.fromEntries(header.split(",").map((p) => p.split("="))); const raw = Buffer.from(item.binary.data.data, "base64").toString("utf8"); const mac = crypto.createHmac("sha256", $env.BXP_SECRET).update(t + "." + raw).digest("hex"); if (mac !== v1) throw new Error("Bad BookingsXP signature"); return [{ json: JSON.parse(raw) }];Step 5: Continue with your nodes
Add a Switch on type (booking.created, booking.failed) and route to your CRM, database, email or chat nodes.
Outcomes and caveats
What you get
The result
- Booking data in self-hosted systems without a third-party automation cloud in between, if you self-host n8n.
- Signature verification inside the workflow.
- Attribution, answers and the BXP reference for every booking.
Good to know
Limits and caveats
- BookingsXP Pro is needed for webhooks.
- A self-hosted n8n must be reachable from the internet over a public address. BookingsXP refuses private and local network URLs.
- The test URL stops listening after one event; use the production URL for real traffic.
- How n8n exposes the raw body can differ between versions; check the node's output before relying on the Code node example.
FAQ
n8n questions
Start free, no card
Start on Free with the widget and GA4 events, then move to Pro when you want ad conversions, webhooks and chat alerts.