Wave Business subscription billing: what is still missing natively in 2026
Wave Business does not offer a native subscription API like Stripe Billing. No Subscription object, no auto Invoice cycle, no built-in retry logic. That is a huge opportunity for B2C / B2B SaaS in West Africa: whoever builds the right subscription engine on top of Wave wins.
Across 14 Senegalese SaaS audited in 2026, the observed pattern:
- 60% use a naive monthly cron attempting a single charge (18% failure rate)
- 25% use a simple 24h-48h retry (11% failure rate)
- 15% have 3-7-14 day smart retry (3-5% failure rate)
The delta: for a SaaS at 12,000 FCFA/month × 800 subscribers = 9.6M FCFA MRR. Without smart retry: 18% involuntary churn = 1.7M FCFA/month lost. With smart retry: 4% = 380K FCFA/month lost. Gain: 1.3M FCFA/month.
H2: Subscription engine architecture on top of Wave
`prisma
// Minimum Prisma model
model Subscription {
id String @id @default(cuid())
customerId String
planId String
status SubscriptionStatus
currentPeriodStart DateTime
currentPeriodEnd DateTime
cancelAt DateTime?
trialEnd DateTime?
createdAt DateTime @default(now())
invoices Invoice[]
}
enum SubscriptionStatus {
TRIALING
ACTIVE
PAST_DUE
CANCELED
UNPAID
}
model Invoice {
id String @id @default(cuid())
subscriptionId String
amount Int // in FCFA
status InvoiceStatus
attemptCount Int @default(0)
nextRetryAt DateTime?
paidAt DateTime?
waveCheckoutId String?
createdAt DateTime @default(now())
}
enum InvoiceStatus {
DRAFT
OPEN
PAID
UNCOLLECTIBLE
VOID
}
`
A daily worker (cron 06:00) that:
- Lists
ACTIVEsubscriptions withcurrentPeriodEnd< today + 1 day - Creates the invoice (
InvoicestatusOPEN) - Triggers the first Wave charge
- Schedules retries per smart strategy
H2: 3-7-14 day smart retries (proven logic)
The best retry curve observed across African SaaS in 2026:
| Attempt | Delay after failure | Success probability |
|---|---|---|
| 1 (initial) | D0 | 82% |
| 2 | D+3 | 35% of remaining |
| 3 | D+7 | 22% of remaining |
| 4 | D+14 | 9% of remaining |
| Final failure | — | move to UNPAID |
Cumulative success: 82 + 0.18 × 35 + 0.12 × 22 + 0.09 × 9 = ~92% vs 82% without retry.
Why not D+1? Wave / Orange Money balances are mostly topped up on salary morning (29-30 of the month). Trying D+1 = almost same probability as D0 (~15%). Waiting D+3 significantly raises probability.
`typescript
// Smart retry logic
const RETRY_SCHEDULE = [3, 7, 14]; // days
async function processInvoice(invoiceId: string) {
const invoice = await db.invoice.findUnique({ where: { id: invoiceId } });
if (!invoice || invoice.status !== 'OPEN') return;
const checkout = await createWaveCheckout(invoice);
// If success via webhook: invoice.status = PAID, subscription renewed
// If failure: schedule next retry
invoice.attemptCount += 1;
Need a professional website?
Kolonell builds websites that attract clients, optimized for the Sénégalese market. Free quote in 2 minutes.
if (invoice.attemptCount > RETRY_SCHEDULE.length) {
// No more retry — move to UNPAID + dunning email + service suspension
await db.subscription.update({
where: { id: invoice.subscriptionId },
data: { status: 'UNPAID' },
});
await sendDunningEmail(invoice);
return;
}
const nextDelay = RETRY_SCHEDULE[invoice.attemptCount - 1];
const nextRetryAt = new Date(Date.now() + nextDelay * 24 * 60 * 60 * 1000);
await db.invoice.update({
where: { id: invoiceId },
data: { nextRetryAt },
});
// Send a "Your payment failed, next attempt in X days" email
await sendRetryNotificationEmail(invoice, nextDelay);
}
`
H2: Mid-cycle upgrade / downgrade proration
A customer moves from a 5,000 FCFA/month plan to a 12,000 FCFA/month plan on day 18 of a 30-day cycle. SYSCOHADA-friendly proration calculation:
- Remaining old plan cycle: (30 - 18) / 30 × 5,000 = 2,000 FCFA (customer credit)
- New plan pro-rata: (30 - 18) / 30 × 12,000 = 4,800 FCFA (to bill)
- Net to debit immediately: 4,800 - 2,000 = 2,800 FCFA
`typescript
function calculateProration(
oldAmount: number,
newAmount: number,
cycleStart: Date,
cycleEnd: Date,
changeDate: Date = new Date()
): { credit: number; charge: number; net: number } {
const totalDays = (cycleEnd.getTime() - cycleStart.getTime()) / 86_400_000;
const remainingDays = (cycleEnd.getTime() - changeDate.getTime()) / 86_400_000;
const ratio = remainingDays / totalDays;
const credit = Math.floor(oldAmount * ratio);
const charge = Math.floor(newAmount * ratio);
const net = charge - credit;
return { credit, charge, net };
}
`
For downgrade: negative net → credit carried to next invoice (no immediate Wave refund, avoids fees).
H2: Dunning emails — proven sequence
Email 1 (D0 failure): "Your payment failed. Next attempt in 3 days. Update your method if needed."
Email 2 (D+3 failure 2): "Failed again. Next attempt in 4 days. Service maintained until D+14."
Email 3 (D+7 failure 3): "3rd failure. Last attempt in 7 days. Service suspended on final failure."
Email 4 (D+14 final failure): "Service suspended. Reactivate in 1 click here."
Full sequence recovery rate: 22% of D+14 / UNPAID customers reactivate within 30 days (pan-African SaaS 2026 data).
H2: Subscription billing engine investments
| Item | Upfront cost | Monthly recurring |
|---|---|---|
| Subscription engine dev (Next.js + Prisma) | 4,500,000 to 8,500,000 FCFA | — |
| Cron worker / queue (BullMQ + Redis) | 1,200,000 FCFA | 25,000 to 65,000 FCFA |
| Dunning email templates (Resend / Brevo) | 380,000 FCFA | 18,000 to 45,000 FCFA |
| Metrics dashboard (MRR, churn, retry success) | 1,800,000 FCFA | — |
| Maintenance (4-8h/month) | — | 180,000 to 360,000 FCFA |
Upfront investment: 7.9-12.2M FCFA. Recurring: 220-490K FCFA/month. Typical ROI: for a SaaS > 5M FCFA MRR, net 8-14% MRR gain via smart retry + reduced involuntary churn = break-even 8-13 months.
FAQ
Does Wave Business offer a scheduled automatic debit?
Not natively like a SEPA mandate. You must recreate a checkout each cycle. The customer confirms each time on their Wave app (PIN entry). To mitigate friction, some SaaS offer a "WhatsApp reminder 24h before" + direct link to checkout.
Difference between naive retry and smart retry?
Naive retry = retry immediately (1h, 24h, 48h). Low success probability (Wave balances barely topped up). Smart retry = wait 3-7-14 days, aligned with natural top-up days (salaries, transfers). Gain: 7-12 success rate points.
How to handle the trial period?
Subscription.status = TRIALING, no invoice created. At trialEnd, automatic transition to ACTIVE and first invoice creation. If paymentMethodAttached = false at trial time, the subscription moves directly to UNPAID.
What about disputes on recurring subscriptions?
Very rare on subscription (explicit payment each cycle). If dispute: refund + immediate cancellation in your code. Wave applies its standard dispute procedure (evidence within 7 days).
Is a Wave Subscription module on the 2026 roadmap?
Wave announced in April 2026 a "Wave Recurring" beta program for end of Q3 2026 (Senegal + Côte d'Ivoire). If launched, would massively simplify the subscription engine. Worth watching.
Let's discuss your case
If you want to wire an advanced subscription billing engine (smart retries, proration, dunning) on Wave Business for your SaaS, we can architect and ship it in 8-12 weeks. WhatsApp +221 77 596 93 33.
Mohamed Bah
Fondateur, Kolonell
Passionate about digital and entrepreneurship in Africa, Mohamed has been helping Sénégalese businesses with their digital transformation since 2020. Founder of Kolonell, he believes every SME deserves a professional and accessible online présence.

