Elijah Oloninla

Designing against silent failure in campaign sending.

Bunce is a B2B customer-engagement platform. Businesses send campaigns across email, SMS, WhatsApp, push and voice, paid for with credits from a subscription or wallet.

I designed a pre-send check that calculates what a campaign will really cost and, when the balance falls short, turns a silent failure into a clear choice.

TL;DR

The problem

Customers could start a campaign without knowing whether their balance could cover it. Campaigns failed partly or completely, and they found out only after sending.

Several customers complained about high failure rates, and the frustration put retention at risk, with a real possibility of churn.

Why cost was hard to show

Message length changes the price

An SMS that runs past one page is billed as two, so the same campaign can cost different amounts per recipient.

Personalisation changes the length

Tags like a first name make each message a different length, so the final cost can't be known exactly in advance.

Counting takes time

Working out pages across thousands of recipients is slow, so the check had to stay responsive.

The design question

How might we make the balance constraint visible before customers commit, without slowing down sending?

The approach

I compared doing nothing, blocking every short send, and reporting failures afterwards. I chose a pre-send check that shows the outcome and lets the customer decide. It runs when the customer hits Send and leads to one of four clear outcomes.

Send → Discover failure

Check cost → Decide → Send

1. Calculate before sending

A short loader counts message pages across every recipient, so the cost shown is real rather than a guess, and the wait is explained instead of a frozen button.

Calculating cost: counting message pages across 1,000 recipients

2. Not enough credits

A clear breakdown shows the balance, recipients, credits needed and top-up needed, and explains why: some messages run onto a second page.

The customer chooses: send to the recipients the balance covers, or top up the wallet.

A partial send becomes a decision, not a surprise.

Insufficient balance: send to the 87 recipients covered, or top up

3. No credits at all

Nothing is sent. The customer can top up, or cancel and save the broadcast so their work isn't lost.

No credits: top up, or cancel and save the broadcast

4. Cost may change

When personalisation tags could increase the cost, the customer is told before sending and chooses to continue and apply charges or cancel and save.

Additional charges: personalisation may increase the cost of each message

Details that matter

Work is never lost

Every blocking state offers "Cancel and save broadcast" instead of discarding the campaign.

Exact numbers, plain language

The modal names the exact count the balance covers, e.g. "Send to 87 recipients".

A final safeguard

Credits are re-checked and deducted in one step right before sending, since there are no refunds.

Reaching the rest

Recipients skipped by a partial send can be reached later with Bunce's existing resend feature.

Before vs after

By the numbers

4

clear outcomes for every send, so a shortfall is never silent

0

broadcasts thrown away when the balance falls short; every blocking state can save the campaign

1

final re-check, with credits confirmed and deducted in the same step right before sending

Impact

The redesign targets fewer unexpected failures, more campaigns delivered on the first attempt, and fewer support complaints about failed sends.

The failure rate wasn't measured before the redesign, so I don't claim a percentage reduction. The next step is to track it in production.

Key insight

Silence is worse than friction.

A short pause to calculate cost and a clear choice beat a fast send that fails without warning. Customers don't just need control. They need predictability.

Next project: MathMorph

Work · About · Explorations · oloninlae@gmail.com