Subscription box in Morocco: selling by subscription and shipping only what is paid
Subscription box in Morocco: design the offer, send a payment link at each due date, ship only once paid, handle pauses, unpaid periods and cancellations.
Running a subscription box in Morocco means billing a customer at regular intervals — every month, every week — for a delivery that keeps coming back: a discovery box, a refill of something they use up, a seasonal parcel. With ChariPay, every installment of the subscription becomes a payment link emailed to your customer, who pays it by card, and every paid installment is signaled to you by webhook. The golden rule fits in one line: ship only what is paid. This guide helps you design the offer, wire shipping to payment, and then handle pauses, unpaid installments, cancellations and damaged parcels.
Subscription commerce: what you are really selling
ChariPay is a Moroccan payment platform, a PSP operated by Chari Money, a payment institution licensed by Bank Al-Maghrib. For an online store, selling by subscription means selling a promise of regular delivery at a fixed price. Three models come up again and again:
- The discovery box: a different selection every month — teas and spices, natural cosmetics, children's books, local products.
- The refill: the same product, delivered before it runs out — roasted coffee, pet food, diapers, cleaning products.
- The periodic basket: a weekly or monthly selection put together in advance, such as a basket of dried fruit or fresh produce.
In all three cases, each subscription carries an amount and a billing frequency. On every due date, ChariPay generates a single-use payment link and emails it to your customer, who pays it by card on the hosted payment page, with 3-D Secure; until they pay, a reminder goes out every day with the same link. The full setup, from the client record to webhooks, is explained in subscriptions through the API. For the broader picture of how an online store gets paid, see the guide to e-commerce payments in Morocco; the offer itself is presented on the subscriptions and recurring payments page.
Designing your monthly box offer: frequency, start, end
A subscription plan comes down to four settings, fixed when each subscription is created:
| Choice | Setting | Example |
|---|---|---|
| Frequency | Weekly, monthly or yearly — daily exists too, rarely useful for a parcel | A tea box every month |
| Start date | The date of the first installment; a delayed start stands in for a free trial | First box at the start of next month |
| End date | Optional, set through the API, for a limited offer | A "three months of discovery" set, a six-month gift subscription |
| Amount | Fixed, in dirhams, shipping included if you build it into the price | One displayed price, with nothing added at checkout |
Three limits shape the design. First, no plan change mid-subscription: to move a subscriber from the small box to the large one, cancel their subscription and create a new one for the same customer — their client record, and the email address their links go to, are reused. Second, no coupons and no proration: the amount requested at every due date is the subscription amount; a promotion becomes a separate plan. Third, one subscription matches one plan: a customer who takes two different boxes has two subscriptions, or a single one at the combined amount if you ship them together.
With your plan in mind, build it before you announce it. Test mode opens as soon as your account is activated, with no approval to wait for: 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 after re-authenticating; the full key is shown only once. Pay with the test card 4918 9141 0719 5005, CVV 123, any future expiry date, 3-D Secure code 555: only this card is accepted, and no real money moves. Your business verification (KYB) runs in parallel and only gates the move to production. Create a subscription whose start date is today: the first link is created immediately and returned in currentCharge. Pay it with the test card, then, with a daily frequency (DAILY), pay the next day's installment, and watch the webhook that will trigger your shipments arrive.
Products and subscriptions: two separate modules
ChariPay also offers a 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.
Products and subscriptions nonetheless remain two separate modules: nothing automatically ties a product listing to a subscription. A product's sales page collects orders; a subscription is created for a customer, from the portal or through the API. The two coexist very well — a hosted storefront for one-off sales, subscriptions for the boxes — as long as you make the connection yourself.
Through the API, that connection goes through metadata, set when the subscription is created: record the box reference there, for example { "box": "tea-spices", "size": "M" }. This metadata is a flat object of 4 KB at most, and it is echoed back unchanged in every subscription.payment_* event. Your shipping tool then knows which box to prepare, and for whom, with no retyping. From the portal, name the box in the subscription's description. Delivery itself stays on your side: ChariPay collects, you ship with the carrier of your choice.
Ship only after a paid installment
The rule that protects your stock: a parcel leaves only after a collected installment, signaled by the subscription.payment_succeeded event. Never on a redirect: the redirect says the buyer came back, not that the payment is secured.
On the server side, the sequence takes five steps:
- 1The
subscription.payment_succeededevent reaches your webhook endpoint. - 2You verify its signature, then deduplicate on
Chari-Event-Id. - 3You find the subscriber through the subscription's
metadataor your subscriptionexternalId, both echoed in the event. - 4You create the picking order in your tool — or the row in today's shipping file.
- 5You reply
2xxonce the order is stored.
Step 3 avoids the classic mistake of matching a payment to a subscriber by its amount: two subscribers to the same box pay the same amount. The general logic of matching is explained in matching a payment to its order, and creating subscriptions with their metadata in subscriptions through the API.
Without a developer, the principle is the same: before each packing round, open each subscription's record in the portal, which shows the state of each of its installments, and prepare only the collected installments.
Pausing for the holidays, resuming on return
A subscriber travels, moves house, or simply has too much stock ahead: rather than lose them, offer a pause. Pause and resume work from the portal or through the API; during the pause, no payment link is sent and you ship nothing. On resume, periods that elapsed during the pause are not billed retroactively.
To keep the pause a service rather than an oversight:
- agree on a return date with the subscriber and note it in your customer record;
- resume the subscription on that date, from the portal or through the API;
- let them know shipments are restarting, in your usual message.
A well-managed pause costs less than a cancellation followed by a new sign-up: the subscriber keeps their subscription, and you keep the subscriber.
Unpaid: no shipment, and what the subscriber sees
When an installment is not paid, what follows is automatic: the subscriber receives an email reminder with the same link every day; while an installment remains unpaid, no new period opens; the link stays payable for 14 days after the due date, then, without payment, the subscription is canceled automatically and your server receives subscription.canceled.
For your logistics, the rule is simple: nothing ships while the installment remains unpaid. The subscriber has received the installment link, then its reminders, to pay for their box by card; a word from you — "your box is ready and will ship as soon as payment comes through" — encourages them to do it. If they pay, prepare their box only once the installment is confirmed as collected, in the portal or through the API; if the subscription is eventually canceled, take the subscriber out of your forecasts.
The full step-by-step, your decisions and message templates are in unpaid subscription installments.
Planning stock from your subscriber list
A box is prepared before it is paid for: you have to buy, assemble and pack. Your list of subscriptions, with their statuses, is your main forecasting tool. You read it through the API (GET /v1/subscriptions); in the portal, you follow the same subscribers installment by installment, from their records.
| Status | For the next shipment |
|---|---|
| Not yet started | First link sent, not paid yet: nothing ships before the first payment |
| Active | Plan for it; the parcel ships once the installment is paid — an installment awaiting payment shows on the subscription's record |
| Paused | Nothing to plan until it resumes |
| Completed | Out of your forecasts |
| Canceled | Out of your forecasts |
Each subscription's next due date also gives you a marker: it shows in the portal's list and, through the API, in the nextRunDate field. You know which subscribers will receive their payment link in the coming days, and you can assemble the boxes accordingly. For one-off sales that share the same stock, the Products module handles optional stock per product: deduct what you set aside for subscribers.
Cancellation and refunds for a damaged shipment
A subscriber may want to stop. You cancel their subscription from the portal or through the API, at their request; if they bought a limited offer, the end date stops it on its own. Cancellation is permanent and takes effect with no further installment: no new link is sent, and nothing already collected is refunded.
Another case: a box arrives damaged or incomplete. 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: let the subscriber know it will not show on their statement right away.
Partial or full? One broken item in a box of six is refunded in part; a lost box is refunded in full — or reshipped, depending on your terms. The full procedure is in refunding a customer.
Frequently asked questions
How do I launch a monthly box in Morocco with card payments?
Define your plan — amount, monthly frequency, start date — then create one subscription per customer, from the portal or through the API; an optional end date is set through the API. On every due date, the customer receives a payment link by email and pays it by card on the hosted page, with 3-D Secure; until they pay, a reminder goes out every day with the same link.
Can I sell a subscription from the hosted storefront?
Not directly: products and subscriptions are two separate modules, and nothing automatically ties a product listing to a subscription. The hosted storefront collects your one-off sales; a subscription is created for a customer, from the portal or through the API. Make the connection yourself: name the box in the subscription's description and, through the API, record its reference in the subscription's metadata.
When should I ship a subscriber's box?
After the installment is collected, as signaled by the subscription.payment_succeeded event, never on a mere redirect. Find the subscriber through the subscription's metadata or externalId, echoed in the event, then start packing. Without a developer, check each subscription's record in the portal before each packing round and prepare only the collected installments.
Should I ship when a subscriber's installment is unpaid?
No: nothing ships while the installment remains unpaid. The subscriber receives an email reminder every day, with the same link, which stays payable for 14 days after the due date. Once the installment is paid, you ship; if the subscription is canceled when the link expires, take it out of your stock forecasts.
Can a subscriber suspend shipments during the holidays?
Yes. They ask you, and you pause their subscription from the portal or through the API: no link is sent and you ship nothing. Agree on their return date, note it, then resume the subscription on that date. They keep their subscription, without having to sign up again, and periods that elapse during the pause are not billed to them.
Can I sell a subscription for a limited time?
Yes, thanks to the optional end date, set through the API when the subscription is created: a three-month set or a six-month gift subscription stops on its own on that date, with the completed status. State the duration and the number of shipments clearly in your offer, so the subscriber knows exactly what they are buying.
How do I refund a box that arrived damaged?
From the portal or through the API: in full for a lost or unusable box, partially for one broken item. The refund is free, deducted from your available balance, and blocked if the balance is not enough. It is not instantaneous on the bank side: let the subscriber know. A refund does not touch the subscription itself: to stop it, you cancel it.
Next step
Build your plan in test mode with a start date of today and a daily frequency (DAILY), pay the first link with the test card, then the next day's, and wire your order picking to subscription.payment_succeeded: Start in test mode. To see what happens when a subscriber does not pay an installment, then read unpaid subscription installments.
Written by ChariPay team.