Connect ticketing to your existing website (with code examples)

Add MijnEvent as drop-in ticketing on your own site: one script line for the widget, four templates in your own branding that also drive your event pages, and a signed member token for member prices. Includes a PHP example.

Photo: Elijah Ekdahl / Unsplash

Already have a website for your association, sports club or organisation? Then you don't have to send visitors away to buy tickets. MijnEvent runs as a drop-in on your own site: you paste one script line and a div, and the ticket widget appears — including checkout, without the visitor leaving your site. The most powerful part is the member connection: because the member is already logged in on your website, that website can pass a signed token with each purchase that says "this is a member". MijnEvent then applies the member price or free entry automatically, while non-members pay the regular rate. Nothing is synchronised or copied — your member administration stays the source of truth and the status is always correct at the moment of purchase. Below we show how to apply it, with a working code example for developers. The step-by-step setup guide for admins is in the knowledge base article Members free, non-members pay.

1. The widget on your site (recommended: the script embed)

In your admin under Integrations the embed code is ready. The recommended option is one script line plus one div — the widget measures its own height and resizes the iframe automatically, so you don't have to guess a fixed height:

<div data-mijnevent-event="summer-festival-2026"></div>
<script src="https://yourclub.mijnevent.nl/embed.js" async></script>

You can place multiple events on a single page by adding multiple divs. There is also a simple iframe variant, but it requires you to set the height yourself (with long ticket lists or the checkout step the content then gets cut off) — only use that if you can't place a script.

2. The look: the embed studio

