Eventim (Ticketcorner) integration

Integrate ticketing with our SSO

Unidy provides a native integration that synchronizes Eventim contacts with Unidy accounts. The synchronization is fully bi-directional, meaning changes made in either system are reflected in the other. Both create events and update events are included in the sync process.

The Eventim integration is available as a native Unidy plugin and can be added easily to your brand. Installation and configuration are handled by your Unidy contact.

Initial setup

The basic setup requires an API connection to your Eventim account:

  • Base URL
  • Client ID
  • Client secret
Data sync only works when Unidy SSO is already integrated in the Eventim shop.

SSO in Eventim

Unidy SSO can be integrated in Eventim. However, your contact at Eventim has to set this up. Eventim will require the following information for this:

  • Host
  • Client ID
  • Scopes

Scopes determine which information will be exchanged upon login from the Identity provider (Unidy) to the client (Eventim).

Contact synchronization

Contacts stored in Eventim can be synchronized with Unidy accounts to

  • provide your users a seamless usage of your Eventim shop
  • access the data of your users in Eventim, so you can use it for your marketing campaigns and user communication

Eventim contacts and Unidy accounts are connected by two measures:

  • Eventim contact stores Unidy ID as authorization ID
  • Unidy Account stores Eventim Tixx ID as plugin data

The sync works bi-directional between Eventim contacts and Unidy accounts. This 2-way sync allows for the seamless transfer of create and update events between the two platforms.

Notion image

Upon any create or update event in either Eventim or Unidy, a webhook is generated. The webhook subscriptions are automatically created through our plugin upon installation. These webhooks contain essential information and serve as triggers for the synchronization process.

Notion image

Synced Information

The synchronization process ensures that the following information is kept up-to-date between Eventim contacts and Unidy accounts:

  • Unidy ID
  • First name
  • Last name
  • Email
  • Date of birth
  • Address information
  • Company
  • Salutation
  • Eventim tixxCustomerNumber
  • Eventim customerState.name
  • Eventim customerState.description
  • Eventim customerState.state

Phone number is not part of the current sync scope

 

Custom Mappings:

Custom mappings provide flexibility in the synchronization process. Administrators can configure additional attributes to be synchronized or assign contacts to custom user groups such as membership or discount groups.

Configuration Options:

Administrators can fine-tune the synchronization process with the following configuration options:

  • Invite New Users: Determine whether users created in Unidy by Eventim are directly invited, receiving an invitation email upon creation (true/false).
  • Assign Users by Email: Specify whether contacts in Eventim are identified by email instead of the Eventim custom number (true/false).
  • Sync new users: Determine whether all newly created users in Unidy should be synched to Eventim

The last method is not recommended as email may not be unique in Eventim.

Eventim -> Unidy

On receipt of a CUSTOMER_UPDATE webhook, the sync process begins. The webhook contains a UUID, which is used to fetch the payload from Eventim webhook API.

As there is no general contact API in Eventim, the retrieval of webhooks is crucial for data integrity. However, Eventim webhook retry mechanism ensures a high level of reliability in the synchronization process.

Depending on the given sync settings, users in Unidy are either created or updated.

The linked Unidy user to an Eventim contact is identified through the Unidy ID.

Unidy -> Eventim

Changes made in Unidy trigger create or update events. These are used conversely to update the respective contacts in Eventim to maintain data consistency across platforms.

The linked Eventim contact to a Unidy user is identified through the Eventim Tixx ID.

Sync Conflicts

In the following section, you will find a description of Eventim-specific synchronization conflicts and instructions on how to resolve them.

EVENTIM TIXX ID
UNIDY ID
DUPLICATE EVENTIM CONNECTION
t661684dc9eaa3
87059c0d-62c8-429c-9986-1d25e71e8399
t66e2e204e4887
87059c0d-62c8-429c-9986-1d25e71e8399
MULTIPLE ASSIGNMENT
t661684dc9eaa3
87059c0d-62c8-429c-9986-1d25e71e8399
t661684dc9eaa3
9916d3db-1303-4d6f-ae2d-a5881ce51fb8

Duplicated Eventim Connection

You might have the case that your ticketing team wants to purchase tickets for VIPs, scouts, etc.. A usual approach to this is, to create a new customer in Eventim with the information of the respective VIP, but with their own email address.

Notion image

