# Documentatie & support

Op deze pagina's vind je een stap voor stap gebruikershandleiding voor de ticketsoftware van VoordeMensen. Klik in de menubalk aan de linkerzijde op het onderwerp van je keuze voor meer informatie.&#x20;

Voor sommige functies is nog geen online documentatie beschikbaar. Wanneer je het antwoord op je vraag niet kunt vinden op deze pagina's, neem dan svp contact met ons op via <support@voordemensen.nl> of 020 - 427 27 28.

**For developers:** please go to 'API & Integrations' in the menu to the left for technical documentation in English.


# Algemeen

## Homepage

Op de startpagina van het Dashboard vind je direct de belangrijkste gegevens. Je kunt hier zien hoeveel kaarten je in het huidige kalenderjaar verkocht, gereserveerd en vergeven hebt. Ook vind je hier recente notificaties, de verbindingsstatus van je ticketprinter en de mogelijkheid om live scan statistieken van actuele evenementen te bekijken.

## Instellingen

In de rechter bovenhoek van het dashboard vind je de instellingen en VoordeMensen nieuwsberichten. Hier kun je meer lezen over updates en nieuwe functies. Door op 'instellingen' te klikken kun je je wachtwoord wijzigen en wanneer je gearchiveerde data hebt (bijvoorbeeld van festivals van voorbije jaren), dan kun je daar op deze plek verbinding mee maken.


# Bestellingen

In het menu 'Bestellingen' vind je een aantal overzichtspagina's die het makkelijk maken om de juiste bestelling te vinden. Je kunt bestellingen zoeken op naam, bestelnummer, e-mailadres of status. Wanneer je de juiste bestelling gevonden hebt, kun je deze aanklikken om op de detailpagina van die bestelling te komen. Daar kun je alle nodige informatie over de bestelling vinden en zo nodig aanpassingen doen zoals het wijzigen van het e-mailadres, het omboeken, toevoegen of verwijderen van tickets, het annuleren van de gehele bestelling en het doen van een terugstorting.


# Overzichtspagina's

## De bestelstatus

Iedere bestelling heeft een status die bestaat uit 3 delen:

**Bestel:** ord of cancel

* **ord:** order is aangemaakt
* **cancel:** de order is geannuleerd. Dit gebeurt automatisch wanneer iemand te lang wacht met betalen bij een online bestelling.&#x20;

**Betaal:** none of paid

* **none:** de order is niet betaald
* **paid:** de order is betaald

**Verzend:** none of send

* **none:** de order is niet verzonden. Er zijn nog geen tickets uitgegeven.&#x20;
* **send:** de order is verzonden. Er zijn tickets gemaild of geprint. Dit gebeurt automatisch wanneer een online bestelling betaald wordt.&#x20;

## **Gangbare bestelstatussen**&#x20;

* **ord/paid/send:** de bestelling is geslaagd
* **ord/paid/none**: een betaalde order die nog niet verzonden is, bijvoorbeeld een betaalde reservering &#x20;
* **ord/none/none:** een bestelling die die nog niet betaald is, bijvoorbeeld een reservering of een online bestelling die nog gaande is&#x20;
* **cancel/none/none:** niet voltooide bestelling, de plaatsen zijn weer vrijgegeven  &#x20;
* **cancel/paid/send:** de bestelling is verwijderd via dashboard

## Wat betekenen de kleuren?

De kleuren zijn bedoeld om de status sneller te kunnen zien:

* Groen: de bestelling is geslaagd
* Geel: de bestelling is betaald, maar er zijn nog geen tickets verzonden (betaalde reservering)
* Blauw: de bestelling is nog niet betaald (onbetaalde reservering)
* Rood: de bestelling is geannuleerd
* Wit: de bestelling is handmatig verwijderd

## De pagina 'alle bestellingen'

* Hier zie je een overzicht van alle bestellingen.
* Hier kom je ook uit als je via home op betaalde bestellingen klikt.

## De pagina 'met donatie'

Hier zie je alle bestellingen waarbij mensen een donatie gedaan hebben. Tevens kan je hier:

* het totaalbedrag aan donaties zien
* een export maken van de bestellingen

## De pagina 'per evenement'

Op deze pagina krijg je eerst een overzicht van evenementen te zien. Deze kun je zo nodig doorzoeken en sorteren. Wanneer je het juiste evenement gevonden hebt, kun je dat aanklikken om alle bestelling voor dat evenement te bekijken. Tevens kan je hier zien:

![](/files/-M0wk3QCvRJMEK59ITH0)

* Wat de naam van het evenement is
* Op welke datum het evenement plaatsvindt
* Op welk tijdstip het evenement plaatsvindt&#x20;
* Hoeveel kaarten er per evenement verkocht zijn
* Hoeveel kaarten er nog in iemands (online) winkelmandje zitten
* Wat de capaciteit per evenement is
* Wat de status is (kolom meest rechts)
  * Als het evenement in de verkoop/ gepubliceerd is, staat er ''pub''
  * Als het evenement (nog) niet in de verkoop is, staat er ''nosal''

## De pagina 'per betaalmethode'

Hier kun je alle bestellingen per betaalmethode selecteren (kolom meest rechts).&#x20;


# Detailpagina

Wanneer je een bestelling aanklikt op een van de overzichtspagina's, dan kom je op de detailpagina van die bestelling. Hier kun je gedetailleerde informatie vinden en wijzigingen doorvoeren.

## Besteldetails

In het balkje bovenin het blok ''besteldetails'' vind je vijf knoppen. Van links naar recht zijn dat:\
**1. Print op BOCA:** Wanneer je hier op klikt, worden de tickets van de bestelling naar je ticketprinter gestuurd. Dit werkt alleen wanneer je een BOCA printer geïnstalleerd hebt en deze online iis.\
**2. PDF met tickets:** Wanneer je hier op klikt wordt er een PDF geopend met de tickets van de bestelling. Deze kun je bijvoorbeeld mailen aan de klant of printen op een normale (A4) printer.\
**3. Factuur:** Wanneer je hier op klikt wordt er een PDF geopend met de factuur van de bestelling. Bezoekers krijgen na het betalen van hun online bestelling de mogelijkheid om de factuur te downloaden, maar op deze manier kun je die ook nog achteraf aan ze mailen.\
**4. Verstuur opnieuw:** Wanneer je hier op klikt worden de tickets opnieuw gemaild naar het e-mailadres van de bezoeker.\
**5. Verwijder:** Wanneer je hier op klikt wordt de gehele bestelling verwijderd. De bijbehorende plaatsen worden weer beschikbaar gemaakt en de status van de bestelling verandert in ''cancel''.

Als een bestelling nog niet betaald is, dan kun je deze bij de besteldetails als betaald markeren. Wanneer je dit doet, wordt de omzet van de bestelling meegeteld in de rapportages. Doe dit dus in principe alleen wanneer je ook echt een betaling hebt ontvangen, anders ontstaat er een kastekort. Selecteer bij betaalmethode de manier waarop je het geld ontvangen hebt (bijvoorbeeld contant of factuur), vervolgens kun je kiezen of er wel of geen tickets naar de bezoeker gemaild moeten worden.

Als een bestelling online betaald is, dan kun je bij de besteldetails ook een terugstorting doen. Je kunt het hele bedrag terugstorten of een deel daarvan. Dat laatste is praktisch wanneer iemand bijvoorbeeld per ongeluk te veel tickets besteld heeft. Wanneer je een terugstorting doet, worden de tickets niet automatisch verwijderd. Nadat je het bedrag hebt terug gestort kun je de gehele order verwijderen of, in het geval van een gedeeltelijke terugstorting, alleen de betreffende ticket(s).

## Klantdetails

Bij ''Klantdetails'' vind je de gegevens van de bezoeker. Je kunt deze hier ook wijzigen. Dit is bijvoorbeeld praktisch wanneer iemand bij het bestellen een verkeerd e-mailadres heeft ingevuld. Je kunt het e-mailadres dan verbeteren en vervolgens de tickets opnieuw mailen.

## Notities

In de notities zie je alle acties die automatisch of via dashboard zijn toegepast op de bestelling. Bijvoorbeeld dat er een betaling is ontvangen via Mollie, dat er een service mail is ingepland of dat er een ticket is omgeboekt.

## Tickets

Hier vind je een lijst met alle tickets die deel uitmaken van de bestelling. Ieder ticket heeft een uniek ID (geheel links), wanneer je tickets wilt omboeken, dan kan dat op basis van dit nummer. Je kunt op deze plaats ook individuele tickets verwijderen met het prullenmandje (geheel rechts). Let op: als je een betaald ticket verwijdert, maar geen terugbetaling doet, dan creëer je een kasoverschot. Wanneer een bestelling geannuleerd is, dan zijn de bijbehorende plaatsen weer beschikbaar gemaakt. In dat geval zijn er dus geen tickets meer aan de bestelling gekoppeld en is dit overzicht leeg. &#x20;

## Tickets omboeken

Hier kun je één of meer tickets selecteren en omboeken naar een andere voorstelling. Dit kun je bijvoorbeeld gebruiken wanneer mensen per ongeluk kaarten voor de verkeerde datum besteld hebben. De oude tickets worden verwijderd en er worden nieuwe tickets toegevoegd. Je krijgt daarbij de mogelijkheid om de nieuwe tickets direct aan de bezoeker te mailen. Let op: omboeken is bedoeld om met ''gesloten beurs'' te werken: de nieuwe tickets worden automatisch tegen de zelfde prijs geboekt als de oude tickets. Wanneer kaarten wilt omwisselen voor een nieuwe voorstelling met een afwijkende prijs, dan kan hierdoor een prijsverschil ontstaan. In dat geval kun je beter de oude tickets verwijderen en nieuwe tickets bijboeken (zie hieronder). Zorg daarbij dan wel dat je het verschil terugbetaalt aan - of ontvangt van - de bezoeker, anders ontstaat er een kasverschil.

## Tickets bijboeken

Hier kun je nieuwe tickets aan de bestelling toevoegen. Je kunt daarbij zowel het evenement als de kaartsoort (korting) selecteren. Zo kun je bijvoorbeeld een extra vrijkaart toevoegen aan de reservering van een genodigde. Nadat je de kaarten hebt toegevoegd, kun je de tickets desgewenst opnieuw mailen aan de bezoeker. Let op: als je niet-gratis kaarten bijboekt in een betaalde bestelling, dan wordt de bijbehorende omzet in het systeem geregistreerd. Zorg in zo'n geval dus altijd dat je ook daadwerkelijk een betaling hebt ontvangen, anders ontstaat er een kastekort.


# Evenementen

Op de pagina ''evenementen bewerken'' vind je de belangrijkste informatie over je evenementen. Hier staat een overzicht van al je evenementen, kun je nieuwe evenementen toevoegen en bestaande evenementen wijzigen. Op de overige evenementen pagina's vind je nog een aantal aanvullende functies.

## Main events & sub events

Evenementen zijn in VoordeMensen altijd opgebouwd uit *main events* en *sub events*. Een main event is overkoepelend en bevat in ieder geval de meest algemene informatie: titel en omschrijving. Een sub event bevat alle details: datum, tijd, locatie, toegangsprijs. Bij ieder main event hoort minstens één sub event, maar dit kunnen er ook meerdere zijn, bijvoorbeeld bij een voorstelling die op verschillende dagen gespeeld wordt. Je kunt vanaf je website zowel linken naar een main event (de bezoeker kiest dan zelf een datum) als naar een sub event (de betreffende datum is al voorgeselecteerd).


# Evenementen bewerken

## De pagina 'Evenementen bewerken'

Op deze pagina kun je zowel nieuwe evenementen toevoegen als bestaande evenementen bewerken.

### A. Nieuwe evenementen toevoegen

Rechts bovenaan de pagina, in de blauwe balk, staat de knop ''voeg een evenement toe''. In 4 stappen maak je een nieuw evenement aan:

1. Kies wat voor evenement je wilt aanmaken
2. Voer de details in
3. Vul in welke kortingen voor jouw evenement gelden
4. Controleer je gegevens&#x20;

Je evenement is aangemaakt!&#x20;

### 1. wat voor evenement wil je aanmaken

#### Één- of meerdaags evenement

Hier kies je voor als een evenement hebt dat één of meerdere dagen duurt en waarbij bezoekers een kaartje kopen voor het evenement als geheel. Dit is bijvoorbeeld het geval bij een festival met algemene entree of bij een theatervoorstelling die maar 1 keer gespeeld wordt.

#### Voorstelling met meerdere uitvoeringen

Hier kies je voor als je een voorstelling hebt die meerdere keren gaat spelen. In stap 2 kan je bij deze optie meerdere dagen en tijden kiezen. Dit geldt bijvoorbeeld voor een toneelstuk dat op verschillende dagen gespeeld wordt of voor een expositie met meerdere tijdslots.

#### 3. Combinatietickets

Een combinatieticket is een arrangement dat bestaat uit meerdere voorstellingen, of bijvoorbeeld een voorstelling plus een diner, en dat je als ''pakket'' te koop wilt aanbieden. Voordat je een combinatieticket kunt aanmaken, maak je eerst alle onderdelen daarvan aan als individueel evenement.

Als je voor deze optie kiest, maak je alleen een nieuw main event aan waar je bestaande sub events onder hangt.

{% hint style="success" %}
Je verdeelt zelf de prijs van het combiticket over de voorstelling(en).&#x20;
{% endhint %}

{% hint style="danger" %}
Je kan niet meer combitickets verkopen dan dat er capaciteit is bij de voorstelling met de laagste capaciteit.&#x20;

VB Als je 75 combitickets wil verkopen, maar 1 van de voorstelling heeft maar plek voor 10 mensen, zal het systeem maximaal 10 combitickets in de verkoop doen.&#x20;
{% endhint %}

### 2. Voer de details in