Your ticket shop should match your event, not the other way around. In Branding → Embed studio you choose organisation-wide how the widget looks, with a live preview of the real widget:

  • Template: Classic (the familiar list), Hero (a large photo with your logo and the event title over the image), Compact (minimal, for sidebars and narrow spots) or Steps (step-by-step checkout with a progress indicator: tickets → details → overview → payment).
  • Theme: light, dark or automatic (follows the visitor's system preference). For the dark theme you can upload a separate light logo variant.
  • Branding options: show your logo, corner rounding (sharp/soft/round), button style (filled or outline — the button text colour is picked automatically for safe contrast), a transparent background so the widget blends into your site, and full width.

Your brand colours and fonts from Branding carry through everywhere — including success and error messages and even the confetti. The embed code itself doesn't change: saving the settings is enough, and every existing embed renders in the new style immediately.

One choice drives your entire visitor-facing side

What you pick here isn't limited to the widget on your own site. The same template and theme also drive your public event pages on your MijnEvent subdomain and your module storefronts — rentals, shop, food, courses, memberships, donations and the rest. Pick Hero and your event page gets the same large photo header as your widget; pick Compact and everything turns tighter and narrower. So you don't choose again per surface, and a visitor clicking through from your own site to your event page doesn't suddenly see a different product.

That's why the preview switches along: you can preview the widget, a real event page or a module storefront, including colours you haven't saved yet.

The seller is stated clearly

Below the widget and below your public pages there's a short seller notice: "You're buying tickets from {your organisation} — not from MijnEvent", together with your legal seller details (email, phone, address, chamber of commerce and VAT number). MijnEvent provides the platform and handles the payment; you remain the seller, responsible for the event, cancellations and refunds. The wording adapts to the surface — renting, ordering, booking or donating instead of buying. You don't have to do anything for it; it appears automatically, including inside the embed on your own site.

3. A member price or members-only ticket type

For a ticket type you set two things in the admin:

  • Access: Public or Members only (members-only ticket types are hidden from the public).
  • Member price: empty (members pay normal), 0 (free for members) or a lower amount (member discount).

4. The member token (for developers)

When a logged-in member buys tickets on your site, your server signs a short-lived JWT with the secret key from Integrations. It's a plain HS256 token; you don't need a library for it:

<?php
// On your own server, for a logged-in member:
function mijneventMemberToken(string $keyId, string $secret, array $claims): string {
    $b64 = fn ($d) => rtrim(strtr(base64_encode($d), '+/', '-_'), '=');
    $header  = $b64(json_encode(['typ' => 'JWT', 'alg' => 'HS256', 'kid' => $keyId]));
    $payload = $b64(json_encode($claims));
    $sig     = $b64(hash_hmac('sha256', "$header.$payload", $secret, true));
    return "$header.$payload.$sig";
}

$token = mijneventMemberToken('mek_...', 'msk_...', [
    'aud'     => 'yourclub',                // your organisation ID
    'sub'     => $member->id,               // membership number
    'email'   => $member->email,
    'scope'   => 'event:summer-festival-2026', // limit to one event
    'max_qty' => 2,                         // e.g. member + 1 guest
    'iat'     => time(),
    'exp'     => time() + 900,              // valid for 15 minutes
]);

Pass the token to the widget — server-side rendered, so the secret key never reaches the browser:

<div data-mijnevent-event="summer-festival-2026" data-member-token="<?= $token ?>"></div>
<script src="https://yourclub.mijnevent.nl/embed.js" async></script>

What MijnEvent checks

Both when displaying and at checkout, MijnEvent re-verifies the token: the signature (via the kid → secret key), the aud (must be your organisation), the exp (expiry), and a single-use jti against replay. In addition, scope determines which event is unlocked and max_qty how many member tickets get the member price. If the token is invalid or expired, the visitor is simply treated as a paying non-member — nothing breaks.

Endpoints

  • POST /api/members/verify-token — verify a token (read-only) to show member prices and members-only ticket types before checkout.
  • POST /api/checkout — pass the token as member_token; the member price is applied and members-only ticket types are released.

Which approach do you choose?

  • Club site with member login → the token connection (this approach). Always in sync, no member list needed.
  • No member login → unique discount codes per member (simpler, more manual).
  • Large membership system (Conscribo, AllUnited, Sportlink, LISA) → a custom connection; get in touch.

Get started

Set it up in an evening: create an API key, set a member price on a ticket type, and place the embed. The full admin guide is in the knowledge base article Members free, non-members pay; more explanation is in the knowledge base. Questions about the setup for your organisation? We're happy to help.

Frequently asked questions

Frequently asked questions

How do I add the MijnEvent ticket widget to my website?

Paste one script line and a div with the event's data attribute; the widget renders and measures its own height, resizing the iframe automatically. You can place multiple events on one page by adding more divs.

How do members get their member price automatically?

Your server signs a short-lived HS256 JWT with the secret key from Integrations and passes it to the widget as a member token. MijnEvent verifies it and applies the member price or free entry, while non-members pay the regular rate.

What happens if the member token is invalid or expired?

The visitor is treated as a paying non-member and nothing breaks. MijnEvent re-verifies the signature, audience, expiry and a single-use jti both when displaying prices and at checkout.

Does the styling from the embed studio also apply to my event pages?

Yes. Template, corner rounding, button style and your brand colours apply to the widget on your own site, to your public event pages on your MijnEvent subdomain and to your module storefronts such as rentals, shop and food. You choose once; the embed code itself doesn't change.

Who is the seller when someone buys through the widget?

Your organisation. Below the widget and your public pages a seller notice appears automatically with your legal details: you're buying from the organiser, not from MijnEvent. MijnEvent provides the platform and handles the payment; the organiser is responsible for the event, cancellations and refunds.
Back to blog
MijnEvent

Minors and tickets: can a 15-year-old buy a ticket on their own?

A teenager buys two weekend passes, a parent calls and wants the money back. What Dutch law says about minors as buyers, what data you may ask them for, and how to check an age limit without collecting copies of ID cards.

Visitors with disabilities: getting companions, tickets and the entrance right

A free ticket for the companion, an accessible toilet that is actually unlocked, and someone who has the key. Accessibility at your event is mostly about execution. Here is how to arrange it, from ticket shop to gate.

Filling blank city cards afterwards: put credit on a whole stack at once

Have blank cards printed for free and put credit on them later: a range of sequence numbers from a batch, or individual cards by their pass code. The fee goes on your monthly invoice.