➤ Product: OfficeRnD Flex
➤ Who: Admins with access to Developer Tools
➤ Where: Admin Portal, under Settings > Data & Extensibility > Developer Tools
➤ Availability: Scale plan includes webhooks. Grow plan has webhooks as a paid add-on. Start plan does not include webhooks.
Webhooks (also called a web callback or HTTP push API) let you send real-time updates from OfficeRnD to external systems.
To keep a CRM or an accounting system current with Flex, you must poll the API on a timer. Between 2 polls, the other system shows data that is already out of date. A webhook removes that delay. Flex sends an HTTP POST to a URL you own when the event happens.
Each webhook endpoint carries its own list of events. You choose which events Flex sends.
In this article:
Review what Flex sends in each request.
Find the event name you need.
Send Growth Hub purchase data to another system.
Create a webhook endpoint.
Edit or delete a webhook endpoint.
Before you begin
Flex delivers a webhook to a server that you run. The server must be ready before you create the endpoint in Flex.
A URL on your server that accepts HTTP POST requests. Flex sends every webhook as an HTTP POST.
A server that is reachable from the public internet. Flex cannot deliver to an address that only your internal network can reach.
Admin access to the Developer Tools page on the Admin Portal. The Webhooks tab lives on that page.
A Flex plan that includes webhooks. On Grow, webhooks require the paid add-on.
How webhooks in Flex work
Your server is ready, but it does not know what shape of request to expect. Every Flex webhook arrives as a single HTTP POST with a JSON body.
Flex sends 1 request for each event. The body names the event in an eventType field. The body carries the record that changed in a data.object field. For example, a member.created event carries the new member record inside data.object.
An event for an updated record also carries a data.previousAttributes field. The data.previousAttributes field gives the earlier value of each property that changed. For example, a member.updated event shows the earlier email address of the member in data.previousAttributes.
Flex sends each request 1 time. Flex waits 5 seconds for a response from your server. If delivery fails, Flex does not resend the request. To get the data from a failed delivery, read the record through the API.
The event list on the endpoint controls what Flex delivers. Flex sends only the events that you selected on that endpoint.
Find the event name you need
You know what a request looks like, but not which events Flex can send. Flex names every event after a record and an operation.
The following table lists the events that Flex sends, grouped by the record that changed.
Important: The event list has no entry for a signed contract. The event list also has no entry for a canceled booking. Select the event for the record operation you want, for example, contract.updated, and read the payload on your server to decide what happened.
Record | Events | Flex sends a request when |
Company |
| A company is created, updated, or removed. |
Company payment details |
| Payment details are added to or removed from a company. |
Member |
| A member is created, updated, or removed. |
Member payment details |
| Payment details are added to or removed from a member. |
Invoice |
| An invoice, a credit note, or an overpayment is created, updated, or removed. |
Invoice charge |
| An invoice receives a payment, a payment status changes, or a payment is removed by hand. |
Invoice allocation |
| A credit is allocated to an invoice, or an allocation is removed by hand. |
Fee |
| A fee is created, updated, or removed. |
Membership |
| A membership is created, updated, or removed. |
Booking |
| A booking is created, updated, or removed. |
Contract |
| A contract is created, updated, or removed. |
Ticket |
| An issue is created, updated, or removed. |
Integration |
| An integration is disconnected from your organization. |
Day pass |
| A day pass is created or updated for a member or a company. |
Occupancy slot |
| A booking occurrence is created or removed, which is useful for recurring bookings. |
Checkout transaction |
| A customer completes a checkout in Growth Hub. |
Send Growth Hub purchase data to another system
The events in the table below carry Flex records, such as memberships, fees, and invoices. These Flex records do not show which campaign or promo code brought a customer to Growth Hub.
The checkoutTransaction.created event sends the campaign data and the promo code for each Growth Hub purchase. Flex sends 1 checkoutTransaction.created request for each completed checkout in Growth Hub. Flex sends the event after a customer buys a plan or books a resource in Growth Hub.
Important: Flex sends the checkoutTransaction.created event only for a checkout in Growth Hub. A membership or booking you create in the Admin Portal does not send this event.
The data.object field of the request carries the checkout transaction. The following table lists the fields that link the purchase to Flex records and to your marketing data.
Field | What the field contains |
| The ID of the member who completed the checkout. |
| The email address of the member who completed the checkout. |
| The IDs of the memberships that the checkout created. |
| The IDs of the fees that the checkout created. |
| The ID of the invoice that the checkout created. If Flex created no invoice at checkout, the payload does not include this field. |
| The full promo code record, including the code, type, and value. If the customer used no promo code, the value is |
| The discount percentage that the checkout applied. |
| The price before the discount. |
| The price after the discount. |
| The |
| The date and time of the checkout transaction. |
Growth Hub records UTM parameters, campaign_id, gclid and fbclid only when they reach the Growth Hub URL. To get campaign data in the utms field, add them to every Growth Hub link that you share. Track campaign results with UTM parameters in Growth Hub →
The note uses the URL spelling (campaign_id) and the payload list uses the camelCase spelling (campaignId), because that’s how each one appears. gclid and fbclid are spelled the same in both places. Ad platforms usually add gclid and fbclid to links automatically. Customers would only add campaign_id themselves.
Flex does not send an update event or a removal event for a checkout transaction. The checkout transaction records the purchase at the moment of checkout. A later change to the membership or to the invoice does not change the checkout transaction. To get later changes, select the events for those records, such as membership.updated and invoice.updated.
Match the checkout transaction to the invoice
The checkout transaction carries the campaign data. The invoice.created event carries the billing data for the same purchase.
The checkoutTransaction.created request and the invoice.created request can arrive in any order. Your server must accept the 2 requests in any order. Use the invoice ID to match the 2 requests.
If the checkout transaction arrives first, store the checkout transaction under its invoice ID. When the invoice.created request arrives, add the invoice to the stored checkout transaction.
If the invoice.created request arrives first, store the invoice. When the checkout transaction arrives, add the checkout transaction to the stored invoice.
Use the memberships IDs and the fees IDs in the same way. These IDs match the membership.created events and the fee.created events for the same purchase.
Some checkouts create no invoice. For example, a checkout for free items creates no invoice. If Flex creates no invoice at checkout, the checkout transaction has no invoice field. An invoice that Flex creates after checkout does not appear in the checkout transaction.
Create a webhook endpoint
You have the event name, but Flex does not know where to send the request. An endpoint pairs a URL on your server with a list of events.
Go to Settings > Data & Extensibility > Developer Tools, then select the Webhooks tab.
Click Add Endpoint.
In Endpoint URL, enter the address on your server that accepts HTTP POST requests. Flex sends every selected event to this address.
In Description, enter what the webhook is for. The field is optional. The description is what tells 2 endpoints apart on the Webhooks tab.
Under Events to send, select each event that you want Flex to deliver. Flex delivers only the events on this list.
Save the endpoint.
Flex starts to send requests as soon as you save the endpoint. The first request arrives the next time 1 of the selected events happens in your organization.
You can also create and manage webhooks through the API. Read the webhook API reference ↗︎
Edit or delete a webhook endpoint
The endpoint now delivers the events you selected. When your integration changes, the endpoint must change with it.
Every endpoint in your organization is listed on the Webhooks tab. Open an endpoint to change its Endpoint URL, its Description, or its Events to send list. Delete an endpoint when the integration that uses it is retired.
Warning: If you delete an endpoint, Flex stops sending requests to that URL. To reduce traffic without losing the endpoint, remove events from the Events to send list instead.
Best practices
How you split events across endpoints decides how much traffic each server receives.
If you run more than 1 integration, create a separate endpoint for each integration. Then you can change 1 integration without affecting the other.
If your integration reacts to 1 kind of change only, select that single event. Your server then receives no requests to discard.
If you match Growth Hub purchases to invoices, select
checkoutTransaction.createdandinvoice.createdon the same endpoint. The server that matches the 2 requests then receives both.
FAQs
Delivery and payload handling happen on your server, outside Flex. The answers below cover what you can change in Flex.
Does Flex send a webhook when a contract is signed?
Flex does not send a webhook when a contract is signed. The contract events are contract.created, contract.updated, and contract.removed. Each fires when the contract record changes.
Can I set up a webhook without using the Admin Portal?
You can set up a webhook through the API instead of the Admin Portal. The API exposes a /webhooks endpoint for creating and managing webhooks.
Why is my server receiving nothing?
Your server receives nothing when Flex cannot reach the URL or when the event is missing from the endpoint's Events to send list. Ensure that the URL accepts HTTP POST requests from the public internet. Then open the endpoint and ensure that the event is selected.
Can I send different events to different systems?
You can send different events to different systems by creating a separate endpoint for each system. Each endpoint has its own Endpoint URL and its own Events to send list.
Can I send UTMs and promo codes from Growth Hub to my CRM?
You can send UTMs and promo codes from Growth Hub to your CRM with the checkoutTransaction.created event. Flex sends this event for each completed checkout in Growth Hub. The payload includes the visit's UTM parameters and the full promo code record.
Why does a checkout transaction have no invoice ID?
A checkout transaction has no invoice ID when Flex created no invoice at checkout. For example, a checkout for free items creates no invoice. An invoice that Flex creates after checkout does not appear in the checkout transaction.
Does Flex send a webhook again if my server misses the request?
Flex does not send a webhook again if your server misses the request. Flex sends each request 1 time and waits 5 seconds for a response. To get the data from a missed request, read the record through the API.
For payload examples, sample handler code, and the full event reference, read the OfficeRnD webhook documentation ↗︎

