Restaurant online payments in Morocco: get orders paid before you prepare them
Restaurant online payment in Morocco: an exact-amount link for phone orders, a session for your online menu, a counter poster, the cashier role and closing.
Restaurant online payment in Morocco serves one purpose above all: getting an order paid before you prepare it. For an order taken by phone or on WhatsApp, you send a single-use payment link for the exact amount; for an order placed on your website or online menu, a checkout session redirects the customer to a hosted page; at the counter, a poster with a QR code — on a reusable link created through the API — collects the fixed-price set menu by card. This guide covers these three flows, how to organize your team with the cashier role, canceled orders and end-of-day closing.
Three order flows, three ways to collect
ChariPay is a Moroccan payment platform, a PSP operated by Chari Money, a payment institution licensed by Bank Al-Maghrib. For a restaurant, a snack bar, a delivery kitchen or a caterer, the question is not "should we accept online payment?" but "which channel does the order come through?" Each channel has its tool.
| Order channel | Tool | Accepted methods | When to prepare |
|---|---|---|---|
| Phone, WhatsApp, Instagram | Single-use payment link, for the exact amount | Card with 3-D Secure, or cash at an agency | When the link turns "Paid" |
| Website or online menu | Checkout session, to the hosted checkout | Card with 3-D Secure | When the payment webhook arrives |
| Counter | QR code of a single-use link for the amount of the sale; for a fixed price, the poster of a reusable link created through the API | Single-use link: card, or cash at an agency; poster: card only | When the payment notification arrives |
Two neighboring cases have their own guide. Booking a table, paid in advance to hold it, is covered in taking payment for online bookings. A caterer who works on quotes — a wedding, a corporate event — asks for a deposit instead, then the balance: see collecting a deposit. Here, we are talking about everyday orders, for takeout or delivered by your own staff.
Takeout paid in advance: the exact-amount link
The customer calls or writes: two tagines, a salad, two juices, to pick up at 1 pm. You work out the total and, instead of waiting for them to come and pay (or not come at all), you send them a link. 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.
The settings that suit a takeout order:
- Single-use, so the link only serves this order.
- The exact amount of the order, delivery included if you deliver yourself.
- A useful description: the order number and first name, "Order 58 — Salma — pickup 1 pm."
- A short expiry, 24 hours, for a link paid by card: an unpaid order should not linger.
- Sharing on WhatsApp in the conversation where the order came in, or by email.
Then, one rule in the kitchen: you only start cooking once the link turns "Paid." You are notified in the portal when the payment comes in; no notification, no cooking. On a single-use link, the customer can also choose cash: they receive a reference, pay it at an agency of the Chari network, and you are notified as soon as the network confirms the deposit. For an order to cook within the hour, the card remains the most direct route; for a platter ordered the day before, cash at an agency keeps customers who prefer paying in cash.
One setting matters then. In the portal, turning on "Agency payment" on a link disables its expiry: the link stays payable with no time limit. A link with an expiry date is therefore presented as a link to be paid by card; for a customer who pays in cash, create a link with "Agency payment", without an expiry.
If you have an ordering tool, it can create these links on its own. One call is enough: POST /v1/payment-links returns the payUrl to share. Link settings are presented on the payment links page, and the method for selling by message — confirm, send, follow up — in selling on Instagram and WhatsApp.
Try it with an order of your own before telling your customers: 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 for the amount of an order, pay it with the test card as a customer would, and watch it turn "Paid": no real money moves.
Orders on your website or online menu: the checkout session
If your customers order on your website or on an online menu built for you, payment slots into the cart. 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.
For a kitchen, two points matter more than anything:
- 1Start cooking on the webhook, never on the redirect. 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. The ticket should only reach the kitchen when the
payment.succeededevent arrives. - 2Put the order number in `metadata`. It comes back to you verbatim in the payment event, together with your
orderId: that is what lets your system print the right ticket, with no manual search.
A session lives 72 hours by default; for a meal order, shorten it with expiresAt — nobody pays for lunch three days later. A session is consumed only once, and it only takes cards: for a customer who wants to pay in cash, send a single-use link instead. The full offer is on the hosted checkout page.
At the counter: a QR poster, paid by card
No terminal? At the counter, cards are taken by QR code. Without a developer, create a single-use link for the amount of the sale and show its QR code from the list of links: the customer scans, pays by card with 3-D Secure on their phone, and you are notified when the payment comes in. For a fixed-price set menu displayed permanently, you need a reusable link: it is created through the API, with singleUse: false, then shows up in the portal like the others. 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; the QR code alone, as a PNG, with GET /v1/payment-links/{reference}/qr.
Two limits to know before printing:
- A link carries a fixed amount. The poster therefore suits a fixed price: the lunch set menu, the Friday couscous, the full breakfast. For a variable amount, such as an à la carte bill, stick with the single-use link for the exact amount.
- The poster collects by card only. A poster or a QR code left permanently on the counter is a reusable link: cash at an agency goes through a single-use link, one reference per deposit. Cash paid at your own till stays outside ChariPay.
Before handing over the order, wait for the payment notification in the portal rather than trusting the screen of the customer's phone. The QR mechanics — generating it, where to place it, renewing it when the price changes — are covered in QR code payments.
Organizing the team: the cashier role
In a restaurant, several people take payments, and not all of them need to see the account's money. Portal roles separate viewing from acting: owner, manager, cashier, accountant. The accountant reads everything without triggering anything, the cashier collects without seeing the balance or transfers, the owner or an authorized manager triggers outgoing operations.
In practice:
- The cashier collects payment for orders during service, without seeing the balance or transfers, and does not refund.
- The floor manager, with an authorized manager role, triggers refunds.
- The accountant, in-house or external, reads everything without triggering anything.
- The owner keeps control of outgoing operations.
This separation is not distrust: it is what lets you hand payment collection to extra staff on a weekend night without handing them the account. The rights of each role are detailed in portal roles and access.
Canceled order or missing dish: cancel or refund
A customer cancels, a dish is no longer available, an order arrives incomplete: the right move depends on one question, has the money already moved?
- Before payment, cancel the link: a canceled link can no longer be paid. For a session, cancellation goes through
POST /v1/payment-sessions/{sessionId}/cancel. - After a card payment, refund in full if the order is canceled, partially if a dish is missing. 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: tell the customer so, without promising a date.
The owner or an authorized manager issues refunds, not the cashier: a request made at the counter goes up to the person in charge. The full how-to — portal, API, customer message — is in refunding a customer.
End of day: closing and reconciling
Once service is over, what ChariPay collected is closed in the portal, not in a cash box. As soon as a payment succeeds — a card authenticated with 3-D Secure or a reference paid in cash at an agency — the amount is available in your ChariPay payment account and usable right away: transfers, bills, top-ups. ChariPay is not a bank: your payment account is held by Chari Money. It complements your bank; it does not replace it.
The payout to your bank is a separate operation: automatic every night once a settlement account is configured in the portal, or by transfer on demand, for the amount and at the time you choose. Each payout carries a reference that appears on your bank statement.
For the closing itself, three habits:
- 1Count the paid orders in the portal, which separates amount paid, fees and net.
- 2Export the day as a CSV, from the portal: every movement carries the reference of the sale, refund or payout that explains it.
- 3Convert the times: timestamps are in UTC, and Morocco is UTC+1. A dinner paid just after midnight shows up in the export under the previous day's date.
The full method, with the classic gaps between collected and paid out, is in reconciling your collections.
Frequently asked questions
How do I get a takeout order paid before preparing it?
Send the customer a single-use payment link for the exact order amount, with the order number in the description and, for a card payment, a short expiry, by WhatsApp or email. The customer pays on a page hosted by ChariPay; you are notified in the portal when the payment comes in. The kitchen rule: you only start cooking once the link turns "Paid."
Can I take cards at the counter without a terminal?
Yes. Create a single-use link for the amount of the sale and show its QR code from the list of links: the customer scans, pays by card with 3-D Secure on their phone, and you are notified when the payment comes in. For a fixed-price set menu displayed permanently, the PDF poster relies on a reusable link, which is created through the API; it collects by card only.
Can a customer pay for their order in cash?
Yes, in two ways. At your till, as usual, outside ChariPay. Or with a single-use payment link, created in the portal with "Agency payment" and therefore without an expiry: on its page, the customer chooses cash, receives a reference and pays it at an agency of the Chari network; you are notified as soon as the network confirms the deposit. The counter poster and the checkout session, by contrast, only take cards.
When should I start preparing an order paid online?
On proof of payment, never before. For a session, when the payment.succeeded webhook arrives, never on the customer's redirect alone. For a link, when it turns "Paid" and the notification arrives in the portal. At the counter, wait for that notification rather than trusting the phone screen the customer shows you.
Can the cashier see the balance or refund an order?
No. The cashier collects without seeing the balance or transfers, and does not refund. Outgoing operations, refunds included, are triggered by the owner or an authorized manager; the accountant reads everything without triggering anything. You can therefore hand payment collection to extra staff without opening the restaurant's payment account to them.
How do I refund a canceled order?
If it is not paid yet, simply cancel the link: a canceled link can no longer be paid. If it was paid by card, the owner or an authorized manager refunds it, in full or partially, from the portal or through the API. Refunds are free, deducted from your available balance, and a refund is not instantaneous on the bank side.
How do I find the paid orders at the end of the day?
In the portal, which lists payments and separates amount paid, fees and net, and in the day's CSV export, where every movement carries its reference. Mind the time zone: timestamps are in UTC, Morocco is UTC+1. With an integration, the order number you put in metadata comes back to you verbatim in the payment event.
Next step
Prepare, in test mode first, a message template with a payment link and the QR code of a single-use link for the counter: Start in test mode. The poster for your fixed-price set menu will follow, on a reusable link created through the API; then give your cashier the role that fits. To go further, read QR code payments for the counter and selling on Instagram and WhatsApp for orders by message.
Written by ChariPay team.