When this happens, Unidy receives an update from Eventim with the new Eventim Tixx ID for the respective Email address. Unidy then would normally create a new connection between the respective Tixx ID and Unidy ID to establish the sync for the Unidy user to the Eventim customer. However, this is not possible in this case, since the Unidy user is already connected to a different Eventim customer. This is why Unidy raises a “Duplicate Eventim Connection” sync conflict. You have 3 option how to resolve this conflict:

  • Ignore If you just want to ignore the conflict without any action, click Ignore
  • Connect In case you want the user to be overwritten in Unidy with Eventim data and establish a new connection between Unidy and Eventim user, click Connect.
  • Dismiss If you don’t want to overwrite the information in Unidy with the information of the new customer in Eventim, you should click Dismiss. In this case a new connection is not established, and existing information is synced from Unidy to Eventim for the already connected user.
 

Use case B: Merging two customers in Eventim with the same email address

You might have created a second Eventim customer with the same Email address as the first one. In that case you can merge customers. This will delete the first customer in Eventim and leave only the new customer object.

When this happens, Unidy receives an update from Eventim with the new Eventim Tixx ID for the respective Email address. Unidy then would normally create a new connection between the respective Tixx ID and Unidy ID to establish the sync for the Unidy user to the Eventim customer. However, this is not possible in this case, since the Unidy user is already connected to a different customer. This is why Unidy raises a “Duplicate Eventim Connection” sync conflict.

Since you want in this case to establish a connection with the new customer in Eventim, you should click on Connect. Now the Unidy ID will be synced to the new Eventim customer as authorization method and the connection in Unidy will be updated with the new Tixx ID.

Multiple Assignment

Use Case C: Switch Unidy accounts for existing Eventim customers

When wanting to change the Unidy ID of existing customers in Eventim, you can do so by editing the Authorization on the Eventim customer. You can simply add the new Unidy ID of an existing user in Unidy that you want to use.

Notion image

When you do so, Unidy receives an update with the respective Eventim Tixx ID and the new Unidy ID you want to use. Since, Unidy already has a relation to a different Unidy user for this Tixx ID, Unidy raises a sync conflict of the type Multiple Assignment.

If you want to accept your changes, simply click Connect.

Resource not found

When syncing tickets or subscriptions from Eventim to Unidy, Unidy plugin uses different methods to identify the user associated with the ticket.

  1. Check for existing tickets or subscriptions: First, the plugin checks if the ticket or subscription is already stored in Unidy by comparing the ticket ID. If it exists, the plugin updates the existing ticket or subscription.
  1. Check for an associated Unidy ID: If the ticket is not found, the plugin checks whether the Eventim customer already has a Unidy ID stored for authentication.
  1. Check for email match: If no Unidy ID is found, the plugin checks whether the customer’s email is already in Unidy.

If steps 2 and 3 are unsuccessful, a new user can either be created in Unidy (if the Create missing users when syncing tickets option is enabled) or a Resource not found sync conflict is triggered.

In the case of a sync conflict, you can either ignore it or manually add the user to Unidy so the ticket or subscription can be synced during their next purchase.

Ticket Synchronization

Works only in combination with contact sync.

Purchased tickets can be synchronized with Unidy. Tickets in Eventim are always purchased by associated contacts. The synchronization of tickets depends on the corresponding Eventim contact being successfully synced to an account in Unidy. If the contact is not available in Unidy, the related tickets cannot be synchronized. For more information, see section Contact Synchronization.

Upon ticket creation, Eventim sends two webhooks: ORDER_UPDATE and ORDER_TICKET_UPDATE.

  • ORDER_UPDATE
    • Contains order invoice details in a single webhook per order.
    • Required to extract ticket statuses (valid, expired, cancelled, etc.).
  • ORDER_TICKET_UPDATE
    • Is triggered for each ticket purchase, resulting in multiple webhooks for orders with multiple tickets.
    • Contains ticket details like type (e.g. seasonal or single game), price, seating, venue, and event details.

Eventim doesn’t have a general Ticket API for querying tickets. Hence, Unidy plugin relies solely on webhook reception to retrieve ticket information. Failure to capture a webhook would render ticket information irretrievable.

Upon webhook receipt, the plugin utilizes the UUID to extract payload via Eventim's Webhook API.

Notion image

Based on the given configuration, the Eventim plugin in Unidy creates either a ticket, or a subscription.

The ticket sync is a one-way sync, meaning that tickets are synced to Unidy, but if they are updated in Unidy, they are not updated accordingly in Eventim. I.e. updates for tickets must happen always in Eventim.

Ticket object in Unidy

Tickets from Eventim are synced as Tickets in Unidy. If the ticket from Eventim is a seasonal ticket, it can also be configured to be synced as Subscription.

