Sell event tickets online in Morocco: tickets, registrations and a list of who paid
Sell event tickets online in Morocco: a hosted storefront or a reusable link through the API, QR poster, limited seats, cash at an agency, a list of who paid.
To sell event tickets online in Morocco, you do not need ticketing software: for open registration, a product in your hosted storefront or, through the API, a reusable payment link and its QR poster; one single-use link per participant when you need a list of names or a cash payment; a product's stock when seats are limited; and a checkout session if you already have a registration website. The portal and the export tell you who paid, how much and when; on the day, check-in works from that list. This guide is for organizers of tournaments, galas, trade fairs, conferences and workshops.
Online ticketing in Morocco, without ticketing software
ChariPay is a Moroccan payment platform, a PSP operated by Chari Money, a payment institution licensed by Bank Al-Maghrib. For an organizer, it does two things: collect from participants, by card or in cash, and list the payments. It does not do the rest of the ticketing job, and it is better to know that before opening registration.
| ChariPay does | ChariPay does not |
|---|---|
| Collect a fixed price through a hosted storefront product, or through a reusable link created through the API, with its QR code and poster | Issue a named ticket or an entry QR code |
| Collect from each participant through a single-use link, card or cash | Control access at the door |
| Cap seats through a product's stock | Manage a seating plan or numbered seats |
| List payments in the portal and in the CSV export | Replace your registration form |
The ticket, then, is your confirmation: a message you send once the payment is confirmed, or simply the participant's name on the check-in list. The basic tool remains the link: everything about payment links is described on their product page. Two neighboring cases have their own guide: an association's recurring memberships belong to association membership fees online, and a slot booked by a single person — a court, a table, a session — belongs to taking payment for online bookings.
Open registration: a reusable link and its QR poster
For an event open to everyone at a fixed price — an amateur tournament, a gala evening, entry to a trade fair — a single link is enough: a reusable link at the ticket price. A payment link is an amount and a description; the customer pays on a page hosted by ChariPay. It is shared as a link, a QR code, a printable PDF poster, by email or WhatsApp. You paste the link into your posts and groups, print the poster with its QR code for the places your audience goes, and everyone pays from their phone.
Where to create it: from the portal, every payment link you create is single-use. The reusable link — one amount paid by several customers — is created through the API, with singleUse: false; once created, it shows up in the portal like the others. Without a developer, to sell several times at the same price, publish a product on your hosted storefront and share its link: it is the tool covered below for limited seats, and stock is optional there.
Three rules make it work:
- 1One link per price. A link carries one amount: full price, student price and team price make three links and three posters.
- 2An expiry at registration close. Give the link an expiry date (
expiresAt): after that date, the link expires and nobody pays for a seat that no longer exists. - 3Card only. The reusable link, its poster and its QR code collect by card, with 3-D Secure; cash goes through a single-use link, one reference per deposit.
What you see next: the link counts its payments. useCount gives their number and totalCollected the total collected, through GET /v1/payment-links/{reference}, and each payment appears in the portal with its reference. What you do not necessarily see: a list of participants' names. If you need names, collect them with your own form, or switch to single-use links. The printable PDF poster — it carries the QR code and the amount — is available from the link's page in the portal, or through the API with GET /v1/payment-links/{reference}/poster. Generating and placing the poster is covered in QR code payments.
Before you print anything, look at the poster and at a participant's journey: Start in test mode. Three fields — name, work email, company — an activation link received by email to choose your password, then the portal, where you create your own test key. Create a link at the ticket price — from the portal it will be single-use, which is enough for a trial — download its poster from the link's page, scan it and pay with the test card. It is free, with no time limit and no approval to wait for; your business verification (KYB) only gates the move to production.
A list of names: one single-use link per participant
As soon as you need to know who paid — guests, special prices, registrations approved one by one, teams to confirm — switch to single-use links: one link per person, paid only once, in their name. You fill in customerName and customerEmail at creation, or pick a saved customer, and each link carries its status: active, paid, canceled, expired. The list of paid links is your list of registrants.
It is also the path for cash. On the page of a single-use payment link, your customer chooses cash, receives a reference, pays it at an agency of the Chari network, and you are notified as soon as the network confirms the deposit. Cash payment at an agency always relies on a single-use link — one reference per deposit. The link then turns "Paid". ChariPay is the only payment gateway in Morocco that also collects cash at agencies. A participant without a card is therefore not a lost participant.
When registrants are many, create the links through the API from your spreadsheet or form. One call is enough: POST /v1/payment-links returns the payUrl to share. Fill in amount, description, customerName, customerEmail, and an externalId equal to your registration number: unique per account and per environment, it prevents creating the same link twice if your script runs again. POST /v1/payment-links/{reference}/send can then email it to the participant.
Limited seats: a product with stock
When the venue has a capacity, you need a cap. ChariPay documents two, no more. The first goes through the hosted storefront: no website yet? Publish your products on your hosted storefront and track your orders — awaiting payment, paid, shipped, delivered — from your portal. Through the API, the Products module carries each product's price, optional stock and sales page. For a workshop with a set number of seats, the ticket becomes a product, with the number of seats as its stock and its sales page as the registration page. On the hosted storefront, the buyer chooses at checkout to pay by card — on the hosted payment page, with 3-D Secure — or in cash: they then receive a reference to pay at an agency of the Chari network. You follow each order in the portal; through the API, an order paid by card triggers the order.paid event.
The second is built by hand: as many single-use links as there are seats, sent to the people you select. Each link can be paid only once: the count is right by construction.
What we do not promise: per-price quota management, an automatic waiting list, or the details of what an order collects about the buyer. Before opening a limited-seat event on a product, place a trial card order in test mode and look at what the portal shows you.
You already have a registration site: the checkout session
If your event already has its website, with its form and its database of registrants, connect payment at the end of the form. An order becomes a session: you create the session server-side, redirect the buyer to the hosted checkout — card with 3-D Secure — and receive the result through a signed webhook. Each session has a limited lifetime — 72 hours by default, expiresAt to shorten it — and is consumed only once.
Three rules for ticketing:
- Confirm the registration on the webhook. Confirm the order when the webhook arrives, never on the redirect alone: the redirect says the buyer came back, not that the payment is secured.
- Put your registration ID in `metadata`. Find your order through your
metadata, echoed verbatim in the event; for a session, the event also carries yourorderId. - Shorten `expiresAt` if you hold a seat during payment: an abandoned session should not block a seat for 72 hours.
A session collects cards only: for a registrant who wants to pay in cash, send a single-use link. The full flow is described on the hosted checkout page.
Knowing who paid: portal, statuses and export
Each tool answers the question "who paid?" differently.
| Tool | What you see | List of names? |
|---|---|---|
| Reusable link and its QR poster | The number of payments (useCount), the total (totalCollected) and each payment in the portal | No: names come from your own form |
| Single-use links | One status per participant: active, paid, canceled, expired | Yes, through customerName and customerEmail |
| Product with stock | Orders and their status, in the portal | Depends on what the order carries: check it in test mode |
| Checkout session | Each payment confirmed by webhook, matched through metadata | Yes, in your own registrant database |
For the list the day before as well as for accounting, every account movement carries the reference of the sale, refund or payout that explains it; the portal separates amount paid, fees and net, and the CSV export keeps those references — from the portal or with GET /v1/transactions/export.csv (up to 10,000 rows; beyond that, split by period with from/to). Timestamps are in UTC; Morocco is UTC+1: your reconciliation tool must convert.
To see where registrants drop off, the portal shows the funnel of a link or a session — how many opened the page, how many entered their card, how many completed — and the Customer journey API module exposes a resource's funnel summary and event detail. Many page views and few payments? Reread the displayed price, the description and the message that goes with the link.
Cancellation or dropout: cancel, refund
To close registration, cancel the reusable link and any single-use links still active. A canceled link can no longer be paid: a poster left on a wall somewhere will bring in no more money.
For a dropout or a canceled event, refund the card payments. Refund a customer, in full or partially, from the portal or through the API. Refunds are free; the amount is deducted from your available balance, and if the balance is not enough, the operation is blocked rather than creating an overdraft. A refund is not instantaneous on the bank side.
Two consequences for an organizer:
- Keep enough to refund while cancellation remains possible: if the proceeds have already gone to your bank, a wave of refunds can be blocked for lack of balance.
- Announce your policy before registration opens — full refund, partial refund or postponement — and repeat it in the message that goes with the link.
Through the API, each refund carries a deterministic refundReference, derived from the registration: replaying the same call does not refund twice. The step-by-step is in refunding a customer.
On the day: check-in from the list
ChariPay does not control access: check-in works from your list, in five moves.
- 1Build the list the evening before, from the portal and the CSV export: paid single-use links, orders, registrations confirmed by webhook — with timestamps converted to Moroccan time.
- 2Share it with the check-in volunteers, sorted by name, printed or on a phone.
- 3Check off names at the entrance: the list is the reference, not a forwarded message.
- 4For a latecomer without registration, create a single-use link in their name on the spot and show its QR code from the list of links, or show the price's QR poster if they pay by card.
- 5Check the "Paid" status in the portal, never on a screenshot: a screenshot can be faked, a status cannot. Volunteers in the cashier role collect without seeing the balance or transfers, but see only their own links and their own transactions: a payment made elsewhere is checked by the organizer, as owner or manager.
After the event, the export and the portal make up your report: each payment and each refund with its reference, and the amount paid, fees and net as the portal separates them.
Frequently asked questions
How do I sell event tickets online in Morocco without a website?
Without a developer, publish the ticket as a product in your hosted storefront and share its link: the buyer pays by card with 3-D Secure, or chooses cash and receives a reference to pay at an agency. For a list of names, send each participant a single-use link from the portal. The reusable link, card only, is created through the API; its QR poster is then downloaded from the link's page. You need neither a website nor ticketing software.
Can I limit the number of seats for an event?
Yes, in two documented ways: publish the ticket as a product in the hosted storefront, with the number of seats as its optional stock, or create as many single-use links as there are seats, each payable only once. We document no per-price quota management and no automatic waiting list: try your setup in test mode before opening.
Does ChariPay send a ticket or an entry QR code to the participant?
No. ChariPay collects and lists payments, but issues neither tickets nor entry QR codes, and does not control access. The ticket is your confirmation: a message you send once the payment is confirmed, or the participant's name on the check-in list, built from the portal and the export.
Can a participant pay their registration in cash?
Yes, with a single-use link in their name: on the link's page, they choose cash, receive a reference and pay it at an agency of the Chari network. As soon as the network confirms the deposit, the link turns "Paid" and you are notified in the portal. On the hosted storefront, the buyer can also choose cash at checkout; the reusable link and its QR poster, however, only collect cards.
How do I know who has paid their registration?
With single-use links, each participant has their own link and status: the list of paid links is your list of registrants. With a reusable link, you see the number and total of payments, not the names, which come from your own form. In every case, the CSV export lists each payment with its reference.
How do I refund participants if the event is canceled?
First close registration by canceling the links, then refund each card payment, in full or partially, from the portal or through the API. Refunds are free and deducted from your available balance; if it is not enough, the operation is blocked. So keep enough on hand to refund, and let participants know that the money does not return to their card instantly.
Can I collect registrations from my own website?
Yes, with a checkout session: your server creates a session for each registration, redirects the participant to the hosted checkout — card with 3-D Secure — and confirms the registration when the signed webhook arrives, never on the redirect alone. Put your registration ID in metadata: it comes back verbatim in the event. For cash, send a single-use link.
Next step
Set up the full ticketing flow in test mode before opening registration: Start in test mode, create two single-use guest links, download the poster of one of them from its page, pay them with the test card, then read the export; the reusable link is created through the API with your test key. The payment links page sums up the offer, and the guide to QR code payments helps you place the poster.
Written by ChariPay team.