Webhooks
🚀 Connect your ticket shop with your favorite apps!
Imagine your ticket shop could communicate with your CRM, accounting tools, or newsletter systems in real time — no more manual data exports required.
By connecting additional systems and services, the ADITUS Ticket Shop can be tailored even more precisely and powerfully to meet your specific needs. We focus on a range of standard use cases and integrations to enable fast and efficient implementations. For our customers, what truly matters is smooth execution and tangible results.
What are webhooks?
A webhook acts like a digital notification service. It is an excellent way to receive real-time updates about specific event-related transactions.
Webhooks instantly notify connected systems when important actions occur — for example, when a registration is completed or when a visitor checks in at an event.
Why use webhooks?
This real-time data flow enables immediate follow-up actions and highly personalized interactions with participants. By combining webhook events with your existing marketing infrastructure, you can:
-
Trigger automated campaigns
-
Update customer profiles instantly
-
Launch personalized engagement journeys at the perfect moment
Webhooks empower organizations to respond immediately to visitor behavior and seamlessly integrate event data into their existing systems. The result is timely, relevant, and data-driven interactions throughout the entire event lifecycle.
The ticket shop is built around a process-driven architecture: individual actions within the purchase or registration journey (use cases) modify the shopping cart (“cart”). These changes can be understood as events — and this is exactly where webhooks can be triggered.
In principle, webhooks can be provided for all key cart-related use cases within the shop. As soon as one of these events occurs, an HTTP POST request containing a JSON payload is sent to the configured webhook URL.
Creating Webhooks
To set up a webhook, login to WebTERP and go to Start->Interfaces->Webhooks. From there, click Webhooks, then Add webhook. Alternatively, you can create and manage a webhook through the Webhooks API. Check the API documentation for detailed information.
Webhooks require a few configuration options before you can make use of them:
Payload URL
The payload URL is the URL of the server that will receive the webhook POST requests.
Content Type
Webhooks can be delivered using different content types:
-
The
application/jsoncontent type will deliver the JSON payload directly as the body of thePOSTrequest. -
The
application/x-www-form-urlencodedcontent type will send the JSON payload as a form parameter calledpayload.
Secret
Setting a webhook secret allows you to ensure that POST requests sent to the payload URL are from ADITUS. When you set a secret, you'll receive the X-ADITUS-Signature header in the webhook POST request.
Active
By default, webhook deliveries are "Active." You can choose to disable the delivery of webhook payloads by deselecting "Active."
Events
Choose which events will send payloads for this webhook. Only subscribing to the specific events you plan on handling limits the number of HTTP requests to your server. You can change the list of subscribed events anytime.
See "Webhook event payloads" for the list of available webhook events and their payloads.
Wildcard Event
To configure a webhook for all events, use the wildcard (*) character to specify the webhook events. When you add the wildcard event, we'll replace any existing events you have configured with the wildcard event and send you payloads for all supported events. You'll also automatically get any new events we might add in the future.
Testing Webhooks
You can monitor your webhook deliveries in ADITUS WebTERP, including the HTTP Request and payload as well as the response.
Recent deliveries
Every webhook has its own "Recent Deliveries" section, which lists all occurred events and whether a delivery was successful or failed. You can also identify when each delivery was attempted.
Webhook payloads
Webhook payloads are sent as HTTP Post to the Webhook URL.
User-Agent
The User-Agent for the requests will have the prefix ADITUS-Webhook. (For future use we may choose to add a suffix.)
Delivery HTTP Headers
HTTP POST payloads that are delivered to your webhook's configured URL endpoint will contain several special headers:
| Header | Description |
|---|---|
X-ADITUS-Event | The name of the event that triggered the webhook. |
X-ADITUS-Delivery | A GUID to identify the delivery. It will be reused for subsequent redeliveries and retries of the same event. |
X-ADITUS-Signature | This header is sent if the webhook is configured with a secret. This is the HMAC hex digest of the payload JSON, and is generated using the SHA-256 hash function and the secret as the HMAC key. |
Webhook payload object common properties
The common properties describes the standardized fields that are included in every webhook payload, regardless of the specific event.
| Key | Type | Description |
|---|---|---|
event | string | The name of the event that triggered the webhook. |
event_id | string(UUID) | The unique event id for this delivery. It will be reused for subsequent redeliveries and retries of the same event. |
event_time | datetime | Timestamp when the event originally occurred. |
api_url | string (URL) | The API URL of the entity that triggered the event. This is optional and may not be present for every event payload. |
endpoint_url | string (URL) | The Webhook URL that this event was delivered to. |
data | object | Contains the business payload of the webhook |
Verifying the payload
If a secret is configured for a webhook, then each payload comes with a signed HMAC signature so that you can verify the origin of the webhook request. The secret is used as a key to sign the payload data with an HMAC key. The HMAC key is your security token, the HMAC digest is SHA-256, and the data is the raw payload JSON that is sent. The key is sent Base64 encoded via the X-ADITUS-Signature HTTP header.
Example Payload for cart.checkout
This example represents a maximum cart payload and therefore includes all fields that may occur in principle. Depending on the event type, article configuration, payment provider, registration flow, or legitimation setup, additional fields may appear or some fields may be omitted. The event-specific details are documented in the respective webhook descriptions.
This webhook event is triggered when a shopping cart has been successfully completed (checkout) and an order has been created.The event contains comprehensive information about the shopping cart, the order, the buyer, the articles (e.g. tickets), registration data, and payment processing. Further details about this webhook can be found in the “Ticket purchase and registration” section.
Headers:
-
X-webhook-secret: whk_XY000yyXXsxxxYYYxYYYYxxxXX0zzXxX
-
X-ADITUS-Event: cart.checkout
-
X-ADITUS-Delivery: 8y64d70d-x103-4185-1111-000x0103y0x0
-
User-Agent: ADITUS-Webhook
-
Host: integration.aditus.de
-
Content-Type: application/json; charset=utf-8
-
Content-Length: 2067
Fields in detail:
The following tables describe the fields of the cart.checkedout webhook payload in detail.
The example values are taken from a sample payload and are intended to illustrate the structure and meaning of the individual fields. Depending on the concrete checkout scenario, some fields may be optional or only present in specific contexts.
cartCheckeout
| Field | Type | Description | Example |
|---|---|---|---|
| orderId | String (UUID) | ID of the order created during checkout | b59ebc98-9047-f111-93e7-00155d96040a |
| cartId | String (UUID) | ID of the checked-out cart | 11d0b893-17a6-48a1-bc80-dd1f7a31f880 |
cart – General cart information
| Field | Type | Description | Example |
|---|---|---|---|
| id | String (UUID) | Cart ID | 11d0b893-17a6-48a1-bc80-dd1f7a31f880 |
| expiryTime | Date/Time | Cart expiration timestamp | 2030-10-31T00:00:00+01:00 |
| user | Object | Details of the user associated with the cart. | see details below in user description |
| event | Object | Details of the event added to the cart | see details below in event description |
| promotionCodes | Array | List of applied promotion/discount codes (empty at creation) | [] |
| items | Array | List of cart items/positions (empty at creation) | see details below in items |
| totals | Array | Aggregated cart total values | see details below in totals |
| isImmutable | Boolean | Indicates if the cart can still be modified | false |
| isPaymentImmutable | Boolean | Indicates if the payment details can still be changed | true |
| isLegitimationImmutable | Boolean | Indicates whether legitimation data can still be changed | true |
| isRegistrationImmutable | Boolean | Indicates whether registration data can still be changed | false |
| isAmountImmutable | Boolean | Indicates whether the quantity/amount can still be changed | true |
| isPendingPayment | Boolean | Indicates whether the payment is still pending | false |
| isRegistrationOnly | Boolean | Indicates if registration is the only requirement | false |
| isRegistrationRequired | Boolean | Indicates whether registration is required | true |
| isLegitimationRequired | Boolean | Indicates whether legitimation is required | false |
| isPaymentRequired | Boolean | Indicates whether payment is required | true |
| paymentProvider | Object | Details of the selected payment provider | see details below in paymentProvider |
| buyerPerson | Object | Buyer information associated with the order | see details below in buyerPerson |
| order | Object | Details of the created order | see details below in order |
| status | String | Current cart/order status | Completed |
| culture | String | Language/culture context of the cart | de |
| termsOfService | Array | List of terms, policies, and consent entries shown during checkout | see details below in termsOfService |
user
| Field | Type | Description | Example |
|---|---|---|---|
| id | String (UUID) | Internal user ID | 091c6fb9-11e0-ed11-93c4-00155db54d03 |
| isVerified | Boolean | Indicates whether the user account is verified | true |
| String | Email address of the user | john@aditus.de | |
| externalId1..3 | String | Optional external identifier 1..3 | 121323123 |
event - Trade Show
| Field | Type | Description | Example |
|---|---|---|---|
| id | String (UUID) | Event ID | f2e25737-4990-ee11-93cf-00155d960409 |
| name | String | Event name | Experience Days |
| year | String | Event year | 2026 |
| number | String | Internal event number | 01 |
| slug | String | URL key of the event | ed24 |
| externalId1..3 | String | Optional external identifier 1..3 | SAP event ID |
items (Cart items)
Each item represents a purchased product (e.g., a ticket).
| Field | Type | Description | Example |
|---|---|---|---|
| id | String | Unique cart item ID | 00671313-0000-0000-0000-000000000000 |
| orderId | String (UUID) | ID of the related order | b59ebc98-9047-f111-93e7-00155d96040a |
| article | Object | Details of the article/ticket | see details below in article |
| promotionCodes | Array | Promotion codes applied to the cart item | [] |
| price | Object | Final price details of the cart item | see details below in item price |
| registration | Object | Registration details for the ticket holder | see details below in registration |
| legitimation | Object | Legitimation state of the item | see details below in legitimation |
| timeslots | Object | Timeslot selection details for the item | see details below in timeslots |
article (items[])
| Field | Type | Description | Example |
|---|---|---|---|
| id | String (UUID) | Article ID | a9460868-caeb-f011-93e3-00155d960409 |
| name | String | Display name of the article | DayTicket |
| internalName | String | Internal article name | DayTicket |
| description | String | Description text of the article (if available) | This ticket grants daily admission to the trade show. |
| sort | Integer | Sort order of the article | 0 |
| prices | Array | List of available article prices | see details below in article prices |
| image | Object | Image information of the article | see details below in article image |
| type | String | Technical article type | VisitorTicket |
| ticketValidity | String | Validity type of the ticket | None |
| articleNumber | String | Internal or business article number | 110 |
| configuration | Object | Article configuration settings | see details below in article configuration |
| articleGroup | Object | Group information of the article | see details below in articleGroup |
| externalId1..3 | String | Optional external article identifier 1..3 | 82051273-0262-4149-82ec-74b75745b289 |
article prices
| Field | Type | Description | Example |
|---|---|---|---|
| price | Object | Actual calculated price | see details below |
| originalPrice | Object | Original price before discounts/adjustments | see details below |
article prices.price / article prices.originalPrice
| Field | Type | Description | Example |
|---|---|---|---|
| price | Number | Net price | 3.53 |
| grossPrice | Number | Gross price including taxes | 4.2 |
| tax | Number | Tax amount | 0.67 |
| taxRate | Number | Tax rate in percent | 19 |
| currency | String | Currency code | EUR |
article image
| Field | Type | Description | Example |
|---|---|---|---|
| key | String | Technical image key | Default.OneDayTicket |
| uri | String (URL) | Image URL | https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/Images/Shop/ArticleImage/Default/OneDayTicket?... |
| type | String | Image type | Icon |
article configuration
| Field | Type | Description | Example |
|---|---|---|---|
| remainingAmountDisplayMode | String | Defines how remaining quantities are displayed | None |
| remainingAmountPerTimeslotDisplayMode | String | Defines how remaining quantities per timeslot are displayed | None |
| remainingAmountThresholdPercent | Number | Threshold percentage for remaining quantities | 0 |
| showIfSoldOut | Boolean | Indicates whether the article is shown even if sold out | false |
| maxLengthOfDescription | Integer | Maximum description length | 250 |
| maxNumberOfTicketsPerSale | Integer | Maximum number of tickets per sale | 42 |
| isInvitationEmailAddressChangePossible | Boolean | Indicates whether changing the invitation email is allowed | true |
| showBadgePreview | Boolean | Indicates whether a badge preview is shown | true |
articleGroup
| Field | Type | Description | Example |
|---|---|---|---|
| id | String (UUID) | Article group ID | 44e73971-a115-ee11-93c8-00155d96040a |
| name | String | Name of the article group | Tickets |
| sort | Integer | Sort order of the article group | 0 |
| configuration | Object | Article group configuration | see details below |
articleGroup.configuration
| Field | Type | Description | Example |
|---|---|---|---|
| isExclusiveAssortment | Boolean | Indicates whether the assortment is exclusive | false |
item price
| Field | Type | Description | Example |
|---|---|---|---|
| price | Number | Net item price | 3.53 |
| grossPrice | Number | Gross item price including taxes | 4.2 |
| tax | Number | Tax amount | 0.67 |
| taxRate | Number | Tax rate in percent | 19 |
| currency | String | Currency code | EUR |
registration
| Field | Type | Description | Example |
|---|---|---|---|
| data | Object | Registration data entered for the item | see details below in registration.data |
| isValid | Boolean | Indicates whether the registration is valid | true |
| problems | Array | List of validation problems | [] |
| isRequired | Boolean | Indicates whether registration is mandatory | true |
| isPossible | Boolean | Indicates whether registration is possible | true |
| types | Object | Available registration modes | see details below in registration.types |
registration.data
| Field | Type | Description | Example |
|---|---|---|---|
| type | String | Registration type used for the item | self |
| answers | Array | List of submitted registration answers | see details below in registration answers |
| hasInformation | Boolean | Indicates whether registration information is present | true |
registration answers
| Field | Type | Description | Example |
|---|---|---|---|
| isReadOnly | Boolean | Indicates whether the answer field is read-only | false |
| bindingMember | String | Technical binding name of the answer field | [CRM.Persons].SalutationLookup |
| value | String | Submitted value of the answer field | Herr |
registration.types.self
| Field | Type | Description | Example |
|---|---|---|---|
| isPossible | Boolean | Indicates whether self-registration is possible | true |
| survey | Object | Survey configuration for self-registration | see details below |
| hasToBeCompletedByTicketOwnerHimself | Boolean | Indicates whether the ticket owner must complete the registration personally | true |
registration.types.self.survey
| Field | Type | Description | Example |
|---|---|---|---|
| useCaseName | String | Technical survey use case name | Shop.Registration.Self |
| faireventId | Integer | Internal fair/event ID used for the survey | 194 |
| articleIds | Array | List of relevant article IDs | [2958] |
registration.types.thirdPerson
| Field | Type | Description | Example |
|---|---|---|---|
| isPossible | Boolean | Indicates whether third-person registration is possible | false |
| hasToBeCompletedByTicketOwnerHimself | Boolean | Indicates whether the ticket owner must complete the registration personally | false |
legitimation
| Field | Type | Description | Example |
|---|---|---|---|
| isRequired | Boolean | Indicates whether legitimation is required | false |
| isIncomplete | Boolean | Indicates whether legitimation is incomplete | false |
timeslots
| Field | Type | Description | Example |
|---|---|---|---|
| isEnabled | Boolean | Indicates whether timeslots are enabled for the item | true |
| isValid | Boolean | Indicates whether the selected timeslot configuration is valid | true |
| minimumNumberOfBookings | Integer | Minimum number of required bookings | 0 |
| maximumNumberOfBookings | Integer | Maximum number of allowed bookings | 0 |
| bookings | Array | List of booked timeslots | [] |
Note: minimumNumberOfBookings and maximumNumberOfBookings are not present for every item, but they are part of the overall sample structure.
totals[] - Cart Totals
Each entry in the totals array contains the original and current pricing information.
original - Original Price
| Field | Type | Description | Example |
|---|---|---|---|
| original | Object | Original aggregated totals | see details below |
| price | Number | Total net amount | 16.64 |
| grossPrice | Number | Total gross amount | 19.8 |
| tax | Number | Total tax | 3.16 |
| taxRate | Number | Tax rate | 19 |
| currency | String | Currency | EUR |
totals.original
| Field | Type | Description | Example |
|---|---|---|---|
| price | Number | Original aggregated net price | 16.64 |
| grossPrice | Number | Original aggregated gross price | 19.8 |
| tax | Number | Original aggregated tax amount | 3.16 |
| taxRate | Number | Original tax rate | 19 |
| currency | String | Currency code | EUR |
paymentProvider
| Field | Type | Description | Example |
|---|---|---|---|
| expiresAt | Date/Time | Timestamp until the payment session is valid | 2026-05-04T11:09:32.091+02:00 |
| redirectUrl | String (URL) | Redirect URL for the payment provider | https://test.saferpay.com/vt2/Api/SharedThreeDS/ ... |
| redirectRequired | Boolean | Indicates whether a redirect is required for payment | true |
| transactionToken | String | Technical payment transaction token | AOO07rbWIKC6vA2nn94YASzhv17A |
| isExpressCheckoutInitialized | Boolean | Indicates whether express checkout has already been initialized | false |
| id | String (UUID) | Payment provider ID | 210f6011-343d-ee11-93cf-00155d960409 |
| name | String | Name of the selected payment provider | Kreditkarte |
| paymentMethods | Array | Supported payment methods | see details below in paymentMethods |
| configuration | Object | Provider-specific technical configuration | see details below in paymentProvider.configuration |
| sort | Integer | Sort order of the payment provider | 0 |
| isDefault | Boolean | Indicates whether this is the default payment provider | true |
| isExpressCheckoutSupported | Boolean | Indicates whether express checkout is supported | false |
paymentMethods
| Field | Type | Description | Example |
|---|---|---|---|
| methodType | String | Technical type of the supported payment method | Mastercard |
paymentProvider.configuration
| Field | Type | Description | Example |
|---|---|---|---|
| saferpayFieldsUrl | String (URL) | URL of the Saferpay hosted fields endpoint | https://test.saferpay.com/Fields/404227 |
| saferpayFieldsLibrary | String (URL) | URL of the Saferpay JavaScript library | https://test.saferpay.com/Fields/lib/1/saferpay-fields.js |
| saferpayFieldsAccessToken | String | Access token for Saferpay fields integration | 56e2915d-3029-427b-a09f-e3af9b8e5029 |
buyerPerson
Contains the buyer information placeholder.
| Field | Type | Description | Example |
|---|---|---|---|
| String | Email address of the buyer | john@aditus.de | |
| firstName | String | First name of the buyer | John |
| lastName | String | Last name of the buyer | Snow |
| company | String | Company name of the buyer | ADITUS GmbH |
| nationality | String | Nationality/country code of the buyer | DE |
| salutation | String | Salutation of the buyer | Herr |
| vatId | String | VAT ID of the buyer | 0014 |
| address | Object | Address details of the buyer | see details below in buyerPerson.address |
| isPrefilled | Boolean | Indicates whether the buyer information was prefilled | true |
| surveyId | Object | Survey reference used for missing buyer data | see details below in buyerPerson.surveyId |
| isValid | Boolean | Indicates whether the buyer information is valid | true |
buyerPerson.address
| Field | Type | Description | Example |
|---|---|---|---|
| street | String | Street name | Strasse der Nationen |
| houseNumber | String | House number | 5 |
| postalCode | String | Postal code | 30539 |
| city | String | City | Hannover |
| country | String | Country code | DE |
buyerPerson.surveyId
| Field | Type | Description | Example |
|---|---|---|---|
| useCaseName | String | Technical survey use case name | Shop.MissingBuyer |
| faireventId | Integer | Internal fair/event ID used for the survey | 194 |
| articleIds | Array | Related article IDs | [] |
order
| Field | Type | Description | Example |
|---|---|---|---|
| id | String (UUID) | Order ID | b59ebc98-9047-f111-93e7-00155d96040a |
| orderDate | Date/Time | Timestamp when the order was created | 2026-05-04T10:09:48.7419754 |
| number | String | Business order number | 6565-2026-6565622626 |
termsOfService
All consent/terms entries displayed during the checkout process.
| Field | Type | Description | Example |
|---|---|---|---|
| uniqueId | String (UUID) | Unique identifier of the consent entry | 4777d894-1751-44a7-9d96-57a4479e05a0 |
| displayOrder | Integer | Display order of the consent entry | 1 |
| version | String | Version of the consent/policy | 1.0 |
| content | String (HTML/Text) | Content shown to the user during checkout | Ich akzeptiere die Allgemeinen Geschäftsbedingungen |
| consentPolicy | String | Policy type of the entry | Mandatory |
| isApproved | Boolean | Indicates whether the consent was approved | true |
| countries | Array | Country restrictions for the consent entry | [] |
| reconfirmationRequired | Boolean | Indicates whether reconfirmation is required | false |