Skip to main content

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 HTTP POST 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.
The response includes a secret (whsec_...). It is shown once: store it to verify signatures.

Event types

Envelope

Every delivery is a POST 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 2xx within 10 seconds. Do slow work after responding.
  • A timeout, a network error, 429 or 5xx is retried with backoff (up to 3 more attempts). Other 4xx answers are not retried.
  • Answering 410 Gone deletes 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.
Webhook payloads are not currently signed, and there is no shared secret or signature header on this delivery path. Treat the data as advisory: keep your endpoint URL private, accept requests only over HTTPS, and confirm anything sensitive (such as payment amounts) against the Payments API using the payment.id from the payload before acting on it.

Legacy event types

The type 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 event type, 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 a payment.succeeded event:

Example: form submission

Handling webhooks

Best practices

Return a 2xx within the 5-second timeout. Offload anything slow (emails, database writes, third-party calls) to a background job or queue.
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.
Payloads are unsigned. Before acting on money-related data, re-fetch it from the Payments API using the payment.id from the payload.
Most fields are optional and vary by event type. Always check for existence before reading nested values.