DEV Community

CAPTD
CAPTD

Posted on

Paid plans are live, three days before launch — what happened since last week

Last week's update ended with sample photos on the homepage and atomic credit charging. This week CAPTD went from "free beta" to a product you can actually pay for. It launches on Product Hunt on Saturday. Here's what shipped, what broke, and what the numbers really say.

Free tier limits are now real

Until this week the free tier was an honour system. On Saturday 26 Sept I applied the migration that adds a free-generations counter to each profile and switched on entitlement enforcement.

Free now means 10 generations for life, Instagram only, no sign-up. The other nine platforms need a pack. I checked all three layers separately: the platform picker, a direct deep link, and the server. A locked platform shouldn't be reachable just because someone typed the URL.

Two things came up along the way:

The write-guard trigger on profiles had been in the migrations folder for weeks but was never attached in production. I only found out because the new migration re-attached it. Lesson: check what's actually live, not what's in the repo.
The "generations left" counter only updated after a hard refresh. It now updates as soon as each generation finishes, in every workspace and on the homepage widget. A second fix stops it briefly showing the wrong number to a brand-new visitor before their account loads.
Moved the AI to paid billing

On one test-heavy day, about 300 of roughly 390 requests failed with 429 Too Many Requests. That was test traffic on the free tier. A small launch spike would have failed most generations.

There was a privacy reason too. On the free tier, prompts and uploaded images can be used to improve the provider's products. People upload photos with other people in them, and my privacy policy describes the provider as a processor. Those two things don't fit together. It's now on prepaid billing with a budget alert. At current volume it's a few euros a month.

Payments went live today, and broke once

Checkout went live this morning. The first order was mine: a 100%-off code, so €0, in live mode.

Lemon Squeezy took the order fine. Then the webhook to CAPTD was rejected three times with Invalid signature. The signing secret saved in the payment dashboard and the one in my hosting environment weren't the same. One was left over from test mode.

So the order said "paid" and the account got nothing. The fix: set one secret in both places, redeploy, and hit Resend on the failed delivery. The 15 packs appeared. That failure would have been silent for a real customer, so I'm glad it happened on a €0 order.

Earlier the same day I merged a fix for a worse version of the same problem. If the database write failed, Lemon Squeezy's retry was treated as a duplicate and dropped, so a paying customer could have lost their credits for good. Now a delivery only counts as handled once the write has succeeded.

I also added a named purchase_confirmed event. Until now the only conversion event was "content pack exported", so launch-day purchases would have been invisible in analytics.

What the numbers actually say

Before launch I cross-checked analytics against the database, with all my own devices, test accounts and home IPs removed. Three months:

about 190 real visitors
5 real people generated a content pack
1 came back the next day
0 real sign-ups

Two things surprised me.

Three of the four real users I could identify were invisible in PostHog. They'd probably declined analytics cookies or used an ad blocker. That's fine, the consent banner is doing its job, but it means cookie-based analytics can't tell me on its own whether anyone uses the product. After launch I'm adding a server-side counter that only records "a pack was exported": workspace, platform, date. No user ID, no cookie, no device.

About half the anonymous sessions in the database are bots. They never generate anything, so the rule is now to count people by what they do, never by sessions.

A new free tool

Shipped a Phone Camera Mode Finder: pick a scene and it tells you which phone camera mode to use. It's the first tool in a new Phone Photography category, for tools that don't apply to a dedicated camera. Like the other ~60 calculators, it's free and needs no account.

Git hygiene, for my own sanity

Squash merging was cutting the real history between branches and creating fake merge conflicts, so it's now switched off for the repo. Branch rules aren't enforced on a private repo without a paid plan, so every merge now waits for the build check to pass first:

bash
gh pr checks --watch --fail-fast && gh pr merge --merge
What didn't work

I ran a pre-launch game, "Which caption did CAPTD write?", across six platforms. Round one got zero replies, so I stopped it. I also sent 15 personal messages. Zero replies.

I'm not reading much into that. Nobody knows the product exists yet, and that's what a launch is for.

Pricing
Free: 10 generations, no sign-up, no card
Starter: €8.99, 15 content packs (photo + video)
Creator: €18.99, 40 packs (+ slideshows)
Pro: €28.99, 100 packs (all workspaces)
Monthly: from €38.99, for people posting several times a week

Packs are one-off purchases, valid for six months.

Saturday

CAPTD launches on Product Hunt on Saturday 3 October, 12:01 AM PDT (08:01 Dublin):

👉 https://www.producthunt.com/products/captd-every-shot-deserves-a-story

If you post photos for work, I'd love to hear what's wrong with it. If you've launched something solo, I'd love to know what actually brought your first users. I'll be answering comments all day.

Next week's update will be the launch numbers, whatever they turn out to be.

Top comments (0)