E-commerce13 min read

Wave Business advanced subscription billing: smart retries, proration, mid-cycle upgrades 2026

Mohamed Bah·Fondateur, Kolonell
June 3, 2026
Share:
Wave Business advanced subscription billing: smart retries, proration, mid-cycle upgrades 2026

Wave Business advanced subscription billing: smart retries, proration, mid-cycle upgrades 2026

E-commerce

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 ACTIVE subscriptions with currentPeriodEnd < today + 1 day
  • Creates the invoice (Invoice status OPEN)
  • 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:

AttemptDelay after failureSuccess probability
1 (initial)D082%
2D+335% of remaining
3D+722% of remaining
4D+149% of remaining
Final failuremove 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

ItemUpfront costMonthly recurring
Subscription engine dev (Next.js + Prisma)4,500,000 to 8,500,000 FCFA
Cron worker / queue (BullMQ + Redis)1,200,000 FCFA25,000 to 65,000 FCFA
Dunning email templates (Resend / Brevo)380,000 FCFA18,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.

Tags:#Wave Business#subscription#billing#smart retries#proration#SaaS
Share:

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.