Webhooks
Webhooks let Gomry notify your own systems the moment something happens in your organization: someone registers, a subscription changes, or a form is submitted. Instead of polling the API, you register one or more HTTPS URLs and Gomry sends an HTTPPOST request with a JSON payload to each of them as events
occur.
There are two ways to receive them:
Use webhook subscriptions for anything new. Organization webhook URLs keep
working for existing setups.
Webhook subscriptions
Subscribe one HTTPS URL to one event type with Create Webhook Subscription, and remove it with Delete Webhook Subscription. The key needs the read scope of the data the event carries. This is the mechanism Gomry’s Zapier app uses for its instant triggers, so a Zap you turn on appears in List Webhook Subscriptions.secret (whsec_...). It is shown once: store it to verify
signatures.
Event types
Envelope
Every delivery is aPOST with a JSON body:
Headers:
Gomry-Signature, Gomry-Event-Id, Gomry-Event-Type, Gomry-Webhook-Id
(the subscription) and User-Agent: Gomry-Webhooks/1.0.
Event payloads
attendee.registered: the attendee plus
event_id, contact_id, payment_id, phone_number, the registration answers
(answers as a list and answers_by_question keyed by question), a summary of the
event and the full contact.
form_response.created and form_response.updated: the
application (with applicant), plus
answers_by_question and the form (id, name).
To see real payloads from your own data, call
List Webhook Samples.
Verifying signatures
Gomry-Signature looks like t=1792056000,v1=5257a869.... v1 is the hex
HMAC-SHA256 of {t}.{raw body}, keyed with the subscription’s secret. Compute it over
the raw request bytes (before any JSON parsing), compare in constant time, and reject
timestamps more than 5 minutes old.
Delivery and retries
- Answer with any
2xxwithin 10 seconds. Do slow work after responding. - A timeout, a network error,
429or5xxis retried with backoff (up to 3 more attempts). Other4xxanswers are not retried. - Answering
410 Gonedeletes the subscription. Zapier does this when a Zap is deleted. - Redirects are not followed.
- An event can arrive more than once, and events can arrive out of order. Deduplicate
on the envelope
id. - Revoking the API key that created a subscription stops its deliveries. Removing the read scope from the key pauses them until the scope is back.
- An organization can have up to 100 active subscriptions.
Zapier
Gomry’s Zapier app connects with an organization API key and uses these subscriptions for its instant triggers (New Attendee, New Form Response, Updated Form Response). You don’t need to call this API yourself to use it.Organization webhook URLs
Configuring webhook URLs
Webhook endpoints are configured per organization.1
Open your API key settings
Go to Organization Settings, API Keys in your Gomry dashboard and scroll to Webhooks.
2
Add your endpoint URLs
Enter one or more endpoint URLs, one per line. Every URL you add receives
a copy of every webhook event for your organization.
3
Save
Save your settings. New events will start being delivered to your endpoints.
Use an
https:// endpoint that is publicly reachable and responds quickly (see
Delivery & reliability). Webhooks are scoped to the
whole organization — there is currently no per-event subscription.How delivery works
Each event is sent as a separate HTTP request to every configured URL:
Your endpoint should respond with a
2xx status code as quickly as possible.
Do any heavy processing after acknowledging the request (for example, by
pushing the payload onto a queue), so you don’t hit the delivery timeout.
Legacy event types
Thetype field identifies what happened. The most common event is
payment.succeeded, which fires when an attendee buys a ticket.
Form-response payloads on this path do not carry a
type field, but always
include formID and applicationID. Use the presence of those fields to identify
a form-response event. Webhook subscriptions always set type.Payload structure
All events share one envelope. Fields are populated based on the eventtype,
so most are optional — always guard for missing values.
user object
payment object
Example: ticket purchase
When an attendee buys a ticket, your endpoint receives apayment.succeeded
event:
Example: form submission
Handling webhooks
Best practices
Respond fast, process later
Respond fast, process later
Return a
2xx within the 5-second timeout. Offload anything slow (emails,
database writes, third-party calls) to a background job or queue.Make your handler idempotent
Make your handler idempotent
Because there are no delivery guarantees and multiple endpoints can be
configured, design your handler so processing the same event twice is safe —
key off
payment.id or applicationID.Verify sensitive data against the API
Verify sensitive data against the API
Payloads are unsigned. Before acting on money-related data, re-fetch it from
the Payments API using the
payment.id from the payload.Guard for missing fields
Guard for missing fields
Most fields are optional and vary by event type. Always check for existence
before reading nested values.

