Webhooks, CRM and Page Builders
Your bookings probably need to reach somewhere else: a CRM, a spreadsheet through Zapier, a Make or n8n workflow, or your own app. Core Bookings has two ways to get them there. Outgoing webhooks send signed events to any HTTPS address, and the Integrations module syncs customers to FluentCRM or MailerPress and adds the booking form to Bricks and Elementor.
Add a Webhook Endpoint
Webhooks are part of the core plugin, so there’s no module to switch on.
- Go to Bookings → Settings → Webhooks and click Add endpoint.
- Give it a Name, paste the Endpoint URL from Zapier, Make, n8n, FluentCRM or your own receiver, tick the Events it should receive, and leave Send events to this endpoint ticked.
- Choose a Payload format: Standard (nested JSON) or Flat (one level of fields). Flat puts fields such as email, first_name and booking_start at the top level, which suits FluentCRM incoming webhooks and simple Zapier steps.
- Click Save endpoint and copy the Signing secret. It’s shown only once.
- Click Send test event. The notice shows the HTTP status your receiver returned.
Addresses must use HTTPS. Private, loopback and reserved network addresses are refused, and redirects are never followed. Your own site’s address is allowed, which covers a FluentCRM incoming webhook on the same install.
Events You Can Send
| Group | Events |
|---|---|
| Bookings | booking.created, booking.confirmed, booking.rescheduled, booking.cancelled, booking.completed, booking.no_show, booking.approved, booking.rejected, booking.expired, booking.intake_received |
| Payments | payment.paid, payment.balance_paid, payment.refunded, payment.partially_refunded, payment.review_required |
| Customers | customer.created, customer.updated, customer.account_linked, customer.account_unlinked |
| Session packs | pack.activated, pack.refunded, pack.expired, pack.payment_review |
| Waitlist | waitlist.joined, waitlist.offered, waitlist.claimed, waitlist.expired, waitlist.cancelled |
The Classes and Memberships modules add attendance and membership events when they’re on. Payloads carry the customer’s name and email, the booking times and payment amounts. They never include private manage links, tokens, phone numbers, notes or intake answers.
Signatures, Retries and the Delivery Log
Requests follow the Standard Webhooks spec, so its libraries verify them with your secret. Each request carries these headers:
webhook-id: evt_... (same on every retry, so you can ignore duplicates)
webhook-timestamp: 1761130000
webhook-signature: v1,<base64 HMAC-SHA256 of id.timestamp.body>
- Any 2xx reply counts as delivered. A 410 Gone reply turns the endpoint off at once.
- Other failures retry after 1 minute, 5 minutes, 30 minutes, 2 hours, 6 hours, 12 hours and 24 hours. After that the delivery is failed and shows on Bookings → Settings → Operations.
- An endpoint that has failed seven attempts in a row over at least three days is turned off, and the site admin gets one email. Fix the receiver, then tick Send events to this endpoint again on its edit form.
- Recent deliveries shows the last 50 attempts with status and response. Resend sends one again with the same event ID.
- Rotate signing secret takes effect immediately, so update your receiver straight away.
Sync Customers to FluentCRM or MailerPress
Switch on Integrations in Bookings → Settings → Modules, then open Bookings → Settings → Integrations. With FluentCRM active:
- Tick Create or update a FluentCRM contact for every confirmed booking, and Include the phone number when the booking has one if you want it.
- Pick the Status for new contacts: Transactional (no marketing consent), Subscribed (only when your form collects marketing consent) or Pending (FluentCRM sends its double opt-in email). Existing contacts keep their status and name.
- Under By booking event, choose tags to add or remove and lists to join for Booked, Rescheduled, Cancelled, Completed, No-show and Refunded. Under By service, when a booking is confirmed, add tags and lists per service.
- Click Save integrations.
Only the email, first and last name, the tags and lists, and optionally the phone number are sent. Booking times, answers, notes and payment details stay on your site. Syncs run in the background after the booking is saved, so a CRM outage never blocks a booking.
MailerPress has no documented interface for other plugins, so its sync stays off until a developer adds a small connector through the core_bookings/mailerpress_sync filter. See Hooks and Filters.
Page Builders and Core Products
- Bricks and Elementor: with the module on, a Core Bookings element (Bricks) and widget (Elementor) appear in the General category. They offer the same options as the booking block. Colors must be plain hex values; global colors are ignored. See Add the Booking Form.
- Core Quotes, Core Portals and Core Support connect through built-in hooks: a booking link from an accepted quote, a client’s bookings in their portal, and booking context on a support ticket. Nothing needs configuring.
Limits
- Up to 20 webhook endpoints per site. Webhooks are fixed-format events, with no conditions or field mapping. For conditions and timing, use a signed webhook action in Automations.
- Events arrive at least once and not always in order. A recurring series sends one event per session.
- The delivery log is kept for 30 days. Site exports never carry endpoints or secrets.
- The hosted demo blocks outgoing requests, so Send test event there reports why nothing was sent. Test against your own receiver on your site.