Tickets and Subscriptions both always belong to a Ticket Category or Subscription Category. This has to be considered when activating the sync. You have the following options to assign category IDs:

  • Either add value mapping (e.g. certain event ID mapped to a category ID)
  • use fallback category ID in plugin settings, that is being used, when you either didn’t setup a value mapping, or if the given attribute doesn’t match any mapped values.

Sync triggers

  • Create: When new tickets are purchased in Eventim, Eventim creates an order-invoice and a ticket for each purchased ticket. The created tickets are synced to Unidy.
  • Update: Tickets in Eventim can change. E.g. seating, start date and time, or status (i.e. when user cancels or ticket expires). The respective tickets in Unidy are updated accordingly. If a ticket wouldn’t be existing in Unidy yet, it would be created instead.

Synced ticket attributes

You can customize what kind of information is synced from Eventim to Unidy. You can also decide as which attributes the information is stored in Unidy. When first creating the plugin, Unidy plugin is generating some default mappings to ensure that the tickets can be synced in general.

The level of detail that can be synchronized with Unidy depends on the Eventim API. The following information is available for synchronization.

Example payload ORDER_UPDATE
{
    "invoiceId": "26123456789",
    "extNumber": "a21324354",
    "orderId": "65281000",
    "customer": {
        "id": "abc123123123",
        "customerNumber": "MXXX0001-1",
        "authenticationEmail": "jd@provider.tld",
        "status": "active",
        "firstName": "John",
        "lastName": "Doe",
        "middleName": "",
        "initials": "",
        "ticketName": "",
        "company": "",
        "title": "",
        "salutation": "Herr",
        "gender": "male",
        "nationality": "",
        "fiscalCode": "",
        "dateOfBirth": "",
        "placeOfBirth": "",
        "countryOfBirth": "",
        "streetAndNumber": "Doe Street 5",
        "postalCode": "10000",
        "city": "Doe City",
        "province": "",
        "country": "UK",
        "addressSupplement": "",
        "additionalAddresses": [
            {
                "id": 10000000,
                "customerId": "abc123123123",
                "salutation": "Frau",
                "title": "",
                "firstName": "Jane",
                "middleName": "",
                "initials": "",
                "lastName": "Doe",
                "company": "",
                "street": "Doe Street 5",
                "postalCode": "10000",
                "city": "Doe City",
                "country": "UK",
                "province": "",
                "addressSupplement": "",
                "addressType": "standard"
            }
        ],
        "communications": [
            {
                "id": 20000000,
                "customerId": "abc123123123",
                "communicationType": "email",
                "communicationValue": "jd@provider.tld"
            }
        ],
        "possessedCardIds": [],
        "authorization": ""
    },
    "affiliate": {
        "id": 1000,
        "title": "1. FC Verein",
        "companyId": "fc"
    },
    "parentAffiliate": {
        "id": 1000,
        "title": "1. FC Verein",
        "companyId": "fc"
    },
    "saleOperator": {
        "id": "1080000",
        "username": "salesperson",
        "name": "Sales Person"
    },
    "salesChannel": {
        "code": "i",
        "description": "Interne VVK"
    },
    "date": "2021-02-01T11:01:00+01:00",
    "vatPrepaid": false,
    "additionalFee": [
        {
            "id": "6017D19DCD19C",
            "description": "Mitnahme",
            "isoAmount": {
                "amount": "0",
                "currency": "EUR"
            },
            "vat": "0.0000"
        }
    ],
    "totalPrice": "129.00E",
    "totalPriceIso": {
        "amount": "129",
        "currency": "EUR"
    },
    "paymentType": "CASH",
    "payments": [
        {
            "paymentType": "CASH",
            "isoAmount": {
                "amount": "129",
                "currency": "EUR"
            }
        }
    ],
    "expiredTickets": [],
    "cancelledTickets": [],
    "pendingTickets": [],
    "enteredTickets": [],
    "transferedTickets": [],
    "deliveryMethod": {
        "id": 1020,
        "name": "Mitnahme"
    },
    "invoiceAddress": {
        "id": 123456790,
        "customerId": "abc123123123",
        "salutation": "Herr",
        "title": "",
        "firstName": "John",
        "middleName": "",
        "initials": "",
        "lastName": "Doe",
        "company": "",
        "street": "Doe Street 5",
        "postalCode": "10000",
        "city": "Dow City",
        "country": "UK",
        "province": "",
        "addressSupplement": "",
        "addressType": "standard"
    },
    "deliveryAddress": {
        "id": 123456789,
        "customerId": "abc123123123",
        "salutation": "Frau",
        "title": "",
        "firstName": "Jane",
        "middleName": "",
        "initials": "",
        "lastName": "Doe",
        "company": "",
        "street": "Doe Street 5",
        "postalCode": "10000",
        "city": "Dow City",
        "country": "UK",
        "province": "",
        "addressSupplement": "",
        "addressType": "standard"
    },
    "type": "Invoice",
    "accounts": [],
    "events": [
        {
            "id": 300000,
            "competitionId": 5000,
            "competitionName": "Bundesliga",
            "name": "1. Heimspiel",
            "type": "single",
            "status": [
                "active",
                "informational"
            ],
            "vatCode": "",
            "isFiscal": false,
            "isDeletable": false,
            "startTime": "2021-03-14T20:00:00+01:00",
            "endTime": "2021-03-14T22:00:00+01:00",
            "endOfSaleTime": "2021-03-14T23:59:00+01:00",
            "maxCancellationDate": "2021-05-16T00:00:00+02:00",
            "requiresPersonalisation": false,
            "requiresPoliceAuthorisation": false,
            "uniqueVisitor": false,
            "isChangeOfNamesAllowed": false,
            "description": "Soccer Game",
            "information": "",
            "searchTerms": "FC, Bundesliga",
            "performer": [
                {
                    "name": "1. FC Verein",
                    "imgUrl": "events/opponents/home/1/6/../url.jpg",
                    "type": "home"
                },
                {
                    "name": "TUS Verein",
                    "imgUrl": "events/opponents/home/1/9/../differenturl.svg",
                    "type": "guest"
                }
            ],
            "venue": {
                "id": 4000,
                "name": "Stadion des FC",
                "isFancardStadium": false,
                "fiscalCode": ""
            },
            "ticketServer": "192.168.0.1"
        }
    ],
    "validTickets": [
        "26123456789-1",
        "26123456789-2"
    ]
}
Example payload ORDER_TICKET_UPDATE
{
    "id": "26123456789-1",
    "type": "single",
    "isClubSale": false,
    "isVirtualTicket": false,
    "canBeTransfered": false,
    "isBlockedInAC": false,
    "needsPersonalisation": false,
    "affiliateId": 1000,
    "userId": 1080000,
    "eventURL": "Event/100000/",
    "eventDescription": "Soccer Game",
    "customerId": "abc123123123",
    "areaId": 1212121,
    "areaLabel": "Block A",
    "areaURL": "Event/100000/Area/200000/",
    "seat":
    {
        "rowId": 0,
        "rowLabel": "A",
        "seatId": 50,
        "seatLabel": "A51",
        "priceCategoryId": 133208,
        "priceCategoryName": "Normalpreis PK2",
        "uniqueSeatId": "1211087000286"
    },
    "totalPrice": "13.00E",
    "totalPriceIso":
    {
        "amount": "13",
        "currency": "EUR"
    },
    "priceComponents":
    [
        {
            "amount": "13.00",
            "isoAmount":
            {
                "amount": "13",
                "currency": "EUR"
            },
            "isoNetAmount":
            {
                "amount": "10.92",
                "currency": "EUR"
            },
            "currency": "EUR",
            "type": "base",
            "vat": "0.1900",
            "isoVatAmount":
            {
                "amount": "2.08",
                "currency": "EUR"
            }
        }
    ],
    "status": "B",
    "isPrinted": false,
    "prePrinted":
    {
        "ticketsPrePrinted": false
    },
    "invoiceId": "26123456789",
    "barcode": "AB00008899801400000099",
    "eventData":
    {
        "id": 300000,
        "competitionId": 5000,
        "competitionName": "Bundesliga",
        "name": "1. Heimspiel",
        "type": "single",
        "status":
        [
            "active",
            "informational"
        ],
        "vatCode": "",
        "isFiscal": false,
        "isDeletable": false,
        "startTime": "2021-03-14T20:00:00+01:00",
        "endTime": "2021-03-14T22:00:00+01:00",
        "endOfSaleTime": "2021-03-14T23:59:00+01:00",
        "maxCancellationDate": "2021-05-16T00:00:00+02:00",
        "requiresPersonalisation": false,
        "requiresPoliceAuthorisation": false,
        "uniqueVisitor": false,
        "isChangeOfNamesAllowed": false,
        "description": "Soccer Game",
        "information": "",
        "searchTerms": "FC, Bundesliga",
        "performer":
        [
            {
                "name": "1. FC Verein",
                "imgUrl": "events/opponents/home/1/6/../url.jpg",
                "type": "home"
            },
            {
                "name": "TUS Verein",
                "imgUrl": "events/opponents/home/1/9/../differenturl.svg",
                "type": "guest"
            }
        ],
        "venue":
        {
            "id": 4000,
            "name": "Stadion des FC",
            "isFancardStadium": false,
            "fiscalCode": ""
        },
        "ticketServer": "192.168.0.1"
    }
}
Recommended mapping (for all the options please refer to webhook payload of ORDER_TICKET_UPDATE):
Attribute
Description
Expl value
Default mapping in Unidy
id
Unique identifier of the ticket
26123456789-1
reference
type
Type of ticket
single / subscription_ticket
ticket_category_id or subscription_category_id
isClubSale
Indicates if it's a club sale
false / true
metadata
isVirtualTicket
Indicates if it's a virtual ticket
false / true
metadata
canBeTransfered
Indicates if ticket can be transferred
false / true
metadata
needsPersonalisation
Indicates if ticket needs personalization
false / true
metadata
eventURL
URL of the event
Event/100000/
metadata
eventDescription
Description of the event
Soccer Game
metadata
areaId
ID of the seating area
1212121
metadata
areaLabel
Label of the seating area
Block A
metadata
areaURL
URL of the seating area
Event/100000/Area/200000/
metadata
seat.rowId
Row ID of the seat
0
metadata
seat.rowLabel
Label of the row
A
metadata
seat.seatId
Seat ID
50
metadata
seat.seatLabel
Label of the seat
A51
metadata
seat.priceCategoryId
Price category ID
133208
metadata
seat.priceCategoryName
Name of the price category
Normalpreis PK2
metadata
seat.uniqueSeatId
Unique seat ID
1211087000286
metadata
totalPriceIso.amount
Total price amount in ISO format
13
price
totalPriceIso.currency
Total price currency in ISO format
EUR
metadata
status
Payment status of ticket (B → paid; Z → returned)
B / Z
metadata
barcode
Barcode of the ticket
AB00008899801400000099
metadata
eventData.competitionId
ID of the competition
5000
metadata
eventData.competitionName
Name of the competition
Bundesliga
metadata
eventdata.name
Name of the event
1. Heimspiel
title
eventData.type
Type of the event
single
metadata
eventData.startTime
Start time of the event
2021-03-14T20:00:00+01:00
starts_at
eventData.endTime
End time of the event
2021-03-14T22:00:00+01:00
ends_at
eventData.maxCancellationDate
Max cancellation date of the event
2021-05-16T00:00:00+02:00
metadata
eventData.description
Description of the event
Soccer Game
text
eventdata.performer.name
Name of the performer
1. FC Verein, TUS Verein
metadata
eventData.performer.imgUrl
Image URL of the performer
events/opponents/home/1/6/../url.jpg, events/opponents/home/1/9/../differenturl.svg
metadata
eventData.performer.type
Type of the performer (home/guest)
home, guest
metadata
eventdata.venue.id
ID of the venue
4000
metadata
eventdata.venue.name
Name of the venue
Stadion des FC
venue

