3
5 Comments

People kept asking what happens after the 14 days. The honest answer was "nothing", and it was costing me money

A few of you asked me under my last post what happens to a campaign after the 14 days are up. I answered with something vague about "you can restart the round". The truth is that I had never really looked, because until two weeks ago nobody was paying me for a campaign, so nothing depended on the answer.

Then a developer paid me. For anyone who missed the earlier posts: PeerPlay is an app where Android developers test each other's apps so they can meet Google's rule of 12 testers for 14 days. The free tier is reciprocal, you test mine and I test yours. On top of that I built a paid tier I call VIP. The developer pays $24.99 for 15 tester slots or $34.99 for 20. The testers in that tier are people I approved by hand, on a physical device, and they earn $0.05 for every day they open the app for 30 seconds plus a $0.30 bonus at the end, so about a dollar per tester per campaign. I send the money through PayPal myself once someone reaches $5.

My first customer already had a free app on the platform with real testers on it, so I first had to build an upgrade that keeps those testers. That part went fine. The part that did not go fine was me opening the code to answer the question from the comments. What happens at day 14? Nothing. There was no timer for the developer. There was no end date. Each tester had their own 14-day round, and when a tester finished, their app just said "waiting for the developer to restart". The developer got a notification saying "restart it to keep testing going". That restart button paid the tester another round of about a dollar, and the customer had paid nothing for it. With 15 testers that is roughly $15 of my money every time someone pressed one button.

While I was there I found a second one. The $0.30 bonus was paid from the tester's phone on calendar day 14 of their round, not for the number of days they had actually tested. Someone who skipped thirteen days and opened the app on the last one would have collected it. I also fixed an older bug where a repair routine overwrote a tester's total earnings with one app's number and could have erased what they had earned somewhere else. I mention these because I want to be straight about how young this money code is.

What I ended up with is simple to describe. A VIP campaign has one calendar for everyone, starting the day I approve it, and it lasts 14 days. Every tester sees their own day count starting the day they joined, and the days before that are grey, not red, so a late joiner does not look like someone who skipped. But pay follows the campaign calendar. Someone who joins on day 13 is not paid for 14 days, and I do not want them to be. The bonus now needs at least 12 qualified days out of the first 14 and at least one of the last two days. I like that one rule because it handles late joiners without a special case: nobody who joins after day 3 can reach 12. The bonus is paid once, by the server, and the phone no longer pays it at all.

The 12 testers rule creates a problem I had not thought about. Google's clock starts when the twelfth tester opts in, so if the last one joins four days late, the developer's real finish line is four days after mine. That is where a paid extension comes from. For $2.99 on the 15-slot package or $3.99 on the 20-slot one, the developer buys two more days, and the testers earn $0.05 for each of them, with no extra bonus. For me two days costs at most about $1.50 or $2.00 in tester payouts, so it stays profitable. A banner shows up in the developer's stats 48 hours before the end and stays 48 hours after, and after that the app becomes an ordinary free campaign again so nothing is left hanging.

One thing I am not fully comfortable about is that the extension is applied by the developer's own app after the store confirms the purchase, the same way my Boost works. I accepted that for now because the worst case is a few cents of tester pay, and I can see every extension in my admin panel.

For people who sell anything with a fixed term: do you let customers extend in small paid steps like this, or do you push them to renew the whole thing? And where did you find the price for the small step?

on September 28, 2026
  1. 2

    I'd sell the small paid step, not a full renewal, when the customer only needs a couple more days and your cost is variable. You already checked that two extra days stays profitable after tester payouts. The check I'd add is whether three extensions undercut a new VIP package. If they do, the step is too cheap and people who know they'll need the whole window will stack add-ons instead of buying the main offer. I'd also put the 12-of-14 bonus rule in the FAQ so testers see the cutoff as a rule, not a surprise.

  2. 1

    The payout math on $2.99 looks fine. The length doesn't. You said if tester 12 joins four days late, Google's finish line is four days after yours, but the only extension you sell is two days. So the case you actually described still fails review after they pay. I'd put the real shortfall on that banner (days until the 12th tester hits day 14) and either sell that many days or say straight that two days won't close it. Paying and still missing the rule is worse than no extension.

  3. 1

    "How young this money code is" is the most honest line I have read here this week.

    Same lesson on my side, from the other direction: my payment webhook recorded a 0.99 euro charge as my first sale and I showed it publicly for four hours. It came from a different project sharing the same Stripe account. The fix was the same shape as yours: stop trusting the event, check it against something only my own orders carry (an order reference) before counting it.

    Your restart button is the scarier one, because it cost you money silently while looking like a feature. Did you find it only because of the question in the comments, or were you already seeing payouts you could not match to campaigns?

  4. 1

    Price the small step as a decision with a floor, not a mood. You already did the useful half: two extra days cost you at most about $1.50–$2 in tester payouts, so $2.99/$3.99 only works if that margin survives PayPal fees and the late-joiner case. Write that cost on one line before the banner copy, and refuse any extension price that does not clear it.

    Small paid steps are the right shape when the buyer's clock and yours do not match (Google's 12-tester start vs your campaign calendar). A full renew punishes someone who only needs two days because tester 12 joined late. The who-not-for on the extension is the developer who missed most of the window: they should start a new campaign, not buy two days that cannot hit 12 qualified days.

    One lock: the extension price is public and the same for everyone, decided before the first customer asks. If you set it in the moment someone complains, you discount the thing that was supposed to stay profitable.

  5. 1

    A paid campaign with no end state is also a missed renewal moment. Day 14 is when the developer is most likely to need the next thing: the production release, or another round for a new build. If the campaign closes with a short summary (how many testers stayed all 14 days, where anyone dropped off) and a one-click "run again for the next build", the ending does the selling for you. Did your first paying customer say what they'd have wanted to see at the end?