Receiving events from another system into AppBO and starting a workflow from the payload they carry.
Bring your stack to a call and we will connect it, test every field in both directions, and hand it over documented.
Book a callAn inbound webhook is a URL the platform gives you, which an external system calls when something happens on its side. On the sending side is anything that can make an HTTP POST: your own application, a form host, a payment processor, a scheduling tool, an IoT device, a CI pipeline, an automation platform. On the receiving side is an AppBO workflow that starts the moment the request lands and can read the fields out of the request body.
The reason to use one instead of the API is direction and ownership. With the API, your code is responsible for deciding when to act and for knowing what the platform's current state is. With an inbound webhook, the external system simply announces facts as they happen, and the automation logic. Find or create the contact, branch on a value, send the message, move the opportunity. Lives inside the platform where a non-developer can read and change it. That division survives staff turnover far better than business rules buried in a worker process.
Inbound webhooks are the right tool when the event is genuinely event-shaped: a payment succeeded, a ticket was closed, a shipment left the warehouse, a lead filled in a form you host yourself. They are the wrong tool for bulk backfill, for anything that needs a synchronous answer in the response body, and for cases where you need to read a lot of platform state before deciding: those belong to the REST API.
Content-Type: application/json header; a form-encoded body or a mismatched header is the most common reason fields appear empty in the workflow.Scenario: an externally hosted booking tool must create or update the contact in AppBO and start a reminder sequence whenever a session is booked.
session.booked event, with a JSON body containing event_id, event_type, occurred_at, email, phone, full_name, session_start, practitioner and a shared_secret field.shared_secret against the stored value. It matches, so execution continues; a mismatch would route to a terminate branch.email is present and that occurred_at is within the last hour. Both pass.booking-tool, with session_start and practitioner written to custom fields.practitioner to pick the right reminder template.session_start and sends an SMS reminder.event_id it has already recorded on the contact and terminates before the confirmation email is sent a second time.event_id and a later session_start; the workflow finds the existing contact by email, updates the custom field, and the reminder recalculates against the new date.An inbound webhook endpoint is not an unlimited ingest pipe, and workflow executions are a metered resource on the account. A sender that bursts thousands of events (a nightly batch job, a backfill, a runaway loop) can be throttled or can consume a surprising amount of the account's execution budget. Throttle on the sending side, and never use an inbound webhook as a bulk import mechanism.
The platform does not de-duplicate for you. Most senders retry on timeout or on any non-2xx response, and many retry on a response that simply took too long even though it succeeded, so the same event will arrive twice. Always send an event identifier, record it on the contact or in a lookup, and check it in the first guard step. Without that, retries produce duplicate emails, duplicate opportunities and duplicate charges in whatever the workflow touches downstream.
The trigger learns the payload shape from samples, so a field that was absent from your sample will not be referenceable later. Always include optional keys with empty values rather than omitting them. Nested objects and arrays are awkward to address; flatten at the sender. Numbers arriving as strings, dates in an unexpected format, and phone numbers without a country code are all silent mapping failures that surface as empty fields or skipped branches rather than errors.
If the identity key is missing or inconsistent (email on some events, phone on others) a find-or-create step will create a second contact. Pick one key, require it, and reject events that lack it instead of letting the workflow improvise.
Point your sender's test mode at a workflow in a test sub-account, never at the live one. A test payload hitting a live workflow with a real phone number sends a real message. Keep the test and production URLs in separate secret entries and label them unambiguously.
The URL is the only thing standing between your workflow and the open internet, and it is not a signature. Add a shared secret in the payload and verify it in the first step. Rotate the webhook URL if it is ever committed to a repository, pasted into a ticket, or shared with a departing vendor, and remember that rotating it means reconfiguring every sender.
We wire the integration, map the fields, test both directions and hand it over with the SOPs your team needs to run it.
Book a call