Configuration options

  • Ticket Sync Enabled (true/false): Enables the synchronization of ticket data to Unidy
  • Sync seasonal tickets as (Subscription/Ticket): Allows you to choose whether the synchronized ticket should be created in Unidy as subscription or ticket object
  • Update fields with empty value (true/false): If we receive a ticket update with an empty attribute, that has previously been non-empty, you can decide to not overwrite this information with the empty values.
  • Use category title and description if blank (true/false): If you don’t setup a value mapping for the category IDs (ticket / subscription), or if the given attribute doesn’t match any mapped values, we can use a fallback ID.
    • Fallback ticket category: The ticket category you want to use by default or fallback.
    • Fallback subscription category: The subscription category you want to use by default or fallback.
  • Ticket Sync Service ID (e.g. 5): Allows you to choose a corresponding service determining the API access to these data at the later stage
  • Ticket Sync Subscription Category ID (e.g. 442e9873-9d71-44f6-81ab-6517e59ac36f): Allows you to map tickets to the corresponding ticket categories in Unidy
  • Create missing users when syncing tickets (true/false): If set to true the corresponding user will be created in Unidy in case it’s not there yet. If set to false ticket will not be created in Unidy

Integration use cases

For the possible use cases please refer to Eventim x Unidy Use Cases

 
Did this answer your question?
😞
😐
🤩