\- Datum\
\- Tijd\
\- Titel van je evenement\
\- Naam gezelschap of organisator\
\- Locatie\
\- Capaciteit\
\- Prijs\
\- BTW percentage (kaartjes in de culturele sector vallen normaliter onder het lage BTW-tarief van 9%. Valt jouw evenement hier niet onder? Dan kan je dit aanpassen naar 21%.

Als je voor een voorstelling meerdere uitvoeringen hebt gekozen, kan je hier meerdere dagen en/of tijdstippen invoeren

### Kortingen&#x20;

Hier kun je kortingsprijzen toevoegen zoals JCP, student et cetera. Dit is optioneel, als je hier niets invult geldt alleen de standaard prijs die je eerder hebt ingevuld.  Je kunt later altijd nog kortingen toevoegen via de ''kortingen'' pagina.

### B. Bestaande evenementen bewerken

Elke evenement dat je aanmaakt, bestaat uit een main event en een sub event. Alle voorstellingen met dezelfde titel, vallen onder hetzelfde main event . Dus een voorstelling die meerdere keren speelt heeft 1 main event en meerdere sub events.

Bovenin zie je allerlei relevante informatie zoals titel, datum, tijd, prijs, capaciteit, aantal vrije kaartje en de status. Veel van deze dingen kan je hier aanpassen.

![](/files/-M0wxgE31bpBG4emZrYi)

### Main event

In het main event kan je verschillende dingen aanpassen:

#### + Voeg toe

Je kan een extra sub event aanmaken.

{% hint style="danger" %}
Als je op toevoegen klikt, lijkt er niets te gebeuren. Als je daarna op annuleren of het kruisje klikt, verschijnt het nieuwe event vanzelf.&#x20;

Het duurt even voordat je nieuwe event verschijnt. Heb je op toevoegen geklikt en gebeurt er niets? Wacht dan nog even, hij verschijnt vanzelf.
{% endhint %}

#### Kopieer link

Hiermee kopieer je de directe verkooplink naar je klembord.

#### Archiveer

Om de lijst met evenementen overzichtelijk te houden, kan je een evenement dat is afgelopen archiveren.

#### Bewerk

Hier kan je de naam van alle events aanpassen. Stel dat de titel niet goed geschreven is, kan je die via het main event allemaal aan passen.&#x20;

De precieze details pas je echter via de sub events aan. Achter elk sub event staan vier knoppen. Daar kan je nog meer dingen aanpassen

### Sub events

{% hint style="warning" %}
Je past nu per sub event details aan. Moet de capaciteit bijvoorbeeld aangepast worden, dan kun je dat bij elk sub event afzonderlijk doen.&#x20;
{% endhint %}

![](/files/-M0x0nT2gMws_ac9F3Sh)

![](/files/-M0x28AErAGtClRukVjG)

**Capaciteit**: Via bovenstaande knop kan je de capaciteit naar boven of naar beneden aanpassen. Let op: je kunt de capaciteit nooit lager zetten dan het aantal tickets dat al verkocht is.

![](/files/-M0x24_gvZH4cHggZ0SI)

**Start of pauzeer verkoop:** via bovenstaande knop kan je de verkoop starten of pauzeren. Een event dat gepauzeerd is, verschijnt niet op de kalender/bestelpagina.

{% hint style="info" %}
Als je de capaciteit aan wil passen, moet je de verkoop tijdelijk even pauzeren. Als je de capaciteit hebt aangepast, zet je de verkoop weer aan.
{% endhint %}

![](/files/-M0x2AvCZOAIYuN_XoaA)

**Verwijder:** hier kun je een evenement mee verwijderen

{% hint style="info" %}
het verwijderen van een evenement kan alleen als er geen kaarten voor verkocht zijn en als het evenement gepauzeerd is. Het verwijderen van een evenement kan niet ongedaan gemaakt worden.
{% endhint %}

![](/files/-M0x2st9c7REtjnHARHs)

**Bewerken:** hier kun je een sub event mee bewerken. Bijvoorbeeld als de datum of de tijd aangepast moet worden.

##


# Blokkades

Vanaf de **Evenementen -> Bewerken** pagina kun je stoelen/plaatsen blokkeren, maar ook VIP-links aanmaken zodat geselecteerde bezoekers geblokkeerde plaatsen kunnen boeken.

***

Klik op het "wijzig stoelenplan" of "wijzig capaciteit" icoon. Vervolgens kunnen blokkades per categorie worden gedefinieerd.

Het systeem onderscheidt de volgende categorieën:

| Type Code | Omschrijving | Veelgebruikt voor            |
| --------- | ------------ | ---------------------------- |
| `block`   | Capaciteit   | Algemene reserveringen       |
| `perf`    | Bespeler     | Artiesten, crew, organisatie |
| `group`   | Groep        | Groepsverkoop                |
| `press`   | Pers         | Recensenten, media           |
| `wheel`   | Rolstoel     | Rolstoelplaatsen             |
| `tech`    | Techniek     | Mengpaneel, camera, regie    |
| `theat`   | Theater      | Interne theaterreserveringen |
| `sight`   | Zichtlijnen  | Slecht zicht plaatsen        |

### VIP-links

Normaal gesproken zijn geblokkeerde stoelen (zoals pers, bespeler, VIP, etc.) **niet zichtbaar** in de reguliere ticketshop. Met VIP-links kun je een **versleutelde link** genereren die toegang geeft tot specifieke geblokkeerde stoelen.

**Voorbeelden:**

* Geef recensenten toegang tot geblokkeerde persplaatsen
* Laat sponsors VIP-plaatsen boeken zonder contact met de organisatie
* Verkoop groepsplaatsen rechtstreeks aan groepsleiders
* Geef externe partners toegang tot hun blokkades


# Externe barcodes importeren

Heb je kaarten verkocht via een ander systeem of werk je met een gastenlijst van een partner? Je kunt deze externe codes eenvoudig importeren in VoordeMensen zodat je ze met dezelfde scanners kunt controleren.

**Stappen:**

1. Ga in het dashboard naar de externe import pagina van je evenement.
2. **Herkomst (Optioneel):** Vul in het veld 'Herkomst' een duidelijke naam in, bijvoorbeeld de naam van de ticketpartner of de specifieke actie (b.v. "Groupon" of "Sponsor Lijst").
   * *Tip:* Deze tekst wordt in de scan-app getoond als 'naam' van de bezoeker. Zo ziet de scanner direct dat het een geldig extern ticket is.
3. **CSV Uploaden:** Upload je bestand. Het formaat is eenvoudig: je hebt enkel een lijst met barcodes onder elkaar nodig (één code per regel).&#x20;

**Ondersteuning Barcodes & QR-codes** Geïmporteerde codes werken direct samen met de VoordeMensen scan-app.

* **QR-codes:** Standaard ondersteund.
* **Streepjescodes (1D):** Vanaf **versie 5.8** van de scan-app kunnen ook traditionele streepjescodes worden gescand via de camera. Zorg ervoor dat je scanners zijn bijgewerkt naar de laatste versie.


# Overige pagina's

## De pagina 'Gearchiveerd'

Hier staan alle evenementen die je gearchiveerd hebt

## De pagina 'Combiticket-prijzen'

Hier staan alle combitickets die je hebt aangemaakt en definieer je de inhoud van de tickets: welke voorstelling zit voor welke prijs in het ticket.

## De pagina 'Producten'

Je kan naast tickets ook producten verkopen: bijvoorbeeld merchandise. Ook passe-partouts vallen hieronder.&#x20;

{% hint style="info" %}
Passe-partouts in VoordeMensen zijn speciale producten: ze bieden niet zozeer toegang tot één evenement maar **ze genereren een kortingscode** die de klant vervolgens kan gebruiken **om onder vooraf gestelde voorwaarden** andere tickets te kopen.\
\
De definitie van de kortingscode bepaalt hoe het passe-partout zich gedraagt. Je kan dus een passe-partout-product maken dat €100 kost en met de code toegang gratis toegang geeft tot álle evenementen. Of dat 90% korting geeft. Op alleen bepaalde evenementen. Onder bepaalde condities. Of alleen 10x waardoor het ineens een strippenkaart is.&#x20;

\
Door passe-partouts te benaderen als dynamische korting -met voor elke besteller een eigen unieke code- ben je dus superflexibel.
{% endhint %}


# Prijzen

In het Dashboard vind je onder "Prijzen" alle mogelijkheden om kaartsoorten, kortingen en andere prijzen te beheren. Het systeem is flexibel opgezet: je kunt het zo uitgebreid maken als je wilt.

### Prijzen voor kaarten en producten

* **Globaal**: Hier staan alle standaard kaartsoorten die voor je hele organisatie gelden
* **Evenementen**: Specifieke prijzen voor evenementen
* **Horeca**: Prijzen voor horecaproducten
* **Passe-partouts**: Beheer van passe-partout prijzen
* **Vouchers**: Cadeaubonnen en tegoedbonnen
* **Overige producten**: Prijzen voor merchandise en andere producten

### Een nieuwe prijs aanmaken

#### Basis instellingen

1. Kies eerst het juiste type (Globaal, Evenement, etc.)
2. Klik op de "+ voeg toe" knop rechtsboven
3. Vul in:
   * **Naam**: De naam van de prijs/korting
   * **Prijstype**: Kies uit:
     * Euro korting (bijv. €2 korting op standaardprijs)
     * Procent korting (bijv. 10% van standaardprijs)
     * Vaste prijs (vervangt de standaardprijs)
     * Vanaf prijs (minimumprijs)

**Korting-op-korting**

Je kunt ervoor kiezen om "Korting-op-korting" te activeren. Hiermee kunnen kortingen worden gecombineerd met andere kortingen, zoals kortingscodes.

{% hint style="info" %}
**Verrekenprijzen**<br>

Met verrekenprijzen kun je een afwijkende prijs instellen voor de financiële afhandeling, zonder dat dit de verkoopprijs beïnvloedt. Dit is handig wanneer:

* Je kaarten verkoopt namens een andere organisatie met een andere inkoopprijs
* Er speciale afspraken zijn over de verdeling van opbrengsten
* Je met verschillende tarieven werkt voor verschillende doelgroepen

Net als bij normale prijzen kun je kiezen uit:

* Een vast bedrag korting op de standaardprijs
* Een percentage van de standaardprijs
* Een volledig vastgezette prijs

De verrekenprijs is optioneel - als je deze niet invult, wordt gewoon de normale verkoopprijs gebruikt voor de financiële afhandeling.

*Let op: Verrekenprijzen zijn alleen zichtbaar in de financiële rapportages en hebben geen invloed op wat de bezoeker betaalt.*
{% endhint %}

**Verkoopkanalen**

Je kunt per prijs instellen waar deze geldig is:

* Kassa (Nolita)
* Website
* App

#### Limieten instellen

* **Maximaal gebruik**: Totaal aantal keer dat de prijs gebruikt mag worden
* **Maximum per evenement**: Hoeveel keer bij één evenement
* **Maximum per bestelling**: Bijvoorbeeld bij stadspas/podiumpas kun je instellen dat iedereen zijn eigen kaartje moet bestellen (max. 1 per order)
* Vul '0' in voor ongelimiteerd gebruik

#### Geldigheid en Uitzonderingen

* Stel start- en einddatum in indien gewenst
* Je kunt specifieke voorstellingen uitsluiten van een algemene korting
* Bij evenementspecifieke kortingen kun je kiezen voor:
  * Geldig bij één specifiek evenement
  * Geldig bij een hoofdevenement en alle sub-evenementen

### Monitoring

* In het overzicht zie je een teller die bijhoudt hoe vaak elke prijs/korting is gebruikt
* Bij kortingscodes kun je het gebruik per code monitoren

### Veelgestelde vragen

#### Waar vind ik mijn bestaande kaartsoorten?

Al je bestaande kaartsoorten staan onder "Prijzen -> Globaal". Je kunt ze daar blijven gebruiken zoals je gewend bent.

#### Kan ik prijzen kopiëren?

Nee, maar je kunt wel eenvoudig een nieuwe prijs aanmaken met dezelfde instellingen.

#### Wat gebeurt er met actieve kortingen als ik ze aanpas?

Wijzigingen gaan direct in. Let dus op met het aanpassen van actieve kortingen.


# Locaties

Hier kun je je locaties beheren - standaard ongeplaceerde zalen, maar ook stoelenplannen.

## Hoe kan ik de capaciteit van een locatie veranderen?&#x20;

De capaciteit vul je per voorstelling/evenement in.&#x20;

Omdat er meerdere opstellingen in een zaal mogelijk zijn, vul je geen standaard-capaciteit per locatie is, maar vul je dit per evenement in. Ook blokkeren beheer je per evenement.

## Wat gebeurt er met de gegevens die ik hier invul?

Naam en adres van de locatie worden beschikbaar als *mergetags* in je ticket- en emailtemplates. Op de Apple Wallets komen ze automatisch te staan. Als we op verzoek de "festival-in-de-buurt-modus" activeren wordt er op basis van de locatie aangegeven welke ándere locatie op fietsafstand is.

## Hoe werkt placering?

Voor geplaceerde verkoop is een interactieve plattegrond nodig. Deze kunnen wij op verzoek voor je aanmaken. Hier kun je vervolgens rangen en standen toekennen aan de stoelen. Wil je geplaceerd verkopen? Neem dan contact met ons op om de mogelijkheden te bespreken.


# Bezoekers

## Alle bezoekers

Hier zie je alle bezoekers en hun gegevens:

* Naam bezoeker
* Postcode
* Telefoonnummer
* Email-adres
* Aantal kaarten
* AVG Opt in
* Mailinglijst&#x20;

## Overlappende bezoekers

Ben je nieuwsgierig of de bezoekers van de ene voorstelling overeenkomen met die van een andere voorstelling? Dan kan je hier onderzoeken of er overlap in bezoekers zit. Stel je hebt 2 voorstellingen met hetzelfde thema en je bent benieuwd hoeveel mensen naar beide voorstellingen zijn gegaan, dan kan je dat hier zien. Selecteer simpel 2 voorstellingen waarvan je wilt weten of er overlappende bezoekers zijn.

## Selecteer bezoekers

Je kan bezoekers selecteren die:

* een nieuwsbrief willen ontvangen
* akkoord zijn met incidenteel contact
* een donatie hebben gedaan

{% hint style="info" %}
Als je geselecteerd hebt welke bezoekersgroep je zoekt, vergeet dan niet om daarna op de knop SELECTEER te drukken anders is je selectie niet gemaakt.
{% endhint %}

Tevens kan je hier zien:

* Naam bezoeker
* Email-adres
* (voorkeurs)taal
* AVG opt in
* Mailinglijst?
* Als je zoekt op donaties, kan je ook zien hoeveel geld de betreffende bezoeker gedoneerd heeft


# Rapportages

Voor de meest voorkomende rapportages hebben we standaard-pagina's gemaakt. En met onze Report Builder bouw en bewaar je zélf selecties.

## Betaalmethoden

Hier zie je een overzicht van alle betalingen per betaalmethode

Je kan kiezen voor een totaal overzicht of een overzicht van een specifiek evenement door Alle evenementen (zie pijl) aan te vinken of voor een specifiek evenement te kiezen.

![](/files/-M4EYnl7r3gpqJnRvqyX)

## Bezoekers

Alle bezoekersinformatie vind je hier:

1. download bezoekersinformatie
   1. Dit kan ook weer in totaal of voor een specifiek evenement
2. Samenvatting
   1. Aantal unieke bezoekers
   2. Top 5 herkomststeden
3. Herkomst van je bezoekers op baiss van ingevulde postcode of plaatsnaam

## Borderellen

Per evenement kan je hier een borderel downloaden. Op de borderel kan je zien:

* Datum en tijd + evenement nummer
  * Vallen er meerdere events onder een mainevent, dan zie je die apart staan (zie afbeelding hieronder)
* Locatie
* Totale capaciteit
* Aantal verkochte kaartjes
* Hoeveel kaartjes er per kaartsoort verkocht zijn, voor welke prijs en met welk totaal OF Hoeveel kaartjes er per betaalmethode verkocht zijn
  * Dit stel je in (zie afbeelding hieronder) door te:
    * Groeperen op kaartsoort
    * Op betaalmethode

![](/files/-M4EdU37-A85jkviioaM)

Daarnaast zie je hier zien hoeveel donaties er gedaan zijn, met welk totaalbedrag

## Financiën per dag

Je kiest rechts bovenin zelf een periode. Dat kan een dag, een week, een maand of een jaar zijn. Daarna kan je zien voor welk bedrag er in totaal - gesorteerd per ticketprijs - aan tickets verkocht is.

{% hint style="danger" %}
LET OP: het gaat hier zowel om betaalde als om gereserveerde tickets. Je uiteindelijk inkomsten kunnen dus afwijken van dit bedrag.
{% endhint %}

## Kaartsoorten

Van alle verkooppunten kun je per evenement en per datumreeks kijken hoeveel tickets er verkocht zijn, en hoeveel het totaalbedrag daarvan is.

## Scan-statistieken

Hier kun je zien hoeveel er van elke kaartsoort (staandaard, CJP, studentenkorting etc etc) verkocht en gescand zijn.

## Verkooppunten

Hier kun je per verkooppunt, per evenement de verkoopstatistieken zien.


# Report Builder

Zelf selecties bouwen en bewaren

Onze Report Builder is de snelste en krachtigste manier om je gegevens uit VoordeMensen te halen. Al je gegevens zijn toegankelijk, en je kan zelf selecties maken die je zo simpel of zo ingewikkeld kunt maken als je zelf wilt.

![](/files/xyE0C4EuYFdYu7PjXwhY)

Je kan op twee basismanieren selecteren: **op tickets** en **op bestellingen**. En vervolgens ook nog kiezen of je **verwijderde tickets** in de selectie wilt opnemen of niet.&#x20;

### Verschillende regels, groepen van regels

Vervolgens kun je verschillende regels kiezen. Van e-mailadressen tot verkoopdata, van evenementen tot categorieen en tags. Die regels kun je combineren en vervolgens ook groepen van regels aanmaken.&#x20;

![Gescande tickets van buitenlandse betaalproviders, mits de evenementen een arrangement zijn, met uitzondering van laser-evenementen. Enfin: je kan het zo gek maken als je wilt.](/files/kAFOrp5DhPbcsfJyH6lD)

### Preset

Je kan je selecties bewaren als preset, en ook later je presets weer opvragen.

### Downloaden

Je selecties kun je tonen in de browser of downloaden als Excel-bestand.&#x20;

{% hint style="info" %}
Als je grote selecties hebt (>30.000 regels) kan het even duren voor het downloaden begint. Als het te lang duurt kun je proberen dmv. een datumfilter de selectie op te splitsen in kleinere tranches.
{% endhint %}


# E-mail


# Automatische mails

Na een bestelling, voorafgaand aan of na afloop van een evenement kun je klanten automatisch een e-mail sturen. Denk aan herinneringen, kortingscodes bij extra bestellingen of verzoeken om reviews.

### Wat kun je ermee?

**Voorbeelden:**

* Stuur 1 dag voor de voorstelling een herinnering met praktische info
* Vraag 2 dagen na de voorstelling om een review
* Stuur direct na aankoop een bedankmail met extra informatie
* Herinner bezoekers 1 week van tevoren dat de voorstelling buiten is

***

### Hoe werkt het?

Het systeem controleert **elke 15 minuten** automatisch welke herinneringen verstuurd moeten worden op basis van:

* De datum/tijd van de voorstelling
* De datum/tijd van de verkoop
* De instellingen die je hebt geconfigureerd

**Belangrijk:** Wijzigingen in je reminder configuratie werken direct - je hoeft niets opnieuw in te stellen.

***

### Reminder Aanmaken

#### Stap 1: Ga naar Reminders

Navigeer in het dashboard naar **E-mail > Automatische mails**

#### Stap 2: Nieuwe Reminder Toevoegen

Klik op **+ Nieuwe Herinnering**.

#### Stap 3: Configureer de Reminder

**Basisinstellingen:**

| Veld       | Uitleg                                                     |
| ---------- | ---------------------------------------------------------- |
| **Naam**   | Interne naam voor jezelf (bijv. "1 dag voor voorstelling") |
| **Type**   | **MAIL** (email) of **SMS** (tekstbericht)                 |
| **Actief** | Zet op **Ja** om de reminder in te schakelen               |

***

### Reminder Types

Je kunt kiezen uit 3 verschillende soorten herinneringen:

#### 1. BEFOREEVENT - Voor de voorstelling

Stuurt een herinnering **vóór** het evenement begint.

**Gebruik:**

* "1 dag voor voorstelling: niet vergeten!"
* "2 uur van tevoren: deuren gaan open"
* "1 week voor de show: praktische informatie"

**Tijdstip berekening:**

* Gebaseerd op **event datum + tijd**
* Stuurt X dagen/uren vóór de voorstelling

**Voorbeeld:**

```
Evenement: 24 december 2025, 20:00 uur
Reminder: 1 dag van tevoren
Wordt verstuurd: 23 december 2025, rond 20:00 uur
```

***

#### 2. AFTEREVENT - Na de voorstelling

Stuurt een herinnering **na** het evenement.

**Gebruik:**

* "1 dag na voorstelling: hoe vond je het?"
* "2 dagen later: deel je ervaring op social media"
* "3 dagen na: vraag om review"

**Tijdstip berekening:**

* Gebaseerd op **event datum + eindtijd** (of starttijd + 2 uur als geen eindtijd)
* Stuurt X dagen/uren ná de voorstelling

**Voorbeeld:**

```
Evenement: 20 december 2025, 20:00 - 22:00 uur
Reminder: 1 dag na afloop
Wordt verstuurd: 21 december 2025, rond 22:00 uur
```

***

#### 3. AFTERSALES - Na de aankoop

Stuurt een herinnering na de **verkoopdatum**, onafhankelijk van wanneer de voorstelling is.

**Gebruik:**

* "Direct na aankoop: bedankt voor je bestelling"
* "1 uur na verkoop: extra informatie over het event"
* "3 dagen na aankoop: vergeet niet je tickets te printen"

**Tijdstip berekening:**

* Gebaseerd op **order datum/tijd** (moment van betaling)
* Stuurt X dagen/uren na de verkoop

**Voorbeeld:**

```
Verkoopdatum: 1 december 2025, 14:30 uur
Reminder: 1 uur na verkoop
Wordt verstuurd: 1 december 2025, rond 15:30 uur
```

***

### Timing Instellen

**Kies hoeveel tijd er moet zitten tussen de trigger en de reminder:**

| Getal | Eenheid           | Voorbeeld             |
| ----- | ----------------- | --------------------- |
| `1`   | **HOUR** (uur)    | 1 uur van tevoren     |
| `7`   | **DAY** (dag)     | 7 dagen van tevoren   |
| `2`   | **MONTH** (maand) | 2 maanden van tevoren |

**Let op:**

* Gebruik **DAY** voor de meeste herinneringen (1 dag, 7 dagen, etc.)
* Gebruik **HOUR** alleen voor korte termijn herinneringen (1 uur, 2 uur)
* **MONTH** is zelden nodig

***

### Email Template Koppelen

Koppel een **email template** aan je reminder:

1. Ga naar **E-mail > Templates**
2. Maak een nieuwe template aan (of kies een bestaande)
3. Gebruik variabelen zoals `%FIRSTNAME%`, `%EVENTNAME%`, `%EVENTDATE%`, etc.
4. Selecteer deze template bij **Template** in de reminder instellingen

Zie ook: E-mail Templates Aanpassen

***

### Filteren op Events of Locaties

**Standaard:** De reminder geldt voor **alle** bestellingen.

**Filteren:**

* **Specifieke events:** Kies één of meerdere events om de reminder alleen voor díe events te versturen
* **Specifieke locaties:** Kies één of meerdere locaties om de reminder alleen voor events op díe locaties te versturen

**Voorbeeld:**

```
Reminder: "Voorstelling is buiten"
Filter: Alleen "Openluchttheater - Zomerseizoen"
Resultaat: Alleen bezoekers van dat specifieke event krijgen de mail
```

***

### Belangrijke Informatie

#### Automatische Filtering

Het systeem stuurt **alleen reminders voor recente bestellingen**:

* Orders met events **tot 24 dagen geleden** of **in de toekomst**
* Alleen **betaalde** bestellingen (geen concepten of geannuleerde orders)
* Geen duplicaten (elke reminder wordt maximaal 1x per bestelling verstuurd)

#### Sending Window (24-uurs venster)

Reminders worden verstuurd als ze binnen een **24-uurs venster** vallen rond het gewenste tijdstip:

**Waarom?**

* Geeft ruimte voor retry's als een reminder eerder gefaald is
* Het systeem draait elke 15 minuten, dus er zijn \~96 kansen per dag
* In de praktijk worden reminders binnen enkele minuten verstuurd

**Voorbeeld:**

```
Gewenste tijd: Vandaag 14:30
Sending window: Gisteren 14:30 - Vandaag 14:30
Eerste check na 14:30 (bijv. 14:45): reminder wordt direct verstuurd
```

#### Grace Period (1 dag buffer)

* Als een reminder meer dan **1 dag te laat** zou zijn, wordt deze overgeslagen
* Dit voorkomt dat oude reminders alsnog verstuurd worden bij technische problemen

***

### Nieuwe Reminder op Bestaande Orders Toepassen

**Probleem:** Je maakt een nieuwe reminder aan (bijv. "1 dag voor voorstelling"), maar er zijn al 100 kaarten verkocht. Normaal krijgen alleen **nieuwe** bestellingen de reminder.

**Oplossing:** Dit is een **technische** functie die door support moet worden uitgevoerd via de command line. Het systeem voert een **backfill** uit waarbij de reminder eenmalig wordt toegepast op alle bestaande bestellingen.

**Procedure:**

1. Je maakt de reminder aan in het dashboard en zet deze op **Actief**
2. Neem contact op met support en vraag om backfill voor deze reminder
3. Support voert het command `php artisan reminders:process --backfill` uit
4. Alle eligible orders (van het afgelopen jaar) worden gecontroleerd
5. Reminders die **nu** verstuurd moeten worden, gaan direct de deur uit
6. Reminders die later verstuurd moeten worden, worden automatisch opgepikt door het systeem op het juiste moment

**Let op:**

* Backfill kijkt maximaal **1 jaar** terug (niet oneindig)
* Duplicaten worden voorkomen (geen dubbele mails)
* Reminders worden alleen verstuurd op het juiste tijdstip (niet te vroeg)
* Deze functie is **niet** beschikbaar in het dashboard (alleen via command line)

***

### Veelgestelde Vragen

#### Kan ik een reminder testen?

Ja, je kunt dit **zelf** doen vanuit het dashboard:

1. Ga naar **E-mail > Automatische mails**
2. Selecteer de reminder
3. Klik op **Test Reminder**
4. Vul een test emailadres in en selecteer een order
5. Klik op **Verstuur Test**

De reminder wordt direct verstuurd naar het test emailadres met echte data van de geselecteerde order.

#### Kan ik een reminder aanpassen nadat deze actief is?

Ja! Wijzigingen werken **direct**. Alle toekomstige reminders gebruiken de nieuwe instellingen.

#### Wat gebeurt er als ik een reminder deactiveer?

De reminder wordt direct gestopt. Er worden geen nieuwe reminders meer verstuurd. Al verstuurde reminders blijven natuurlijk in de inbox van bezoekers staan.

#### Kan ik zien welke reminders zijn verstuurd?

Ja, in het systeem wordt bijgehouden welke reminders zijn verstuurd (reminder log). Neem contact op met support voor inzage.

#### Wat als een bezoeker meerdere events heeft geboekt?

Elke reminder wordt **per event** verstuurd. Als iemand 3 voorstellingen heeft geboekt, krijgt deze persoon 3 herinneringen (1 per voorstelling).

#### Kan ik SMS reminders gebruiken?

Ja, maar dit vereist extra configuratie. Neem contact op met support om SMS functionaliteit te activeren.

#### Hoe ver van tevoren kan ik een reminder instellen?

**BEFOREEVENT:** Tot maanden van tevoren (bijv. "2 maanden voor voorstelling") **AFTEREVENT:** Tot maanden na afloop (bijv. "1 maand na voorstelling") **AFTERSALES:** Tot maanden na verkoop (bijv. "3 maanden na aankoop")

Het systeem kijkt echter alleen naar orders/events binnen een redelijk bereik (zie "Automatische Filtering").

***

### Tips & Best Practices

#### 1. Test je templates

Voordat je een reminder activeert, test eerst de email template. Controleer of alle variabelen correct werken.

#### 2. Timing is belangrijk

* **1 dag van tevoren** is populair voor praktische info
* **2 uur van tevoren** kan te kort zijn (mensen checken niet altijd hun mail)
* **Direct na aankoop** is handig voor bevestiging + extra info

#### 3. Niet te veel reminders

Teveel herinneringen kunnen irritant zijn. Kies strategisch:

* Maximaal 1-2 reminders voor de voorstelling
* Maximaal 1 reminder na de voorstelling

#### 4. Personaliseer je berichten

Gebruik variabelen zoals `%FIRSTNAME%` en `%EVENTNAME%` om emails persoonlijker te maken.

#### 5. Duidelijke onderwerpregel

Let op de onderwerpregel van je template - deze bepaalt of mensen de mail openen.

***

### Troubleshooting

#### Reminder wordt niet verstuurd

**Check:**

1. Is de reminder op **Actief** gezet?
2. Valt het tijdstip binnen het 24-uurs sending window?
3. Is de bestelling **betaald**? (concepten krijgen geen reminders)
4. Is de reminder al eerder verstuurd? (geen duplicaten)
5. Matcht de bestelling de event/locatie filters?

**Hulp nodig?** Neem contact op met support.

#### Reminder komt te laat

Het systeem draait elke 15 minuten. In de praktijk betekent dit dat een reminder maximaal 15 minuten na het gewenste tijdstip verstuurd wordt (maar meestal binnen enkele minuten).

#### Reminder gaat naar verkeerd emailadres

Controleer in de bestelling of het emailadres correct is. Reminders gebruiken het emailadres uit de bestelling.

#### Template variabelen werken niet

Controleer of je de juiste syntax gebruikt (bijv. `%FIRSTNAME%` met hoofdletters en `%` tekens). Zie E-mail Templates voor alle beschikbare variabelen.


# Campagnes

Met het campagne systeem kun je gerichte e-mails versturen naar specifieke doelgroepen uit je bezoekersbestand.

### Wat kun je ermee?

**Voorbeelden:**

* Stuur een nieuwsbrief naar alle bezoekers van het afgelopen jaar
* Mail bezoekers uit een specifieke regio over een nieuwe voorstelling in hun buurt
* Stuur een bedankmail naar alle donateurs
* Heractiveer bezoekers die al lang geen kaarten meer hebben gekocht

***

### Hoe werkt het?

Het campagne systeem bestaat uit **3 stappen**:

1. **Selectie maken:** Kies je doelgroep (bijvoorbeeld "alle bezoekers uit Amsterdam")
2. **Template kiezen:** Selecteer een e-mail template met je boodschap
3. **Versturen:** Direct versturen (ad-hoc) of inplannen voor later (scheduled)

**Belangrijk:**

* Campagnes worden verstuurd in **batches van 250 emails** tegelijk (voor stabiliteit)
* Je kunt maximaal **10.000 ontvangers** per campagne hebben
* Alle campagnes respecteren automatisch opt-outs en privacy instellingen

***

### Campaign Types

#### 1. Ad-hoc Campagnes (Direct Versturen)

**Wat is het:** Een campagne die **direct** wordt verstuurd zodra je deze activeert.

**Wanneer gebruiken:**

* Dringende mededelingen
* Last-minute aanbiedingen
* Reacties op actualiteit
* Eenmalige nieuwsbrieven

**Voordeel:** Binnen enkele minuten in de inbox

***

#### 2. Geplande Campagnes (Scheduled)

**Wat is het:** Een campagne die op een **specifieke datum/tijd** wordt verstuurd.

**Wanneer gebruiken:**

* Nieuwsbrieven met vaste planning (elke maand op de 1e)
* Marketing campagnes met strategische timing
* Voorverkoop aankondigingen
* Seizoensgebonden acties

**Voordeel:** Automatisch versturen op het juiste moment

***

### Campagne Aanmaken

#### Stap 1: Ga naar Campagnes

Navigeer in het dashboard naar **E-mail > Campagnes**.

#### Stap 2: Nieuwe Campagne

Klik op **+ Nieuwe Campagne**.

#### Stap 3: Configuratie

| Veld              | Uitleg                                           |
| ----------------- | ------------------------------------------------ |
| **Campagne Naam** | Interne naam (bijv. "Nieuwsbrief December 2025") |
| **Template**      | Selecteer een e-mail template                    |
| **Selectie**      | Kies je doelgroep (zie Selecties maken)          |
| **Versturen**     | Kies: Nu (ad-hoc) of Later (geplande tijd)       |

***

### Selecties Maken

**Selecties** bepalen **wie** de campagne ontvangt. Dit zijn SQL-based regels die je doelgroep definiëren.

#### Selectie Voorbeelden

**Alle bezoekers van het afgelopen jaar:**

```sql
Bezoekers die in de afgelopen 12 maanden tickets hebben gekocht
```

**Bezoekers uit een specifieke regio:**

```sql
Bezoekers met postcode beginnend met "10" (Amsterdam)
```

**Bezoekers zonder abonnement:**

```sql
Bezoekers die wel tickets kochten maar nog nooit een passe-partout
```

**Bezoekers met specifieke tag:**

```sql
Bezoekers met tag "vriend" of "donor"
```

**Inactieve bezoekers:**

```sql
Bezoekers die > 12 maanden geleden voor het laatst tickets kochten
```

#### Selectie Regels Ophalen

Selecties worden opgeslagen in **Google Cloud Storage** en opgehaald via de Report Builder API.

**Beschikbare selecties:**

* Organisatoren kunnen selecties laten maken door support
* Selecties zijn herbruikbaar voor meerdere campagnes
* Selecties kunnen gecombineerd worden (AND/OR logic)

**Let op:** Technische kennis van SQL is handig voor custom selecties. Neem contact op met support voor hulp.

***

### Email Templates

Campagnes gebruiken **email templates** die je van tevoren aanmaakt.

#### Template Aanmaken

1. Ga naar **E-mail > Templates**
2. Klik op **+ Nieuwe Template**
3. Geef de template een naam (bijv. "Nieuwsbrief Template")
4. Ontwerp je email met HTML/CSS of gebruik de editor
5. Gebruik **merge variabelen** voor personalisatie

#### Merge Variabelen

Gebruik deze codes in je template om ze automatisch te vervangen met klantgegevens:

| Variabele       | Betekenis                             |
| --------------- | ------------------------------------- |
| `%FIRSTNAME%`   | Voornaam van de ontvanger             |
| `%LASTNAME%`    | Achternaam                            |
| `%EMAIL%`       | E-mailadres                           |
| `%SALUTATION%`  | Aanhef (bijv. "Beste Jan")            |
| `%COMPANYNAME%` | Jouw organisatie naam                 |
| `%UNSUBSCRIBE%` | Link om uit te schrijven (verplicht!) |

**Voorbeeld:**

```html
<SUBJECT>Nieuwsbrief December - %COMPANYNAME%</SUBJECT>

Beste %FIRSTNAME%,

Bedankt voor je interesse in ons theater!
We hebben spannend nieuws voor je...

[Jouw boodschap hier]

Groeten,
Het team van %COMPANYNAME%

<a href="%UNSUBSCRIBE%">Uitschrijven</a>
```

#### Subject in Template

Je kunt de **onderwerpregel** direct in de template zetten:

```html
<SUBJECT>Je persoonlijke nieuwsbrief</SUBJECT>

[Rest van de email...]
```

Alles tussen `<SUBJECT>` en `</SUBJECT>` wordt gebruikt als onderwerpregel.

Zie ook: E-mail Templates Aanpassen

***

### Campagne Versturen

#### Direct Versturen (Ad-hoc)

1. Maak campagne aan
2. Kies **Nu versturen**
3. Klik op **Versturen**
4. De campagne wordt direct in batches verstuurd

**Timing:**

* Eerste batch start **binnen enkele seconden**
* Batches van 250 emails per keer
* Totaal duurt \~1-5 minuten voor 1000 ontvangers

***

#### Inplannen (Scheduled)

1. Maak campagne aan
2. Kies **Later versturen**
3. Selecteer **datum en tijd**
4. Klik op **Inplannen**
5. De campagne wordt automatisch verstuurd op het gekozen moment

**Timing:**

* Campagne wordt **exact** op de gekozen tijd verstuurd
* Je kunt meerdere campagnes inplannen
* Geplande campagnes kun je annuleren (tot het moment van versturen)

***

### Batch Processing

Campagnes worden verstuurd in **batches** om de mailserver niet te overbelasten.

**Hoe het werkt:**

* Elke batch bevat **250 emails**
* Batches worden sequentieel verstuurd (niet parallel)
* Tussen batches zit een kleine vertraging (queue processing)

**Voorbeeld:**

```
Totaal ontvangers: 1000
Batches: 4 (250 + 250 + 250 + 250)
Geschatte duur: 3-5 minuten totaal
```

**Waarom batches?**

* Voorkomt memory issues
* Voorkomt timeouts
* Beschermt tegen spam-flagging
* Geeft betere stabiliteit

***

### Duplicate Preventie

Het systeem voorkomt dat je **per ongeluk** dezelfde campagne twee keer verstuurt.

**Controle bij aanmaken:** Als je een campagne aanmaakt met **exact dezelfde**:

* Template
* Selectie
* Naam
* Tijdstip

...dan geeft het systeem een **foutmelding** en voorkomt versturen.

**Let op:** Dit geldt alleen voor **geplande campagnes**. Ad-hoc campagnes kunnen in theorie duplicaat zijn (verschillende naam = nieuwe campagne).

***

### Beperkingen

#### Maximum Ontvangers

**Maximaal 10.000 ontvangers per campagne.**

**Waarom?**

* Beschermt tegen te grote campagnes
* Voorkomt mailserver overbelasting
* Dwingt gefocuste targeting

**Oplossing als je meer wilt versturen:**

* Splits je selectie in meerdere campagnes
* Neem contact op met support voor bulk campagnes

#### Minimum Ontvangers

**Minimaal 1 ontvanger.**

Het systeem controleert of je selectie **minstens 1 resultaat** oplevert. Anders krijg je een foutmelding.

***

### Test Campagnes

Voordat je een campagne naar duizenden mensen stuurt, kun je eerst **testen**.

#### Test Versturen

1. Maak je campagne aan (zonder te versturen)
2. Klik op **Test Campagne**
3. Vul een **test emailadres** in
4. De email wordt **direct** naar dit adres verstuurd
5. Controleer of alles correct is

**Wat te controleren:**

* Onderwerpregel correct?
* Merge variabelen goed ingevuld?
* Afbeeldingen laden?
* Links werken?
* Layout ziet er goed uit (desktop + mobiel)?
* Uitschrijflink werkt?

**Let op:** Test emails gebruiken **dummy data** voor merge variabelen (geen echte klantgegevens).

***

### Campaign Status Tracking

Elke campagne heeft een **status** die je kunt volgen.

#### Campaign Statussen

| Status         | Betekenis                                    |
| -------------- | -------------------------------------------- |
| **Geplanned**  | Campagne is ingepland, nog niet verstuurd    |
| **Processing** | Campagne wordt momenteel verstuurd (batches) |
| **Completed**  | Campagne volledig verstuurd                  |
| **Failed**     | Er is iets misgegaan tijdens versturen       |

#### Campaign Log

Voor elke campagne wordt bijgehouden:

* Aantal ontvangers
* Aantal verstuurd
* Aantal gefaald (bounces, drops)
* Job ID (voor technische tracking)
* Timestamp van aanmaken
* Timestamp van versturen

**Toegang tot logs:** Neem contact op met support voor inzage in campagne statistieken.

***

### Email Delivery Tracking

Nadat emails zijn verstuurd, kun je de **delivery status** volgen.

#### Email Statussen

| Status        | Betekenis                                                  |
| ------------- | ---------------------------------------------------------- |
| **Sent**      | Email is verstuurd door ons systeem                        |
| **Delivered** | Email is aangekomen bij de ontvanger                       |
| **Bounce**    | Email kon niet worden afgeleverd (adres bestaat niet)      |
| **Dropped**   | Email is geweigerd (spam filter, opt-out, etc.)            |
| **Opened**    | Ontvanger heeft de email geopend (indien tracking enabled) |
| **Clicked**   | Ontvanger heeft op een link geklikt                        |

***

### Opt-Outs & Privacy

Het systeem respecteert **automatisch** privacy instellingen.

#### Automatische Filters

**Campagnes worden NIET verstuurd naar:**

* Bezoekers die zich hebben **uitgeschreven** (opt-out)
* Email adressen die eerder als **spam** zijn gemarkeerd
* Email adressen met **hard bounces** (bestaat niet)
* Email adressen op de **blacklist**

#### Opt-Out Link Verplicht

**Elke campagne MOET** een uitschrijflink bevatten:

```html
<a href="%UNSUBSCRIBE%">Uitschrijven</a>
```

**Waarom verplicht?**

* Wettelijke verplichting (AVG/GDPR)
* Voorkomt spam-klachten
* Respecteert privacy van bezoekers

Zie ook: Privacy & AVG

***

### Best Practices

#### 1. Segmenteer je Doelgroep

Stuur **gerichte** emails naar **relevante** mensen:

**Goed:**

```
Selectie: Bezoekers die comedy shows bezochten
Campagne: Nieuwe comedy voorstelling aankondiging
```

**Slecht:**

```
Selectie: Alle bezoekers ooit
Campagne: Nieuwe comedy voorstelling
(Irrelevant voor mensen die alleen ballet zien)
```

#### 2. Personaliseer je Berichten

Gebruik merge variabelen om emails persoonlijker te maken:

**Goed:**

```
Beste %FIRSTNAME%,

Omdat je vorig jaar [Event] hebt bezocht...
```

**Minder goed:**

```
Beste bezoeker,

Wij willen je iets vertellen...
```

#### 3. Test Altijd Eerst

Stuur **altijd** een test email voordat je de campagne live zet.

**Checklist:**

* [ ] Subject duidelijk?
* [ ] Merge variabelen werken?
* [ ] Call-to-action helder?
* [ ] Links werken?
* [ ] Mobiel responsive?
* [ ] Uitschrijflink aanwezig?

#### 4. Timing is Belangrijk

Kies het **juiste moment** om te versturen:

**Goede tijden:**

* Dinsdag t/m donderdag (betere open rates)
* 10:00 - 11:00 uur of 14:00 - 15:00 uur
* Niet in het weekend (tenzij evenement gerelateerd)

**Vermijd:**

* Maandagochtend (volle inbox)
* Vrijdagmiddag (mensen zijn al weekend-mode)
* Late avond (emails verdwijnen in de lijst)

#### 5. Niet Te Vaak

Vermijd **campagne vermoeidheid**:

**Aanbevolen frequentie:**

* Nieuwsbrief: Maximaal 1x per maand
* Event announcements: Ad-hoc (bij nieuwe shows)
* Promoties: Maximaal 2x per maand

**Te vaak = meer opt-outs.**

#### 6. Monitor je Resultaten

Vraag support om **statistieken**:

* Open rate (hoeveel % opent je email?)
* Click rate (hoeveel % klikt op links?)
* Opt-out rate (hoeveel % schrijft zich uit?)

**Benchmark:**

* Open rate > 20% = goed
* Open rate < 10% = verbetering nodig
* Opt-out rate > 2% = mogelijk te vaak / niet relevant

***

### Veelgestelde Vragen

#### Kan ik een campagne annuleren?

**Ja**, maar alleen **geplande campagnes** die nog niet zijn verstuurd. Neem direct contact op met support.

#### Kan ik zien wie de email heeft ontvangen?

**Ja**, support kan je een lijst geven van ontvangers en hun delivery status.

#### Wat gebeurt er bij bounces?

Email adressen die **hard bouncen** (niet bestaan) worden automatisch gemarkeerd en krijgen geen volgende campagnes meer.

#### Kan ik attachments toevoegen?

**Nee**, campagne emails ondersteunen geen attachments (vanwege spam-risico). Gebruik links naar downloads.

#### Werkt HTML in mijn templates?

**Ja**, je kunt volledige HTML emails maken met CSS styling.

#### Kan ik afbeeldingen gebruiken?

**Ja**, maar **host ze extern** (bijv. op je website) en gebruik `<img src="https://...">` tags.

#### Hoe voorkom ik spam filters?

* Gebruik geen SPAM-gevoelige woorden ("GRATIS", "KLIK HIER")
* Zorg voor uitschrijflink
* Stuur niet te vaak
* Houd je aan privacy regels
* Test je email met spam checkers

#### Kan ik campagnes combineren met Mailchimp?

Het VoordeMensen CRM systeem is **apart** van Mailchimp. Je kunt beide gebruiken, maar ze synchroniseren niet automatisch.

Zie ook: Mailchimp Koppeling

***

### Troubleshooting

#### "Selectie is te groot" foutmelding

Je selectie heeft meer dan 10.000 ontvangers.

**Oplossing:**

* Verfijn je selectie criteria
* Splits in meerdere campagnes
* Neem contact op met support

#### "Geen rijen gevonden in selectie"

Je selectie criteria leveren 0 resultaten op.

**Oplossing:**

* Controleer je selectie regels
* Test met bredere criteria
* Vraag support om te helpen debuggen

#### "Duplicate campaign" foutmelding

Je probeert exact dezelfde campagne nogmaals aan te maken.

**Oplossing:**

* Wijzig de campagne naam
* Kies een andere tijd
* Check of de campagne al bestaat

#### Campagne lijkt niet verstuurd

**Check:**

1. Is de campagne status "Completed"?
2. Kijk in de campaign log (vraag support)
3. Check email delivery status van ontvangers
4. Controleer spam folders van test ontvangers

#### Merge variabelen werken niet

**Check:**

1. Gebruik je de juiste syntax? (`%FIRSTNAME%` met %)
2. Zijn de variabelen beschikbaar in je template?
3. Test met een test email


# Selecties

Selecties zijn een krachtig hulpmiddel om specifieke groepen klanten te identificeren en te benaderen. Met deze functionaliteit kun je nauwkeurig filteren op basis van diverse criteria, waardoor je je communicatie en marketingacties effectief kunt afstemmen op de juiste doelgroep.

### Mogelijkheden

De selectietool biedt een breed scala aan filteropties. Je kunt klanten selecteren op basis van:

* Evenementgegevens (zoals datum, categorie, of specifieke evenementen)
* Klantinformatie (bijvoorbeeld woonplaats, aantal bestellingen)
* Bestelgegevens (zoals betaalstatus, besteldatum)
* En vele andere criteria

Deze flexibiliteit stelt je in staat om zeer gerichte groepen samen te stellen voor je communicatie.

### Gebruik van selecties

Nadat je een selectie hebt gemaakt, kun je deze op twee manieren inzetten:

1. **Direct mailen**: Je kunt onmiddellijk een e-mail versturen naar de geselecteerde groep klanten. Dit is handig voor tijdgevoelige mededelingen of aanbiedingen.
2. **Campagnes inplannen**: Je kunt de selectie ook opslaan en later gebruiken voor een geplande e-mailcampagne. Dit geeft je de mogelijkheid om je communicatie vooruit te plannen en te integreren in een bredere marketingstrategie.

### AVG-compliance

Om te voldoen aan de privacywetgeving en ongewenste communicatie te voorkomen, is er een belangrijke veiligheidsmaatregel ingebouwd. De contactoptie "AVG opt-in (incidenteel e-mail akkoord)" is standaard geactiveerd in elke selectie. Dit zorgt ervoor dat je alleen communiceert met klanten die expliciet toestemming hebben gegeven voor het ontvangen van e-mails.

### Voordelen

* **Efficiëntie**: Door gericht te communiceren, verhoog je de relevantie van je berichten en verminder je onnodige communicatie.
* **Personalisatie**: Selecties maken het mogelijk om je boodschap af te stemmen op specifieke klantsegmenten.
* **Flexibiliteit**: Je kunt selecties opslaan, bewerken en hergebruiken, wat tijd bespaart bij terugkerende communicatiebehoeften.
* **Inzicht**: Het maken van selecties kan ook waardevolle inzichten bieden in je klantenbestand en verkooppatronen.

Door slim gebruik te maken van selecties, kun je je klantcommunicatie aanzienlijk verbeteren en gerichter werken aan klantrelaties en marketingdoelstellingen.


# Systeemberichten

Systeemberichten vormen het hart van de communicatie tussen jou en je klanten. Deze berichten worden automatisch verstuurd op cruciale momenten in het bestelproces, zoals direct na een aankoop of wanneer een klant belangrijke informatie nodig heeft.

De verschillende soorten berichten omvatten standaard bestelbevestigingen, speciale bevestigingen voor passe-partouts en vouchers, updates over wachtlijsten, en verzoeken om te betalen.&#x20;

Je kan eenvoudig tussen verschillende berichtsjablonen wisselen en deze naar wens aanpassen. Je kan de onderwerpregel wijzigen, de inhoud van het bericht bewerken, en een testbericht naar jezelf sturen om te zien hoe het er voor de klant uit zal zien.

Het systeem biedt ook de mogelijkheid om nieuwe sjablonen te maken, bestaande sjablonen te verwijderen of aan te passen, en een bepaald sjabloon als standaard in te stellen.


# Templates

Hier beheer je de e-mailsjablonen voor je eigen berichten aan klanten. Deze sjablonen gebruik je voor persoonlijke communicatie, aanvullende informatie, nieuwsbrieven of speciale mededelingen die niet via [Systeemberichten](/dashboard/e-mail/systeemberichten) worden verstuurd.

{% hint style="info" %}
Personaliseer je berichten met variabelen zoals %FIRSTNAME% om de naam van de ontvanger in te voegen.
{% endhint %}

Je kan templates maken met onze gebruiksvriendelijke blokken-editor, of zelf HTML invoeren.


# Verzendlog

Deze pagina toont een overzicht van alle e-mailberichten die recent zijn verstuurd vanuit je systeem. Het biedt je inzicht in de communicatie met je klanten en helpt bij het monitoren van e-mailverkeer.

{% hint style="info" %}
Het verzendlog wordt automatisch opgeschoond. Na een week worden entries verwijderd.
{% endhint %}


# Instellingen


# Algemeen

Je NAW-gegevens en logo's configureer je hier.&#x20;

<figure><img src="/files/2C7VpTrQ0mWKH5dNhIso" alt=""><figcaption></figcaption></figure>

We ondersteunen drie typen algemene afbeeldingen:&#x20;

* **het logo** van je onderneming, algemeen gebruikt in de vormgeving zoals bijv. op de factuur
* je **standaard evenementafbeelding**, als een evenement geen eigen afbeelding heeft wordt deze getoond in een header bovenaan je bestelpagina.
* de **standaard lijstafbeelding**, deze wordt getoond in een rondje in het mandje met tickets.


# Betaalmethoden

Koppel je Mollie-account en definieer andere betaalmethoden

### API-keys

Betalingen worden afgehandeld door onze partner Mollie, waar je een eigen account moet afsluiten. Zo komen alle betalingen direct bij je eigen organisatie binnen en ontstaat er geen enkele vertraging. Om de koppeling te maken zoek je de API-keys uit je Mollie Dashboard op onder `Developers -> API-keys:`

![](/files/-MS9oO-CbwNy68lVwYBB)

Kopieer de Live en Test API-key en vul die in het VoordeMensen dashboard in:

![](/files/-MS9pEQFK9tb6MjG8fTT)

Hier kun je ook aangeven of je betalen aan het testen bent, of alles live wilt afhandelen.

### Betaalmethoden via Mollie

Als de koppeling via de API-keys is gelukt, worden de betaalmethoden die je in Mollie hebt geactiveerd ook automatisch naar VoordeMensen gekopieerd. Je kunt ze vervolgens actief of inactief zetten in VoordeMensen door op het "wereld"-icoon te klikken:

![](/files/-MS9pm5v3ZCuUxxCu3R1)

Met het "bewerk"-icoon kun je de instellingen per betaalmethode aanpassen, onder meer de transactiekosten en of er een ticket moet worden gemaild of niet.

![](/files/-MS9qAVHoE5kYj_iXo3f)

### Eigen betaalmethoden

Je kan daarnaast je eigen betaalmethoden instellen, buiten Mollie om. Die zal je voornamelijk "offline" (aan de kassa) willen gebruiken. Denk aan PIN of cash. Daarnaast zijn de betaalmethoden **Gratis** en **Reservering** altijd actief om gratis kaarten en reserveringen op te kunnen boeken.

Net als elders geldt hier dat het "winkelwagentje"-icoon gebruikt wordt om de betaalmethode actief te maken in Nolita (onze kassa-software).&#x20;

![](/files/-MS9sBLPpvUd-b0N5WW7)


# Pop-ups

De popup-functionaliteit in VoordeMensen biedt een flexibele manier om klanten extra informatie of opties te tonen tijdens het bestelproces. Popups kunnen worden geconfigureerd om te verschijnen op specifieke momenten tijdens de bestelling en kunnen worden aangepast met eigen inhoud en acties.

<figure><img src="/files/iS3Zzq9desXPmbHSnKMQ" alt=""><figcaption></figcaption></figure>

### Configuratie

#### Popup Toewijzing

In de hoofdtabel vind je een kolom genaamd "popup" die aangeeft welke popup wordt geactiveerd voor elke actie.

De "bestelflow" kolom geeft aan op welk moment de popup wordt getoond:

* "bij 'voeg toe aan mandje'": De popup verschijnt wanneer een ticket aan het winkelmandje wordt toegevoegd.
* "bij 'voeg toe aan mandje' (uitcheck)": De popup verschijnt wanneer de klant doorgaat naar de uitcheckpagina.

#### Popup Inhoud

Elke popup kan worden aangepast met:

* Een afbeelding
* Een titel (bijvoorbeeld "Pannenkoeken!")
* Een beschrijving (bijvoorbeeld "Wil je lekkere pannenkoeken, dat kan!")
* Drie aanpasbare actieknoppen

### Meertaligheid

Het systeem ondersteunt automatische vertaling.

Voeg `|googletrans` toe aan het einde van een tekstveld om automatische vertaling te activeren voor dat specifieke veld. \
\
Zie voor meer informatie: [Tekst & Taal](/dashboard/instellingen/taal).

### Actieknoppen Configuratie

Elke popup heeft drie configureerbare actieknoppen. Voor elke knop kun je de tekst en de actie definiëren.

Actieopties voor knoppen omvatten:

* Link naar evenement
* Link naar URL (opent in nieuw tabblad)
* Voer code uit
* Annuleer
* Geen actie

{% hint style="info" %}
**Voer code uit** stelt beheerders in staat om aangepaste Javascript-code uit te voeren wanneer een knop wordt ingedrukt.<br>

#### Mogelijkheden:

* Directe manipulatie van de webpagina
* Uitvoeren van complexe logica
* Interactie met andere delen van het kaartverkoopsysteem

####

#### Richtlijnen voor gebruik:

1. **Veiligheid eerst**: Voer alleen code uit die je begrijpt en vertrouwt.
2. **Houd het eenvoudig**: Complexe scripts kunnen onbedoelde gevolgen hebben.
3. **Test grondig**: Controleer de code in een testomgeving voordat je deze in productie gebruikt.
4. **Documenteer**: Voeg commentaar toe aan je code voor toekomstig onderhoud.
   {% endhint %}

### Best Practice

* Houd popups relevant voor de actie die ze triggert.
* Gebruik duidelijke en beknopte taal in titels en beschrijvingen.
* Test popups grondig om een soepele gebruikerservaring te garanderen.
* Gebruik de automatische vertaalfunctie consistent voor meertalige ondersteuning.


# Tekst & Taal

Alle teksten in VoordeMensen zijn instelbaar en vertaalbaar.

Op basis van de browsertaal kiezen we automatisch welke taal we je met je gebruiker spreken. We ondersteunen Nederlands, Engels, Frans en Duits. En vallen automatisch terug op het Engels als je bezoeker een andere taal spreekt.

{% hint style="info" %}
Je kan van taal wisselen door de gebruiker de pagina **<https://tickets.voordemensen.nl/\\[klantnaam]/lang/\\[taalcode>]** \
te laten bezoeken. Gebruik als taalcode **en**, **de, fr** of **nl.** \
\
Gedurende de rest van de sessie verandert dan de taal.\
\
Je kan ook in request de parameter **?lang=\[taalcode]** gebruiken. Of als je [onze loader](/api/manual-integration) gebruikt die aanroepen met als derde parameter de taal:\
\
`vdm_order(eventId, sessionId, lang, redirectUrl)`
{% endhint %}

De gedecteerde (of gekozen taal) wordt ook opgeslagen in de bestelling, zodat (latere) communicatie in de juiste taal kan plaatsvinden.&#x20;

## Teksten aanpassen

Je kan alle teksten en alle vertalingen aanpassen. Zo kun je je eigen *tone of voice* gebruiken. Maar ook bijvoorbeeld specifieke informatie toevoegen.&#x20;

Als je bijvoorbeeld wilt toelichten dat je nieuwsbrief elke maand verschijnt en een kortingscode heeft selecteer je de standaardtekst:

![](/files/-MbWmtad_-edm1MQvql-)

En pas je die aan in het formulier:

![](/files/-MbWnJrzQmf9qO64IDDf)

Na het opslaan kun je zelfs automatisch de tekst laten vertalen (via Google Translate) naar het Engels of het Duits zodat al je klanten helemaal bijgepraat zijn:

![](/files/-MbWnqUkzkya82aHi3h9)

## Automatisch vertalen

Niet alles laat zich in standaard-teksten vatten natuurlijk. Daarom kun je je pop-ups, kaartsoorten én evenement-informatie automatisch laten vertalen door Google Translate.&#x20;

Je doet dit heel eenvoudig door `|googletrans` toe te voegen aan de velden. Dat kan direct op de plek waar je kaartsoorten (of evenementen) beheert:

<figure><img src="https://cloud.headwayapp.co/changelogs_images/images/big/000/131/957-3b50efdac3231b76ee30155e358383d6c9adf723.png" alt=""><figcaption></figcaption></figure>

Hier wordt "beperkt beschikbaar" automatisch getoond als "limited availability" aan Engels bezoekers.

Hetzelfde kun je doen bij je [pop-ups](/dashboard/instellingen/pop-ups):

<div data-full-width="true"><img src="https://cloud.headwayapp.co/changelogs_images/images/big/000/131/468-020611239702ccd5b3fa8876a2f363029ccc4c09.png" alt="" width="375"></div>

Voor je Franse bezoekers pakt het dan zo uit:

<img src="https://cloud.headwayapp.co/changelogs_images/images/big/000/131/469-63567abf0410bfeda4020ff76fc6d17cad669d4e.png" alt="" width="375">

## Geavanceerde taalinstellingen

Je kan ook eigen prompts toevoegen en die vervolgens aanroepen in je templates. Ze worden in de mails of PDF's in de juiste taal getoond.


# Webshop

De "Instellingen frontend webshop" pagina biedt beheerders uitgebreide controle over de gebruikerservaring en functionaliteit van de online kaartverkoop. Hieronder volgt een overzicht van de belangrijkste secties en hun functies:

### Bestelformulier Aanpassingen

Het systeem biedt flexibiliteit in het configureren van het bestelformulier. Beheerders kunnen diverse velden activeren, deactiveren of als optioneel instellen:

* Standaard persoonlijke gegevens zoals aanhef, tussenvoegsel, en e-mailadres (met dubbele controle optie)
* Adresgegevens inclusief straat, postcode, woonplaats, en land
* Aanvullende informatie zoals geboortejaar en telefoonnummer

Door zorgvuldig te selecteren welke velden verplicht, optioneel of inactief zijn, kan het bestelproces gestroomlijnd worden naar de specifieke behoeften van het evenement of de organisatie.

### Vrije Velden

Naast de standaardvelden kunnen beheerders aangepaste 'vrije velden' toevoegen:

* Mogelijkheid om velden zoals pasnummer of btw-nummer toe te voegen
* Opties om deze velden verplicht of optioneel te maken
* Aanpasbare labels voor deze velden

Deze functie stelt organisaties in staat om specifieke, relevante informatie te verzamelen zonder het standaardformulier te overbelasten.

### Prijsopties en Kortingen

Beheerders hebben controle over verschillende prijsgerelateerde instellingen:

* Configuratie van verzendkosten voor tickets die per post worden verstuurd
* Instelling en activering van vriendenkorting, inclusief het kortingsbedrag
* Optie om donaties mogelijk te maken, waarmee klanten de organisatie extra kunnen ondersteunen

Deze opties bieden flexibiliteit in prijsstrategieën en kunnen gebruikt worden om klantloyaliteit te bevorderen of extra inkomsten te genereren.

### Winkelwagen en Bestelbeperkingen

Verschillende instellingen helpen bij het beheren van het bestelproces:

* Timeout-instelling voor het winkelmandje, wat helpt bij het beheren van ticketbeschikbaarheid
* Optie voor een compact winkelmandje voor een gestroomlijnde checkout-ervaring
* Instelling voor het maximale aantal tickets per bestelling
* Een 'Niet online %' instelling, voor het reserveren van tickets voor offline verkoop

Deze functies geven beheerders controle over hoe tickets worden gereserveerd en verkocht, wat kan helpen bij het voorkomen van overboekingen en het waarborgen van een eerlijke ticketverdeling.

### Gebruikerservaring en Weergave-opties

Tot slot zijn er instellingen die de algehele gebruikerservaring beïnvloeden:

* 'Match gebruikers' optie, we proberen bestaande gebruikers te koppelen op basis van alleen hun e-mailadres of een uitgebreide koppeling (naam en e-mailadres)&#x20;
* Instelling voor verkoop na aanvang van het evenement
* Opties om de beschikbaarheid van tickets en eindtijden van evenementen te tonen


# Vormgeving


# CSS

Overrule onze CSS-stijlen met je eigen stijlen om de vormgeving helemaal naar eigen hand te zetten.

Deze instelling maakt vormgevers blij. Want alles wat je hier invoert wordt op elke pagina binnen het VoordeMensen-domein geïnjecteerd tussen `style`-tags. Daarmee kun je de vormgeving van alle elementen wijzigen en de styling van VoordeMensen helemaal naar je eigen hand zetten.

![](/files/-MS9jYTxHlE9ZbjhEiTA)

{% hint style="info" %}
Om er zeker van te zijn dat je eigen stijlen ook echt getoond worden is het belangrijk om `!important` te gebruiken.
{% endhint %}

{% hint style="info" %}
Je kan ook je eigen stijlen op je eigen server beheren, bijv:

```
@import url("https://gaudeamus.nl/voordemensen/shopstyles.css");
```

{% endhint %}


# Ticket PDF's

*Coming soon...*


# Wallet

*Coming soon...*


# Templates

Tickets en (automatische) mails worden op basis van je templates gegenereerd. Je kan onze basis-templates gebruiken, of alles naar je eigen hand zetten.

### Inleiding

Een template is een HTML-bestand met variabelen. Die variabelen worden door ons vervangen op het moment dat het ticket wordt aangemaakt of de mail wordt verstuurd. Hierdoor kunnen je vormgevers een bestand helemaal in je eigen huisstijl opmaken. Dat gaat met behulp van een template-taal.

### Twig is onze taal

We gebruiken **Twig** als template-taal. Daarmee kun je tussen accolades variabelen in de HTML opnemen:&#x20;

`{{ seat.event_name }}`

Of eenvoudige if/then constructies bouwen:

`{% if seat.event_id = 5 %}`\
&#x20; `Voor dit evenement geldt: kom binnenlopen wanneer je wilt`\
`{% endif %}`

Of simpele meertalige instructies maken:

`{% if seat.order_lang = 'nl' %}`\
&#x20; `Fijn dat je komt!`\
`{% else %}`\
&#x20; `Looking forward to meet you!`\
`{% endif %}`

Maar we hebben ook geavanceerde meertalige opties.

Leer meer over Twig in hun handleiding [Twig voor Template Designers.](https://twig.symfony.com/doc/3.x/templates.html)&#x20;

### Het ticket-template

Het ticket-template is de HTML die wordt omgezet naar PDF en dat wordt meegestuurd bij een bestelling. Omdat een bestelling natuurlijk meerdere tickets kan bevatten is het ticket-template opgebouwd rondom het `seats-object.`Daarin zit per ticket alle informatie over dat ticket.&#x20;

{% hint style="warning" %}
In je template moet je over het seats-object *loopen* om de gegevens per ticket te tonen:

`{% for seat in seats %}`\
`Evenement: {{ seat.event_name }}`\
`Op: {{seat.event_date|format_date(locale=seat.order_lang)}}`\
`{% endfor %}`
{% endhint %}

[Ons basis-template](/ticket-template) geeft een goede weergave van hoe je een ticket kan vormgeven en hoe je die *loop* maakt.

### Filters en vertalingen

In de voorbeelden hierboven zie je al dat Twig bepaalde speciale bewerkingen toestaat. Zogenoemde *filters* worden daarbij gebruikt om de data beter weer te geven. Zo voegen we meertaligheid toe aan de templates.&#x20;

Neem de variabele `{{ seat.event_date }}` - uit de database komt een waarde in de Amerikaanse datumnotatie: `2022-03-01.` Als je dat in de taal van de gebruiker wilt weergeven filter je die waarde door het [Twig format\_date filter](https://twig.symfony.com/doc/3.x/filters/format_date.html): `{{ seat.event_date|format_date(locale=seat.order_lang) }}`dat wordt dan voor Nederlandse gebruikers *1 apr. 2022*, en voor Engelstalige *Apr. 1, 2022*.

Daarnaast kun je alle ingebouwde taal-prompts gebruiken. Met het filter `lang` worden ze afgestemd op de browser- of gekozen taal van de gebruiker. Zo wordt `{{ 'at'|lang }}` in het Nederlands vertaald naar *om* en in het Duits naar *um.* Kijk welke prompts beschikbaar zijn en hoe je die aanpast [bij de Taal-instellingen.](/dashboard/instellingen/taal)

{% hint style="info" %}
Tip: in ons basis-tickettemplate gebruiken we dit fragment

```javascript
{{seat.event_date|format_date('long',locale=seat.order_lang)}} {{'at'|lang}} {{seat.event_time|format_time('short',locale=seat.order_lang)}}
```

{% endhint %}

### Vertaal automatisch met Google Translate

Je kan teksten ook automatisch laten vertalen door Google Translate. Dat doe je als je bijvoorbeeld aanvullende informatie bij een voorstelling wilt geven en er zeker van wilt zijn dat al je bezoekers, ook de internationale, het precies snappen. Gebruik hiervoor het filter `googletrans`

Bijvoorbeeld: bij een evenement geef je aan dat dat het buiten plaatsvindt en dat mensen warme kleding moeten aantrekken:

![bij evenement bewerken geef je aanvullende informatie](/files/-MSm4caVNFztkVE-tKlL)

In het template toon je deze variabele, en pas je het Google Translate filter toe: `{{ seat.event_text|googletrans }}`

Vervolgens zien Nederlandse gebruikers de standaardtekst, maar wanneer we detecteren dat iemand een andere browsertaal gebruikt (of zelf koos voor een andere taal) wordt jouw tekst onder water naar Google Translate gestuurd en in de PDF gezet:

![automatisch vertaald naar het Engels](/files/-MSo0Hjk5qqbj-xJRF6K)

![automatisch vertaald naar Duits](/files/-MSo0cJs8BeIfd4BDlk6)

{% hint style="danger" %}
Elk ticket wordt uniek aangemaakt en dus roepen we voor elk ticket Google Translate aan. Daar rekenen zij kosten voor. Daarom hanteren we een *fair use policy* bij het automatisch vertalen. Dat betekent dat we bijhouden hoeveel je van dit filter gebruik maakt en met je kunnen overleggen over een vergoeding voor het gebruik. Ons uitgangspunt is dat de functie gratis is. Hoor je niets van ons, dan brengen we hiervoor ook niets in rekening.&#x20;
{% endhint %}


# Koppelingen

VoordeMensen is te koppelen aan diverse externe producten en diensten.

## [API-keys](/dashboard/koppelingen/api-keys)

Beheer de API-keys die gebruikt worden om koppelingen te maken met systemen van derden, zoals bijvoorbeeld [Google Data Studio.](/api/google-data-studio/data-studio-support)

## Notificaties

De e-mail & Slack notificaties maken het mogelijk om na elke bestelling, of één keer per dag, een melding te ontvangen. Via e-mail of in je Slack.

## [Tracking](/dashboard/koppelingen/tracking-analytics)

Facebook en Google analytics

## [Close](/dashboard/koppelingen/close)

Met behulp van onze Close koppeling kunnen je bezoekers tickets en aanvullende informatie ontvangen in de CloseApp.&#x20;

## Mailchimp

Via de Mailchimp-koppeling worden klanten die daarvoor kiezen geabonneerd op je nieuwsbrief.&#x20;

## Telegram

De Telegram-koppeling maakt het mogelijk dat deelnemers aan je festival zelf hun verkoopstanden opvragen.

## [Webhooks](/dashboard/koppelingen/webhooks)

Gebruik webhooks om een gebeurtenis in VoordeMensen iets te laten triggeren in een ander systeem.

## [Yesplan](/dashboard/koppelingen/yesplan)

Via onze Yesplan-koppeling kun je verkoopstanden in Yesplan inzien.


# API-keys

Beheer koppelingen met systemen van derden

Systemen van derden kunnen toegang krijgen tot je data, bijvoorbeeld om datavisualisaties te maken of streams te beheren. VoordeMensen ontsluit jouw gegevens in de juiste vorm. De systemen van derden krijgen toegang dmv. een zogenoemde API-key.&#x20;

![](/files/XijhUJXXzLr9XkR7KzBY)

De keys worden in het Dashboard automatisch gegenereerd. Je kan keys intrekken of wijzigen.

{% hint style="success" %}
Op dit moment ondersteunen we keys voor Google Data Studio en het Strozu Streaming Platform
{% endhint %}


# Close

Koppel je VoordeMensen account aan de Close App, informatie van je bezoekers wordt met hen gedeeld. Je bezoekers halen hun tickets uit de Close App en krijgen updates voorafgaand aan je evenement.

Om je account met Close te koppelen krijg je van hen een **ClientId** en een **Secret.** Vul die gegevens in het VoordeMensen dashboard in om de koppeling te maken.

![](/files/-MZRbii4Au2xQLhN1SVW)

Je evenement heeft bij Close een zg. CLEV-code. Om bezoekersinformatie te delen met Close moet je een koppeling maken tussen de CLEV en het VoordeMensen evenement.&#x20;

<div align="center"><img src="/files/-MZRe2YjHFh61NWpm9Mm" alt=""></div>

{% hint style="info" %}
Het is aan te raden om "alle onderliggende" evenementen te koppelen aan Close, het onderscheid tussen de verschillende sub-evenementen wordt door Close op basis van datum en tijd gemaakt
{% endhint %}


# Tracking / Analytics

Om de effectiviteit van je online campagnes te meten -of simpelweg bezoekers en conversies te meten- is het mogelijk om externe tags in VoordeMensen te laden.

{% hint style="danger" %}
Let op! Zodra je aan tracking of analyse gaat doen met derde partijen moet je een cookiemelding plaatsen. Als je rechtstreeks naar het VoordeMensen domein verwijst (via een link naar <https://tickets.voordemensen.nl> bijvoorbeeld) doen wij dat voor je. Gebruik je onze sideloader of pop-up dan ben je hier zelf verantwoordelijk voor.
{% endhint %}

{% hint style="info" %}
Tracking werkt het beste als we op je eigen domein actief zijn, dat wil zeggen dat de kaartverkoop verloopt via tickets.\[jouw eigen website domein].nl in plaats van via tickets.voordemensen.nl. Hiermee kunnen we cross-domain setup-ups voorkomen. Dit vergt wel wat kleine aanpassingen aan onze kant en aan de kant van je website. Neem contact met ons op als je hier in geïnteresseerd bent.&#x20;
{% endhint %}

## Google

#### Client-side tracking

Zorg ervoor dat je de [Google-tag kopieert uit Tag Manager of uit Google Analytics](https://developers.google.com/tag-platform/gtagjs/install). Dit is het stukje Javascript dat gebruikt worden om tracken mogelijk te maken. Plak dat in het VoordeMensen dashboard:

<figure><img src="/files/c6bXfKdMIxAQQeQsgNrX" alt=""><figcaption></figcaption></figure>

We laden die code in op al je pagina's, zodat je alle elementen kan tracken zoals je dat gewend bent. Daarnaast sturen we automatisch `add_to_cart`, `begin_checkout` en `purchase` 'gebeurtenissen' naar Google om conversies te meten. Die zijn verrijkt met extra gegevens.

Het gaat dan om de waarde van de verkoop, het event\_id (item\_id in Google definities) en de naam van het evenement (item\_name) . Dat laatste in het formaat: `evenement_naam - groep_naam` in onderkast. Als `evenement_naam` gebruik je hierbij de titel van het evenement,  als `groep_naam` gebruik je de omschrijving zoals die in het VoordeMensen dashboard staat.

{% hint style="warning" %}
[Onderzoek](https://www.abovomedia.nl/onderzoeken/verontrustende-cijfers-gebruik-adblockers-wat-te-doen/) laat zien dat de meerderheid van Nederland onder de 40 jaar inmiddels een AdBlocker heeft. De informatie die client-side tracking oplevert is dus indicatief en kan significant verschillen van je echte verkoopstanden. Omdat een aanzienlijk deel van je bezoekers de tracking via hun browser blokkeert, komen lang niet al je online bestellingen als event bij Google aan. De aantallen en bedragen die je in je Google omgeving ziet zullen dus aanzienlijk lager uitvallen dan de werkelijke aantallen en bedragen die je in je VoordeMensen dashboard ziet (tenzij je server-side tagging implementeert, zie hieronder).
{% endhint %}

#### Server-side tagging via Measurement Protocol

We kunnen ook vanaf onze server gebeurtenissen naar Google sturen. Hiervoor moet je het bovenstaande doen én in het Google Analytics Dashboard een[ API geheim aanmaken voor Measurement Protocol](https://support.google.com/analytics/answer/9814495?sjid=18297351148004194195-EU). Daarmee worden in principe alle aankopen geregistreerd.

VoordeMensen kijkt of de gebruiker via een Google cookie te identificeren is. Lukt dat niet dan doen we het via een sessie ID (dat door Google dus niet te herleiden is naar een segment).&#x20;

Voor deze variant moet je iets dieper de instellingen van Analytics in. Ga daarvoor naar ⚙️ Admin -> Data Streams.

<figure><img src="/files/ruZBJjFb6ZoYMP0Bbvto" alt=""><figcaption></figcaption></figure>

En maak onder "API-geheimen" een API key aan voor VoordeMensen. Je algemene ID plus de key die Google daar voor je genereert moet je vervolgens in het VoordeMensen Dashboard invullen:

<figure><img src="/files/RuUme3YryGFwblYOCJ5W" alt=""><figcaption></figcaption></figure>

## Facebook

Facebook werkt met een zg. Facebook Pixel, gecombineerd met zg. gebeurtenissen. [Maak eerst een Facebook Pixel aan](https://www.facebook.com/business/help/952192354843755?id=1205376682832142) en plak daarna de code in het VoordeMensen dashboard. Daarmee worden PageViews bijgehouden en -na een geslaagde bestelling- wordt ook een gebeurtenis van het type "aankoop" getriggerd.


# Webhooks

Een gebeurtenis in VoordeMensen triggert een actie in een ander systeem

Door een webhook in te stellen roept VoordeMensen externe URL's aan, elke keer dat er een bepaalde actie plaatsvindt. Die URL's kun je zelf instellen, en je kan heel precies aangeven welke gegevens uit VoordeMensen moeten worden meegestuurd.

{% hint style="info" %}
Zo kun je nieuwe bestellingen automatisch laten binnenlopen in je eigen CRM, gewijzigde klantgegevens bijwerken of [na elke bestelling een Philips Hue-lamp laten knipperen](https://ifttt.com/maker_webhooks).&#x20;

Hoe de andere systemen reageren op de webhook zul je zelf in die systemen moeten instellen. Dat bevindt zich buiten het blikveld van VoordeMensen.&#x20;
{% endhint %}

### Instellen

In het VoordeMensen Dashboard kun je een onbeperkt aantal webhooks instellen. We ondersteunen op dit moment twee triggers: **een nieuwe bestelling** en **een wijziging van de klantgegevens**. Wanneer die acties plaatsvinden wordt het URL aangeroepen en de JSON payload meegestuurd (via de POST-methode).

![](/files/-MM-myejQY9r5lfpK8AZ)

### Payload

In de payload geef je aan welke gegevens precies moeten worden meegestuurd. Daarbij kun je variabelen gebruiken die als het ware worden "gemail-merged" voordat de actie wordt uitgevoerd.&#x20;

In het geval van een nieuwe bestelling kun je gebruiken:&#x20;

* `%ORDER%` - voor een compleet Order object
* `%USER%` - voor een compleet User object
* `%SEATS%` - voor een array met Seats behorende bij de bestelling

In het geval van gewijzigde klantgegevens kun je alleen de `%USER%` tag gebruiken.

Daarnaast zijn alle velden uit de objecten ook los aanroepbaar, zonder hun voorloper in snake\_case te gebruiken, op de id's na. Zoals bovenstaand te zien is bijvoorbeeld:

* `%ORDER_ID%` en `%USER_ID%` voor de unieke id's&#x20;
* `%FIRSTNAME%` `%PREPOSITION%` `%LASTNAME%` voor de naamgeving
* `%EMAIL%` voor het e-mailadres
* `%PAYMENT_STATUS%` voor de betaalstatus
* `%MAILINGLIST%` voor een boolean waarbij wel of geen e-mail opt-in is gekozen


# Yesplan

VoordeMensen ondersteunt de Yesplan Generic API zodat je verkoopstanden in Yesplan kan inzien.

Yesplan is veelgebruikte planningssoftware in de culturele sector. Je kan vanuit Yesplan een koppeling met VoordeMensen maken om bijvoorbeeld verkoopstanden op te vragen.&#x20;

{% hint style="info" %}
Het compleet beheren van je evenementen of bestellingen vanuit Yesplan kan niet: dat zul je vanuit VoordeMensen moeten blijven doen.
{% endhint %}

Om de koppeling te maken moet je in Yesplan een [Generic API configureren](https://manual.yesplan.be/nl/integraties/generic-ticketing-configuration/). Volg de stappen in de handleiding van Yesplan. In het VoordeMensen dashboard vind je de gegevens die je van ons nodig hebt: het URL, de username en het password. &#x20;

![](/files/-MZicfqm-sK6w32TwH2F)

{% hint style="warning" %}
VoordeMensen ondersteunt op dit moment nog geen *productions*, maar wel *deletion* en *retrieving by month*. Bij het configureren van je Generic API kun je dus het eerste vinkje uitzetten, al gebeurt er niets geks als je het aan laat staan.
{% endhint %}

### Koppelen

In het VoordeMensen dashboard kun je  evenementen koppelen met Yesplan (op het Yesplan event-id en/of production-id). Zo weten wij, wat zij bedoelen als ze met ons praten. En andersom. Wanneer je vanuit Yesplan een evenement pusht naar VoordeMensen wordt bovenstaande tabel automatisch ingevuld.&#x20;

{% hint style="info" %}
Bij het aanmaken van evenementen vanuit Yesplan in VoordeMensen maken we automatisch één main en één sub-evenement aan, met een capaciteit van 0 en een prijs van 0. Met andere woorden: na het aanmaken in Yesplan zul je naar VoordeMensen moeten om de gegevens aan te vullen.
{% endhint %}

### Opvragen gegevens

Om gegevens uit VoordeMensen te tonen in Yesplan moet je zg. Remote Data velden koppelen aan je eigen datavelden. Zie voor meer informatie [de handleiding van Yesplan](https://manual.yesplan.be/nl/integraties/generic-ticketing-configuration/).&#x20;

VoordeMensen stuurt de volgende gegevens terug die je kan koppelen aan je eigen Yesplan-velden:

```
{
    "event-id": "3432391937-1483009247",
    "production-id": "3432391937-1483009248",
    "name": "VoordeMensen Demo Event",
    "location": "Theater de Cameleon",
    "starttime": "2022-04-01T20:30:00+02:00",
    "endtime": "2022-04-01T22:30:00+02:00",
    "in-sale": true,
    "closed": false,
    "vdm_event_id": 95,
    "vdm_event_main_id": 94,
    "event_capacity": 1000,
    "event_free": 956,
    "tickets_paid": 36,
    "tickets_complimentary": 8,
    "tickets_reserved": 2,
    "event_paid_revenue": 793,
    "event_paid_revenue_currency": "EUR",
    "event_paid_ticket_types": [
        {
            "ticket_type": null,
            "ticket_price": "5.00",
            "ticket_total": 2
        },
        {
            "ticket_type": null,
            "ticket_price": "24.50",
            "ticket_total": 5
        },
        {
            "ticket_type": "CJP",
            "ticket_price": "23.50",
            "ticket_total": 3
        },
        {
            "ticket_type": "stadspas",
            "ticket_price": "18.38",
            "ticket_total": 4
        },
        {
            "ticket_type": "Standaard",
            "ticket_price": "24.50",
            "ticket_total": 21
        },
        {
            "ticket_type": "Uitflits",
            "ticket_price": "2.00",
            "ticket_total": 1
        },
        {
            "ticket_type": "VoordeMensen",
            "ticket_price": "0.00",
            "ticket_total": 8
        }
    ],
    "event_reserved_revenue": 49
}
```


# Kaarten verkopen

*Coming soon...*


# Reserveringen

*Coming soon...*


# BOCA printer

*Coming soon...*


# Scannen

*Coming soon...*


# Bezoekerslijst

*Coming soon...*


# Kaarten verkopen

*Coming soon...*


# Introduction

This part of the documentation caters to developers worldwide and explains how to integrate VoordeMensen in your own website: manually, using our WordPress plugin or by connecting to our API's.

## WordPress plugin

If your site is WordPress-powered we'll have you up and running in the blink of an eye. Simply install [our WordPress plugin](/api/wordpress-plugin) and you're good to go!&#x20;

## Manual Integration

No WordPress? No worries. Learn how to load a few Javascripts from our site and get going with our [manual integration](/api/manual-integration).

## API public endpoints

To create your own flow for ordering tickets you can use our public endpoints. They will allow you to 1) [display events and availability](/api/public-endpoints/api-public) 2) [display ticket types](/api/public-endpoints/tickettypes) and 3) [interact with the shopping cart](/api/public-endpoints/cart).

{% hint style="info" %}
Public endpoints obfuscate sensitive information like capacity or number of tickets sold - the reported capacity will always display the maximum number of tickets that may be sold per session (taking the percentage to remain available offline into account)
{% endhint %}


# WordPress plugin

Our WordPress plugin connects VoordeMensen to pages and posts and provides shortcodes for buy buttons

### Download the plugin

Get the plugin from [our Github repository](https://github.com/VoordeMensen/wordpress-plugin) [(direct download ZIP)](https://github.com/VoordeMensen/wordpress-plugin/archive/master.zip), uncompress and upload to your WordPress installation.

### Configuration

Click the VoordeMensen button down in the left sidebar of your WordPress dashboard, enter your shortform client name and choose what loader to use, pop-up or side-style.

![](/files/-M4YQzJmprVqIqKVrKja)

### Connect pages or posts

Create pages (or posts) for your events and connect them using the metabox at the bottom of the page. The dropdown will automatically display a list of your events:

![](/files/-M4YUHApsK2ZtYq2yXzT)

### Shortcodes

Now in your posts you can use the following shortcodes that will render event information and buttons to launch our sales screen for the chosen event (either in pop-up or side-style):

* `[vdm_event_name]` - the name of the event
* `[vdm_event_description]` - description of the event
* `[vdm_event_extra]` - extra info regarding the event&#x20;
* `[vdm_event_location]` - the location(s) of the event
* `[vdm_event_dates]` - the dates and times of the event
* `[vdm_tickettypes]` - ticket types and prices<br>
* `[vdm_buy button='Text on button']` - display a single buy button with the caption provided. The button will lead to the chosen event
* `[vdm_eventbuttons]` - display a list of buttons for each sub-event with date and timestamps
* `[vdm_cartbutton button='Text on button']` - display a button that leads to the contents of the shopping cart (regardless of event) &#x20;
* `[vdm_basketcounter]` - output the number of tickets in the basket - you could use this in your theme design to display a cart symbol with a bubble&#x20;

{% hint style="success" %}
If an event is sold out`[vdm_eventbuttons]`will display a non-clickable washed-out button, indicating the end-user that for that particular show no tickets are availble.
{% endhint %}

{% hint style="info" %}
You can use shortcodes in all WordPress files - i.e. headers by using the do\_shortcodes function:

`<?php echo do_shortcode("[vdm_basketcounter]");?>`
{% endhint %}


# Manual integration

Either link to our site or load and launch some Javascript that displays our popup or side loader.

## Link to our site

This is the most basic option. Just create a link to our servers:

```
<a href="https://tickets.voordemensen.nl/demo/">Tickets</a>
```

You can add `/event/event_id` to directly link to a specific main or sub event:

```
<a href="https://tickets.voordemensen.nl/demo/event/95">Tickets for our Demo event</a>
```

{% hint style="info" %}
Optionally you can add two arguments to the query string

* `murmur` a session\_id you assign to this user and order
* `redirect_url` the URL (https only) the user is redirected to after payment
* `lang` ISO 639-1 code for UI locale (en/de/nl)

so the request would look something like:

```
https://tickets.voordemensen.nl/demo/event/95?murmur=dsfksduf93&redirect_url=https://yoursite.nl/thanks/
```

{% endhint %}

### Calendar

Or add `/cal` to display a calendar-view of your events:

```
<a href="https://tickets.voordemensen.nl/demo/cal">Calendar</a>
```

{% hint style="info" %}
Optionally add a main event\_id to the UR to only get specific events in the calendar:

`https://tickets.voordemensen.nl/demo/cal/220`
{% endhint %}

![](/files/-MIdkpIFLkv-KAGOJrGt)

{% hint style="warning" %}
Obviously this all will take the user completely from your site.
{% endhint %}

## Javascript front or side loader

You can keep the user on your site with our popup or side loader. First you load some Javascript from our site, then call a Javascript-function to activate.&#x20;

For the side loader add this Javascript to your HTML:

```
<script src="https://tickets.voordemensen.nl/client_name/event/vdm_sideloader.js"></script>
```

For the popup loader add this Javascript to your HTML:

```
<script src="https://tickets.voordemensen.nl/client_name/event/vdm_loader.js"></script>
```

{% hint style="info" %}
Don't forget to replace "client\_name" in the above line to your client\_name, for example: brakkegrond.
{% endhint %}

Now you can invoke the functions in the script:

```
vdm_order(order_id)
vdm_calendar()
```

So if you have an event with event\_id 95 you can launch the order screen like this:

```
<a href="javascript:vdm_order(95)">Order now</a>
```

{% hint style="info" %}
Optionally you can add a session\_id, an ISO 639-1 language code and the redirect\_url to the vdm\_order function, this will smooth the user-experience in case of cross-domain-cookie/session difficulties. If your site runs PHP it could look like this:

`vdm_order(95,'<?=session_id()?>','en','https://yoursite.com/')`&#x20;
{% endhint %}


# Cart & Counter

There are two ways to manually get the numbers of items in a basket.&#x20;

1. The preferred way would be to make an AJAX call to [the API public endpoint for cart](/api/public-endpoints/cart#get-items-in-cart) and loop over the elements to count the numberoftickets key\
   \
   Example HTML:\
   \
   `Tickets in your basket: <span id="basket"></span>`\
   \
   Example Jquery Javascript:<br>

   ```
   $.get( "https://tickets.voordemensen.nl/api/demo/cart/52c5acccccb852328deb1345b1ee9672", function( data ) {  
       numberoftickets=0;
       data.forEach(function(data) {
           if(!isNaN(data.numberoftickets)) numberoftickets=numberoftickets+data.numberoftickets;
       });
       $( "#basket" ).html(numberoftickets);  
   });

   ```

   <br>
2. Or request the plain number by making a call to \
   \
   `https://tickets.voordemensen.nl/client_name/event/cartnr?murmur=cartid`\
   \
   This call will return a plain number you can display anywhere. <br>


# Customize classes

Our design uses several custom classes that you can override to even better integrate our software in your (client's) website.

* vdmHeader - div containing image and title of event on top of screen
* vdm\_inline\_EventName - the name of the event just above the selectboxes
* vdm\_inline\_EventShortText - the shorttext just after the event name
* vdmTable - the table containing cartlines
* vdmTitle - the event name, location and time in the cart
* vdmReturnModal - the div containing modal (popup) on return after payment


# Google Data Studio

Interactieve dashboards en rapporten met totaalinzicht

Koppel je VoordeMensen-account aan Google Data Studio voor interactieve dashboards, prachtige rapporten en inzichten als nooit tevoren.&#x20;

### Installeren

Activeer eerst Data Studio in je Google account. Voeg dan VoordeMensen toe als gegevensbron. Je vindt ons onder partner connector op: <https://datastudio.google.com/datasources/create/>&#x20;

Na het klikken op de knop **autoriseren** kun je Data Studio toegang geven tot je verkoopgegevens. Daarbij heb je je clientnaam nodig, en een speciale API-key. Die kun je in Dashboard aanmaken onder Koppelingen -> [API-Keys](/dashboard/koppelingen/api-keys)

![](/files/F3Vyw39UYLqLw7JR3QoO)

Druk daarna op **verbinden** en Google kan je gegevens ophalen.

### Gebruik

Data Studio heeft toegang tot bijna dezelfde gegevens als beschikbaar in onze ticket Report Builder. Er komen dus individuele ticketgegevens beschikbaar in Data Studio, die je vervolgens kan aggreren en visualiseren.&#x20;

{% hint style="info" %}
Door de Connector te activeren geef je Google Data Studio toegang tot je gegevens. Voor wat betreft VoordeMensen gelden onze [privacy-voorwaarden](https://voordemensen.nl/privacyverklaring/), onze [algemene voorwaarden](https://voordemensen.nl/wp-content/uploads/Algemene-Voorwaarden-VoordeMensen.pdf) en de afspraken die we met je gemaakt hebben in onze voorwaarden en verbruikersovereenkomst.
{% endhint %}


# Data Studio Support

In geval van problemen met Google Data Studio kun je ons mailen op <support@voordemensen.nl>


# API public endpoints

The typical workflow to order tickets using our API is to:&#x20;

1. choose an event\_id from the list of available events
2. choose the ticket type (aka discount\_id)
3. create a cart resource and use the supplied cart\_id to
4. interact with the cart (add/delete seats)
5. determine what payment method is going to be used
6. create the order and redirect the user to the URL provided

With the following endpoints you can achieve all of the above (and some more):

{% content-ref url="/pages/-M2PZXgU0pa1RH0PPeXl" %}
[Events](/api/public-endpoints/api-public)
{% endcontent-ref %}

{% content-ref url="/pages/-M2SJ0mlsoEu85EY8bE6" %}
[Ticket types](/api/public-endpoints/tickettypes)
{% endcontent-ref %}

{% content-ref url="/pages/-M2TbVqNqdi6TjfUDt16" %}
[Cart](/api/public-endpoints/cart)
{% endcontent-ref %}

{% content-ref url="/pages/-M2Xng6IMNkY9NCv-hhn" %}
[Payment](/api/public-endpoints/payment-methods)
{% endcontent-ref %}

{% content-ref url="/pages/-M2Z4BPzDh\_1oERVa6sn" %}
[Order](/api/public-endpoints/order)
{% endcontent-ref %}


# Events

## Events

<mark style="color:blue;">`GET`</mark> `https://api.voordemensen.nl/v1/:client_name/events/:event_id`

List all or specific main- and subevents.

#### Path Parameters

| Name         | Type   | Description                                                                                  |
| ------------ | ------ | -------------------------------------------------------------------------------------------- |
| client\_name | string | the short name identifying you as a VdM client e.g. *demo* or *fringe*                       |
| event\_id    | string | id of a specific main- or subevent OR use the string **upcoming** to filter on future events |

{% tabs %}
{% tab title="200 Events successfully retrieved" %}

```
[
  {
    "event_id": 94,
    "event_name": "VoordeMensen Demo Event",
    "event_text": "Extra tekst",
    "event_short_text": "Subtitel of naam van het gezelschap",
    "event_image": null,
    "sub_events": [
      {
        "event_id": 95,
        "event_name": "VoordeMensen Demo Event",
        "event_text": "Extra tekst",
        "event_short_text": "Subtitel of naam van het gezelschap",
        "event_url": null,
        "event_image": null,
        "event_date": "2022-04-01",
        "event_time": "20:30:00",
        "event_end": "22:30:00",
        "event_view_end": "0000-00-00 00:00:00",
        "event_rep": "sub",
        "event_main_id": 94,
        "event_free": 10,
        "event_status": "pub",
        "location_id": 1,
        "location_name": "Bellevue Grote Zaal"
      },
      {
        "event_id": 96,
        "event_name": "VoordeMensen Demo Event",
        "event_text": "Extra tekst",
        "event_short_text": "Subtitel of naam van het gezelschap",
        "event_url": null,
        "event_image": null,
        "event_date": "2022-04-02",
        "event_time": "15:00:00",
        "event_end": "17:00:00",
        "event_view_end": "0000-00-00 00:00:00",
        "event_rep": "sub",
        "event_main_id": 94,
        "event_free": 10,
        "event_status": "pub",
        "location_id": 1,
        "location_name": "Bellevue Grote Zaal"
      },
      {
        "event_id": 97,
        "event_name": "VoordeMensen Demo Event",
        "event_text": "Extra tekst",
        "event_short_text": "Subtitel of naam van het gezelschap",
        "event_url": null,
        "event_image": null,
        "event_date": "2022-04-02",
        "event_time": "20:30:00",
        "event_end": "22:30:00",
        "event_view_end": "0000-00-00 00:00:00",
        "event_rep": "sub",
        "event_main_id": 94,
        "event_free": 10,
        "event_status": "pub",
        "location_id": 1,
        "location_name": "Bellevue Grote Zaal"
      }
    ]
  }
]
```

{% endtab %}

{% tab title="404 Event was not found" %}

```
{    "message": "Event not found"}
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
Events in the response are grouped by main\_event and sub\_events. In VdM every event has a main\_event and at least one sub\_event. This allows for different performances of the same show to be grouped.
{% endhint %}

{% hint style="warning" %}
Note that the field event\_free for free seats is censored in the public facing API's: it will show the maximum available tickets per order (or less, if less are available) and reveals nothing about actual capacity/sales.
{% endhint %}


# Ticket types

## Ticket types

<mark style="color:blue;">`GET`</mark> `https://api.voordemensen.nl/v1/:client_name/tickettypes/:event_id`

List available ticket types for a specific sub\_event

#### Path Parameters

| Name         | Type   | Description                                                            |
| ------------ | ------ | ---------------------------------------------------------------------- |
| client\_name | string | the short name identifying you as a VdM client e.g. *demo* or *fringe* |
| event\_id    | string | id of the sub\_event                                                   |

{% tabs %}
{% tab title="200 Available discounts" %}

```
[{
	"discount_id": "2ePdA8q3BN",
	"discount_name": "Standaard",
	"base_price": "24.50",
	"discount_type": "\u20ac",
	"discount_value": "0.00",
	"discounted_price": "24.50"
}, {
	"discount_id": "bo6dlyJGea",
	"discount_name": "CJP",
	"base_price": "24.50",
	"discount_type": "\u20ac",
	"discount_value": "1.00",
	"discounted_price": "23.50"
}, {
	"discount_id": "GyPdxwZ3Zp",
	"discount_name": "Uitflits",
	"base_price": "24.50",
	"discount_type": "=",
	"discount_value": "2.00",
	"discounted_price": "2.00"
}, {
	"discount_id": "AYDJK7JlkX",
	"discount_name": "stadspas",
	"base_price": "24.50",
	"discount_type": "%",
	"discount_value": "25.00",
	"discounted_price": "18.38"
}]
```

{% endtab %}

{% tab title="404 Could not find that supplied event\_id" %}

```
{    "message": "sub_event not found"}
```

{% endtab %}
{% endtabs %}

This endpoint will list the available ticket types for an event\_id, taking into account all discount-logic available (e.g. the maximum number of discounts used).&#x20;

The response includes:

* discount\_id - used to effectivly order a ticket
* the base and discounted prices for this ticket type


# Cart

## Create cart

<mark style="color:green;">`POST`</mark> `https://api.voordemensen.nl/v1/:client_name/cart/`

A `POST` HTTP request is sent. A shopping cart is created. The `Location` header is used to link to the newly created resource (the cart) in order for the client to be able to access it without querying anew. Save the cart\_id to the session if you want to access it again.

#### Path Parameters

| Name         | Type   | Description                                                        |
| ------------ | ------ | ------------------------------------------------------------------ |
| client\_name | string | the short name identifying you as a VdM client e.g. demo or fringe |

{% tabs %}
{% tab title="201 Cart created" %}

```
{"cart_id":"4DSMDACyPo8wLr8vFnTVUR6HzWC5tWGi"}
```

{% endtab %}
{% endtabs %}

## Put seat(s) in the cart

<mark style="color:green;">`POST`</mark> `https://api.voordemensen.nl/v1/:client_name/cart/:cart_id`

A `POST` HTTP request is used to put a seat in the cart. The event\_id, number of tickets and discount\_id is sent as part of the request body. The reply contains all cart data in order not to force the client to query again for it.

#### Path Parameters

| Name         | Type   | Description                                                        |
| ------------ | ------ | ------------------------------------------------------------------ |
| cart\_id     | string | the cart\_id identifying this cart                                 |
| client\_name | string | the short name identifying you as a VdM client e.g. demo or fringe |

#### Request Body

| Name            | Type    | Description                             |
| --------------- | ------- | --------------------------------------- |
| discount\_id    | string  | the id of the ticket type (or discount) |
| numberoftickets | integer | the number of tickets to add            |
| event\_id       | integer | the sub\_event id                       |

{% tabs %}
{% tab title="200 Seat added" %}

```
[{
	"seat_id": "azL0bNZdD1",
	"seat_row_nr": "0",
	"seat_nr": "0",
	"pmp_name": null,
	"event_id": 95,
	"event_name": "VoordeMensen Demo Event",
	"location_name": "Bellevue Grote Zaal",
	"event_date": "01-04-2022",
	"event_view_end": "00-00-0000",
	"event_time": "20:30",
	"recommand": [],
	"numberoftickets": 1,
	"seat_price": "24.50",
	"category_name": "standaard",
	"discount_id": "2ePdA8q3BN",
	"discount_name": "Standaard"
}, {
	"totalprice": "24.50"
}]
```

{% endtab %}
{% endtabs %}

## Get items in cart

<mark style="color:blue;">`GET`</mark> `https://api.voordemensen.nl/v1/:client_name/cart/:cart_id`

Get a list of items in the cart

#### Path Parameters

| Name         | Type   | Description                                                        |
| ------------ | ------ | ------------------------------------------------------------------ |
| client\_name | string | the short name identifying you as a VdM client e.g. demo or fringe |
| cart\_id     | string | the cart\_id identifying this cart                                 |

{% tabs %}
{% tab title="200 A list of items in the cart, otherwise the response is \[{"cart":0}]" %}

```
[{
	"seat_id": "azL0bNZdD1",
	"seat_row_nr": "0",
	"seat_nr": "0",
	"pmp_name": null,
	"event_id": 95,
	"event_name": "VoordeMensen Demo Event",
	"location_name": "Bellevue Grote Zaal",
	"event_date": "01-04-2022",
	"event_view_end": "00-00-0000",
	"event_time": "20:30",
	"recommand": [],
	"numberoftickets": 1,
	"seat_price": "24.50",
	"category_name": "standaard",
	"discount_id": "2ePdA8q3BN",
	"discount_name": "Standaard"
}, {
	"totalprice": "24.50"
}]
```

{% endtab %}
{% endtabs %}

The response is a list of items in the cart, followed by the calculated total price of the cart.

{% hint style="info" %}
If the Recommendation Extension is activated the response contains an array of other events the user can visit before or after this event, links to those events and even the 🚲cycle-distance between venues.
{% endhint %}

## Delete seat from cart

<mark style="color:red;">`DELETE`</mark> `https://api.voordemensen.nl/v1/:client_name/cart/:cart_id/:seat_id`

Remove a seat from the cart

#### Path Parameters

| Name         | Type   | Description                                                        |
| ------------ | ------ | ------------------------------------------------------------------ |
| seat\_id     | string | the seat\_id identifying the seat to be removed                    |
| cart\_id     | string | the cart\_id identifying this cart                                 |
| client\_name | string | the short name identifying you as a VdM client e.g. demo or fringe |

{% tabs %}
{% tab title="200 " %}

```
```

{% endtab %}
{% endtabs %}


# Payment

## Get status of order/payment

<mark style="color:blue;">`GET`</mark> `https://tickets.voordemensen.nl/api/:client_name/payment/:order_key`

Check if the order is paid and display additional info. Use the order\_key to find the order. Upon return from the payment provider we will add the query parameter **`?response=order_key`** to the redirectURL so you can find the key.

Note: calling this method will invoke a true check with the payment provider, it will fire webhooks, it will send notifications of successfull order, and it will e-mail the tickets (unless that already happend)

#### Path Parameters

| Name                                           | Type   | Description                                                        |
| ---------------------------------------------- | ------ | ------------------------------------------------------------------ |
| order\_key<mark style="color:red;">\*</mark>   | String | the order\_key identifying the order                               |
| client\_name<mark style="color:red;">\*</mark> | String | the short name identifying you as a VdM client e.g. demo or fringe |

{% tabs %}
{% tab title="200: OK Payment summary" %}

```javascript
{
    // Response
}
```

{% endtab %}
{% endtabs %}

## Get available payment methods

<mark style="color:blue;">`GET`</mark> `https://api.voordemensen.nl/v1/:client_name/paymentmethods`

This endpoint will return the payment methods that have been defined as available to online ordering in your dashboard.

#### Path Parameters

| Name                                           | Type   | Description                                                        |
| ---------------------------------------------- | ------ | ------------------------------------------------------------------ |
| client\_name<mark style="color:red;">\*</mark> | string | the short name identifying you as a VdM client e.g. demo or fringe |

{% tabs %}
{% tab title="200 Methods successfully retrieved." %}

```
[
  {
    "payment_id": 33,
    "payment_desc": "iDEAL",
    "payment_cost": "0.00"
  },
  {
    "payment_id": 34,
    "payment_desc": "Credit card",
    "payment_cost": "1.50"
  },
  {
    "payment_id": 35,
    "payment_desc": "Bancontact",
    "payment_cost": "0.00"
  },
  {
    "payment_id": 37,
    "payment_desc": "SOFORT Banking",
    "payment_cost": "0.00"
  }
]
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
If you have defined additional costs for certain payment methods use the field **payment\_cost** to inform the end-user. These costs will not show up in the cart, but will be added to the total price at the level of the payment provider.
{% endhint %}


# Order

## Create order and proceed to checkout

<mark style="color:green;">`POST`</mark> `https://api.voordemensen.nl/v1/:client_name/order/create`

Create a new order and redirect the end-user to the payment provider.

#### Path Parameters

| Name         | Type   | Description                                                        |
| ------------ | ------ | ------------------------------------------------------------------ |
| client\_name | string | the short name identifying you as a VdM client e.g. demo or fringe |

#### Request Body

| Name             | Type    | Description                                                                                                                                                                      |
| ---------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| redirectURL      | string  | the URL the payment provider will redirect the end-user to after payment - we will add the query **`?return=order_key`** to this URL so you can lookup the status of the payment |
| payment\_id      | integer | id of payment\_method                                                                                                                                                            |
| avg\_optin       | boolean | opt in for irregular contact regarding this order                                                                                                                                |
| avg\_mailinglist | boolean | opt in for mailinglist                                                                                                                                                           |
| email            | string  | email address                                                                                                                                                                    |
| firstname        | string  | first name                                                                                                                                                                       |
| lastname         | string  | last name                                                                                                                                                                        |
| phone            | string  | phone number                                                                                                                                                                     |
| address          | string  | address                                                                                                                                                                          |
| city             | string  | city                                                                                                                                                                             |
| zip              | string  | the zipcode                                                                                                                                                                      |
| cart\_id         | string  | the cart\_id to check out                                                                                                                                                        |

{% tabs %}
{% tab title="200 Order created." %}

```
[
    { 
        "url": "https://link-to-paymentprovider", 
        "order_key" : "unique-identifier-of-order"
    }

]
```

{% endtab %}
{% endtabs %}

## Get status of order/payment

<mark style="color:blue;">`GET`</mark> `https://api.voordemensen.nl/v1/:client_name/order/:order_key`

Check if the order is paid and display additional info. Use the order\_key to find the order. Upon return from the payment provider we will add the query parameter **`?response=order_key`** to the redirectURL (see above).&#x20;

#### Path Parameters

| Name                                           | Type   | Description                                                        |
| ---------------------------------------------- | ------ | ------------------------------------------------------------------ |
| order\_key<mark style="color:red;">\*</mark>   | string | the order\_key identifying the order                               |
| client\_name<mark style="color:red;">\*</mark> | string | the short name identifying you as a VdM client e.g. demo or fringe |

{% tabs %}
{% tab title="200 The status of the payment and additional info for you to display (links to) the tickets." %}

```
  "order_payment_status": "paid",
  "order_tickets_nr": 1,
  "order_tickets_url": "https://tickets.voordemensen.nl/client_name/order/XgFca-QmBxG-9WhAj-Osszb/ticket",
  "order_receipt_url": "https://tickets.voordemensen.nl/client_name/order/XgFca-QmBxG-9WhAj-Osszb/receipt",
  "seats": [
    {
      "seat_id": 2904,
      "event_name": "Your Event",
      "event_type": null
    }
  ]
}
```

{% endtab %}
{% endtabs %}


# Email-template

Below is an example of a confirmation email (sent to customer after payment has been processed). Templates can be edited in our dashboard (e-mail / bevestigingsmails).

```markup
<title>{{client.client_companyname}} ticket</title>
<link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
<style type="text/css">
      table	{ 
		width:100% !important;
		font-family: 'Roboto', sans-serif;
		table-layout: fixed
      }
       
      tr { width:100%;}
      td { horizontal-align:middle;}
      td,th {border:none;}
      	
      .Event_Name {
        font-size:40px;
        color: #ef5c2f;
        margin-top:10px;
      }

      .Event_short_text {
        font-size: 18px;
      }

      .Date_text {
        font-size: 18px; 
      }

      .Location_title {
        font-size: 22px;	
      }

      .Address-details {
        font-size: 18px;
      }

      .Event_details {
        font-size: 16px; 
      }
      
      .Ticket_cat {
        font-size:18px;
        color: #ef5c2f;
      }

      .Price_text{
      	font-size: 40px;
        color: #ef5c2f;
      	}
       
      .Barcode_text {
        font-size:18px;
        margin-left: auto;
        color: rgba(57, 57, 57, 0.251);
          -webkit-transform: rotate(90deg);
          -webkit-transform-origin: center bottom auto;
           
      }
      .Name_text {
        font-size: 18px;
        color: #ef5c2f;
      }

      .Email_text {
        font-size: 15px;       
      }

      .Footer_text {
        font-size: 16px;
        text-align: center;
      }
      .small {
        font-size: 10px;
        color: #ef5c2f;
      }
</style>
<br>
{% for seat in seats %}
<page orientation="P" format="210x297" ;="" backcolor="#ffffff">
   <br>
   <table align="center" cellpadding="10" style="width:100%; border: 1px 1px 1px 1px; border-style:dotted;">
      <tbody>
         <tr style="width:100%;">
            <td width="500" style="padding:10px;" valign="top">
               <img width="200" src="https://voordemensen.nl/static_images/barcode.jpg"><br>
               <p>
                  <span class="Event_Name">{{seat.event_name}}</span><br>
                  <span class="Event_short_text">{{seat.event_short_text}}</span>
               </p>
               <p class="Date_text">{{seat.event_date|format_date('long',locale=seat.order_lang)}} {{'at'|lang}} {{seat.event_time|format_time('short',locale=seat.order_lang)}}</p>
               <div class="Address-details">{{seat.location_name}}</div>
               <p class="Event_details">{{seat.event_text|googletrans}}</p>
               <div class="Ticket_cat">1x {{seat.seat_tickettype}}</div>
               <div class="Price_text">{{seat.seat_price}} EUR</div>
               <div class="Ticket_cat">
               	  {% if seat.seat_row_nr&gt;0 %}
               	  {{seat.seat_zone}}
                  rij: {{seat.seat_row_nr}}
                  {% endif %}
                  {% if seat.seat_nr&gt;0 %}
                  stoel: {{seat.seat_nr}}
                  {% endif %}
               </div>
               <br>
            </td>
            <td width="40" style="padding:0px;border-top: 0; border-left: 0;    border-bottom: 0;    border-style: dotted;">
               <p class="Barcode_text">
                  {{seat.order_id}}{{seat.seat_barcodetext}}
               </p>
            </td>
            <td style="text-align:center;padding:20px 0px 0px 0x;border-top:1px;">
               <img width="150" src="https://demo.voordemensen.nl/files/logo zwart-oranje-strakgesneden.png">
               <p class="Name_text">{{seat.user_firstname}} {% if seat.user_preposition %} {{seat.user_preposition}} {% endif %}{{seat.user_lastname}}</p>
               <p class="Email_text">({{seat.user_email}})</p>
               <img src="https://tickets.voordemensen.nl/qr/{{seat.seat_barcodetext}}" style="width: 40mm; background-color; color: black; border:none;">
               <qrcodes value="{{seat.seat_barcodetext}}" ec="H" style="width: 40mm; background-color; color: black; border:none;">
            </qrcodes></td>
         </tr>
      </tbody>
   </table>
   <table class="footer" align="center" cellpadding="10" cellspacing="10">
      <tbody>
         <tr style="width:100%;">
            <td colspan="2" style="width:100%;text-align:center;padding:20px;border-top:1px;">
               <p class="Footer_text"><br></p>
            </td>
         </tr>
         <tr style="width:100%;">
            <td colspan="2" style="width:100%;text-align: right">
               <p class="small">© {{ "now"|date("Y") }} VoordeMensen/{{client.client_companyname}}</p>
            </td>
         </tr>
      </tbody>
   </table>
</page>
{% endfor %}
```


