Afiq Sazlan
POSTOct 2026

Every Notification Has a Price

Every Notification Has a Price

A dense crowd of faded notification cards, with one solid card travelling across to a single person.

Every notification has a price. The person who receives it pays it, in attention. The business that sends it almost never sees the bill.

That's why the number we report is reach: how many people got it. Reach tells you what you got. It says nothing about what you paid.

The goal: the right Kiddocarer, applying quickly

I work on the platform at Kiddocare, a Malaysian marketplace where parents book Kiddocarers (our babysitters).

When a parent posts a childcare job, two things matter. Kiddocarers should apply quickly, because the parent is waiting and often needs someone soon. And the Kiddocarers who apply should be ones that suit this family: someone nearby, someone they've booked before, someone who's good with a child that age.

Push notifications are how we make that happen. A push tells a Kiddocarer there's a job they might want.

The problem: every push looked the same

For a long time, when a job was still waiting for applicants, we pushed it to every Kiddocarer in the region. Each push made sense on its own. Together, they were more than anyone could read.

When every push is urgent, none of them are. Most pushes weren't really for the Kiddocarer who got them, and most went unopened. The clearest case was the push we send when a family asks for a particular Kiddocarer: you've been chosen. That's the most suitable Kiddocarer a job can have, and the push most worth opening. It arrived in the same tray as a pile of routine ones, and most of the time it went unread. Some Kiddocarers switched notifications off altogether.

It was expensive, too. The real price of a push is how many you send for each application it brings in:

price = pushes sent ÷ applications they brought in

Several people on our operations team send pushes to fill hard jobs. Each of them got about the same number of Kiddocarers picked by a parent per job. One of them sent several times as many pushes to get there. Same result, several times the price, and every extra push landed on a Kiddocarer's phone.

Three rows of push icons of very different lengths, each ending in one Kiddocarer chosen.

Three senders, one Kiddocarer picked by a parent each. The row length is how many pushes each sender spent to get there.

Three changes came out of fixing it.

1. Match each job to the best Kiddocarers

Our automatic pushes stopped going to everyone in the region. Now we rank Kiddocarers for each job and push the top of the list.

Before: one job pushed to every Kiddocarer in the region. After: the job is ranked for the family and only the top few get it, starting with a Kiddocarer the family already loves.

Before, every job went to everyone. Now each job is ranked for the family, and only the top few get the push, starting with a Kiddocarer the family already knows.

Two questions decide the order.

Would this family want them? Kiddocarers the family has booked or favourited before always get the push. They're the most likely to be picked and the most likely to apply. Per application, they're also the cheapest pushes we send.

Are they likely to apply? Some Kiddocarers respond to pushes and some never do, and that holds over time. Some of our pushes were going to people who hadn't opened the app in a month. They made the reach number bigger and brought in nothing.

2. Give newcomers a match they can win

Matching to the best Kiddocarer has a blind spot. The best match is almost always someone the family already knows. A newcomer is never that person, so they either never get the push, or they get pushed jobs they're bound to lose.

Bar chart: a new Kiddocarer's chance of winning falls as more people apply, and drops when the family's regular has applied.

A newer Kiddocarer's chance of being picked for a job they apply to. It falls with every applicant already there, and falls further when the family's regular has applied.

Applying and losing again and again is a fast way to lose a newcomer. And newcomers are tomorrow's supply. A marketplace that only rewards the familiar slowly runs out of people to match.

So newer Kiddocarers get a match of their own. A couple of times a day, each one is sent the open job near them that they have the best chance of winning: nobody has applied yet, the family's regular isn't likely to take it, and only a couple of other newcomers get the same job, so they aren't competing with each other. It comes out of the same daily budget, so it never adds to the number of pushes they get.

It's new, and I don't know yet how much it helps. But it changes what a push means to a newcomer: a job worth applying for.

3. Pace the budget through the day

Even well-aimed pushes add up. So each Kiddocarer now has a daily budget for our automatic pushes, and it grows with how often they apply. Someone who acts on our pushes gets more; someone who never does gets very few.

The first version taught me how budgets fail. It used a flat daily cap, and pushes went out first come, first served. By late afternoon most Kiddocarers had used theirs up, so jobs posted in the evening reached far fewer people than they needed.

Line chart: under a flat daily cap, most Kiddocarers run out of pushes by late afternoon; under a paced budget, they run out hours later.

Kiddocarers who had used up their day's pushes, hour by hour, on two Saturdays with the same allowance. The flat cap was replaced at six that evening.

A budget needs pacing through the day, not just a ceiling. Now a Kiddocarer who is ahead of pace only gets a push if the job really needs them. Pacing pushed the point where Kiddocarers run out back by a few hours, so less of the evening's budget gets spent in the afternoon. It isn't perfect yet, and pushes sent by hand aren't on the budget at all. That's the next step.

Did it work?

Most of our push volume disappeared. Jobs got their first applicant about as quickly as before, and filled about as often.

I don't claim more jobs got filled. We compared Kiddocarers who got the push with a group who didn't. The difference in applications is small: the latest reads lean positive, but only just. That's fine. The aim was the same quick applications from a fraction of the pushes, so each push is worth opening again.

The catch: you never see the bill

The price of a notification doesn't arrive as an invoice. Nobody complains. They stop reading, then switch you off.

Switching off is closing the account. After that, even the push from a family who wants that exact Kiddocarer can't get through. When we finally started recording whether Kiddocarers had notifications on, some already had them off. I can't tell you whether our old volume caused that, because nobody was recording it before. You can't measure what you've lost if you only start counting after you've lost it.

So measure the cost before you change anything: whether notifications are on, whether they're opened, when someone was last active.

Reach is what you got. Attention is what you paid.

We didn't want fewer pushes for the sake of it. We wanted the best Kiddocarer for each family to see the job and apply quickly, and every newcomer to get a fair shot at their first booking. That only happens if a push still means something when it arrives.

If you send notifications, do you know what each one costs, and who is paying?