Pricing model research: free-forever vs. trial
Status: research / recommendation. No code changes. Date: August 2026 Question: Is "free forever" the right entry model for Ai-mee, or should it be a time-limited trial that downgrades?
1. What we ship today
From front-end/supabase/migrations/20260530141851_pricing_tiers.sql and api/src/services/plans.service.ts:
| Tier | Price | Channels | Posts/mo | Clients | Entry mechanic |
|---|---|---|---|---|---|
| Free | £0 | 2 | 30 | 1 | "Free forever" |
| Pro | £49/mo | unlimited | unlimited | 1 | "14-day free trial" |
| Agency | custom | unlimited | unlimited | unlimited | sales |
Two things worth naming before the strategy discussion:
- Billing is not live.
POST /webhooks/stripeverifies the signature and returns — the handler is a documented stub (api/src/routes/webhooks.ts:222). Subscriptions are admin-assigned (user_subscription.sourcedefaults to'admin'). The pricing model is still free to change. That window closes the day Stripe goes live. - The landing page advertises both models at once.
front-end/src/pages/index.vue:672renders "Free forever" on the free card and "14-day free trial" on the Pro card. A prospect reading that has no idea what happens on day 15, and neither mechanic is doing its job.
2. The benchmark data
Kyle Poyar / ProductLed / ChartMogul, ~200 B2B products, January 2026:
| Model | Adoption | Free→paid conversion |
|---|---|---|
| Free trial (opt-in, no card) | 57% | 15–25% typical |
| Freemium (free forever) | 26% | 2–5% typical |
| Reverse trial | 7% | 4–6% good, 8–12% great |
| Free trial (card required) | 12% | 31–49% |
The per-1,000-visitor view matters more than the headline rate, because freemium buys volume at the cost of intent:
| Model | Signups / 1,000 visitors | Paying customers |
|---|---|---|
| Freemium | 90 | ~5 |
| Free trial (no card) | 45 | ~3.6 |
| Free trial (card) | 35 | ~10.5 |
Freemium wins on raw signups. It loses badly on cost-to-serve per paying customer — which is precisely the axis that matters for an AI product.
Reverse trial = full premium access for a fixed window, then automatic downgrade to a free plan (not a lockout). It is the least-used model in the dataset and roughly doubles freemium's conversion.
3. Why generic freemium logic does not transfer to us
3.1 Our free users are a cost centre, not a distribution channel
Freemium is justified when free users are the marketing: they invite teammates, they create public artifacts, they generate SEO surface. Slack, Notion, Figma, Calendly.
Ai-mee has none of those loops. It is a single-operator Telegram bot. A free user generates no invitations, no shared documents, no public links. They generate LLM calls.
Buffer can run free-forever because scheduling has ~zero marginal cost. We cannot make the same argument: Bessemer's Feb 2026 pricing playbook puts AI gross margins at 50–60% against 80–90% for traditional SaaS, with inference alone running 4–9% of revenue and rising as usage matures.
3.2 Our free tier is not actually capped
This is the most concrete finding, and it is a bug in the pricing model rather than an opinion about it.
checkLimit(plan, usage, 'posts') gates post generation in four places (planGeneration.ts:87, first-post.service.ts:94, cron.ts:984, integrations.ts:603). Nothing gates the rest of the agentic surface:
- the daily LLM campaign planner (
planCustomerCampaigns,cron.ts:878) runs before the post-limit check at line 984 — so a free user who is capped out still burns planner tokens every single day; - daily 9am briefings, Monday weekly summaries, and 24h approval-queue nudges go to all paired clients;
- the Telegram liaison conversation itself is unmetered;
crawl.serviceruns a site crawl on onboarding.
So the free tier's real cost is not 30 posts × £0.05 = £1.50/month. It is a recurring daily LLM loop per free account, forever, with no ceiling and no expiry. Multiply that by the ~95% of freemium signups who never convert.
3.3 The free tier demos a deliberately worse product
plan_model_override (plans.service.ts:53) lets us assign cheaper models per tier, and resolvePlanModelsForCustomer applies them to generation. The intent is sane cost control. The consequence is not: our permanent shop window runs the cheap model.
For a product whose entire pitch is "a Critic agent enforces your brand voice so the copy is actually good," letting prospects form their quality judgement on the downgraded model is self-defeating. The research language for this is exact — a "permanently crippled free experience" converts worse than a reverse trial precisely because the user never sees the thing they'd be paying for.
3.4 Our value compounds, so a short pure trial is also wrong
Brand voice learning, campaign planning, weekly performance digests, proactive nudges. Two weeks contains two weekly summaries. Onboarding alone (site crawl, brand voice interview, channel OAuth) eats several days.
This cuts both ways: it argues against a 14-day hard trial and it is the strongest argument for the reverse trial. High activation effort creates genuine psychological ownership — the user has invested their brand voice, connected their channels, and accumulated content history. Our own BUSINESS_OVERVIEW.md §6.4 already identifies this as the retention moat. The endowment effect is not a trick here; the switching cost is real.
4. On "hook them, then take it away"
The mechanic works. Prospect theory puts the disutility of a loss at roughly 2× the utility of an equivalent gain, and loss-framing lifts conversion by up to ~32%. That is the engine behind the reverse trial's 4–6% / 8–12%.
But the framing determines whether it is a model or a bait-and-switch, and the difference is entirely about when the user learns the terms:
- Legitimate. "You're on full Pro for 30 days; here's what changes on day 31" — stated at signup, restated at day 20, day 27, day 30. The user chose a trial. Loss aversion does its work honestly.
- Bait-and-switch. Acquire users on an explicit "free forever" promise, then revoke it. Heroku is the reference case: free dynos killed in November 2022, citing abuse-management cost. The abuse problem was real and the money was probably right, but the reputational damage was durable — the developer default moved to Render, and by February 2026 Heroku had entered a sustaining-engineering posture. Loss-framing "corrodes brand trust if overused"; revoking a stated promise is the maximal dose.
This is the timing argument. We currently promise "free forever" on the landing page, and we have Stripe stubbed rather than live — which strongly suggests few or no users have been acquired on that promise. Changing the model now costs a copy edit. Changing it after 5,000 free signups buys us Heroku's problem for free.
5. Competitive context
| Competitor | Entry model | Note |
|---|---|---|
| Buffer | Permanent free — 3 channels, 10 posts each | AI Assistant free on every tier, no usage limits |
| Hootsuite | 30-day trial only — free tier killed | The direct incumbent removed theirs |
| Later | Token free plan, 1 profile | Paid from ~$18.75–29/mo |
| Jasper | Trial | No permanent free tier |
Two conclusions:
- A free tier is not table stakes in this category. The largest player by revenue dropped one. We are not conceding a norm by not having one.
- We cannot win on "free" anyway. Buffer's free tier is more generous than ours will ever be able to afford, because their marginal cost is a database row and ours is an inference call. Competing with Buffer on free is competing on the one axis where our cost structure is strictly worse. We win on output quality and the zero-friction Telegram surface — both of which require the good model to be visible.
6. Recommendation
Neither free-forever nor a hard trial. Move to a reverse trial, and do it before Stripe goes live.
6.1 The model
30-day reverse trial on full Pro. Not 14 — our value is weekly-cadence and compounding, and 14 days is two weekly summaries with onboarding eating the first few. 30 days gives four weekly digests, a full campaign cycle, and enough content history for brand voice learning to visibly improve.
Best models during the trial. No
plan_model_overridedowngrade. The trial is the product demo; demo the product.No credit card at signup. Card-required lifts conversion 2–3× but costs 70–80% of signups. At a £49 SMB price point, with a product that needs weeks to prove itself and a "reluctant tech user" persona in our own target list, that trade is bad. Prompt for the card in-chat around day 20–24, when the value is demonstrated and the deadline is visible.
Downgrade, don't lock out. On day 31, drop to a free plan that is a holding pen, not a product — and critically, one that costs us near-nothing to run:
- ~5 posts/month, 1 channel, 1 client
- proactive automation off: no daily campaign planner, no 9am briefing, no weekly summary, no approval nudges
- cheap model overrides apply here (this is where they belong)
The holding pen is deliberate. Existing content and brand voice stay intact and reactivate on upgrade, so the switching cost keeps working for us; but what the user loses on day 31 is Aimee proactively doing the work — which is the differentiated thing and the hardest to live without once you've had it.
Say it out loud, everywhere. Landing page, Telegram onboarding message, day-20, day-27 and day-30 reminders. Delete "Free forever" from
index.vue. If a user is surprised on day 31, we've built the bait-and-switch instead of the reverse trial.
6.2 Required before this ships
- Gate the cron/agentic surface on plan, not just post count.
planCustomerCampaignsmust check the plan before it runs, not after; same for briefings, weekly summaries and nudges. Without this, the free holding pen still bleeds daily and the whole cost argument for the change is void. - Add trial state to
user_subscription.statusalready permits'trialing'andcurrent_period_endexists — needs a scheduled downgrade job and the reminder sequence. - Reconsider "unlimited posts" on Pro. Unmetered inference behind a flat £49 is the textbook AI margin trap. A generous fair-use ceiling (200–300/mo, soft-warned) protects the p95 account without affecting anyone real. Ai-mee's own £0.01–0.05/post estimate makes a 1,000-post month a £50 account with negative gross margin.
6.3 What to measure
Rough targets from the benchmark set, to be revisited with our own numbers:
| Metric | Target |
|---|---|
| Trial → paid | 4–6% floor, 8–12% is top-quartile |
| Trial activation (channel + brand voice within 7 days) | leading indicator; watch this first |
| Free-plan → paid (post-trial) | any conversion here is upside, not the plan |
| Gross margin per paying account | ≥70%; below that, revisit the fair-use cap |
If trial→paid lands under 2–3%, the diagnosis is an activation problem in the first 7 days, not a pricing problem — the free tier being "too generous" is the standard misdiagnosis at that point.
7. Agreed direction and refinements
Reverse trial + holding-pen free tier is agreed. Three refinements were raised: a tighter fair-use cap (100–200 posts), a brand cap of 3–5 on Pro, and explicit downgrade messaging with upgrade links throughout. Analysis of each below.
7.1 What a "post" actually counts
Worth pinning down before setting any number, because it is not obvious from the schema.
getUserUsage (plans.service.ts) counts rows in customer_posts — the parent content item, one per prompt. The per-platform variants live in a separate table, customer_platform_post, written one row per platform in the generate loop (api/src/routes/posts.ts:495).
So one request — "posts about our summer sale for Instagram, LinkedIn and email" — counts as 1 against the cap, while producing 3 generations plus 3 critic passes.
Two consequences:
- The cap is in the unit users think in. "100 posts a month" reads as 100 content ideas, which is ~3–4 a working week. That is a genuinely generous SMB allowance and a fair number. The instinct to come down from 200–300 is right.
- The cap does not track cost. A 1-channel post and an 8-channel post are identical against the quota and differ 8× in inference spend. The post cap is a fairness control, not a margin control.
7.2 Channels, not posts, are the margin hole
Pro currently sets max_channels: null — unlimited. Combined with a post cap, that is the wrong pair of dials: the uncapped one is the one that multiplies cost.
Using our own £0.01–0.05 per-generation estimate from BUSINESS_OVERVIEW.md §6.2, at a 150-post cap:
| Avg channels per post | Generations/mo | COGS @ £0.01 | COGS @ £0.05 | Margin on £49 |
|---|---|---|---|---|
| 2 | 300 | £3 | £15 | 94% → 69% |
| 4 | 600 | £6 | £30 | 88% → 39% |
| 8 | 1,200 | £12 | £60 | 76% → −22% |
The £0.05 column is our own stated upper bound, not a pessimistic invention. An 8-channel Pro user at the top of that range is loss-making at any post cap we would find acceptable.
Recommendation: set the fair-use cap at 150 posts/month, and give Pro a real channel number (6) rather than null. Six covers every SMB in our persona list, and it converts the unbounded multiplier into a bounded one. If a single dial is preferred, meter customer_platform_post rows instead of customer_posts — that tracks cost exactly, at the price of a less intuitive number to put on the pricing page.
7.3 Brands: 3–5 on Pro is a price cut
Pro is currently max_clients: 1. Moving it to 3–5 is not a tightening — it is a 3–5× loosening of the most valuable dial we have, at the same £49.
Brand count is close to an ideal value metric here: it correlates with the customer's willingness to pay (three brands means three times the marketing budget), with our COGS (each brand has its own crawl, brand voice, planner and content stream), and it is trivially countable. Making it flat inside Pro spends that lever for nothing, and it softens the Pro→Agency wedge precisely where expansion revenue should come from — a five-client agency would pay £49 instead of entering the per-seat conversation.
The underlying instinct — "above 3–5 you're an agency" — is right about where the ceiling sits. It is the floor that shouldn't move.
Recommended structure:
| Tier | Price | Brands | Posts/mo | Channels |
|---|---|---|---|---|
| Free | £0 (post-trial pen) | 1 | 5 | 1 |
| Pro | £49/mo | 1 included | 150 | 6 |
| — | +£19/mo per brand | up to 5 total | +150 each | 6 each |
| Agency | custom | 6+ | negotiated | unlimited |
Per-brand add-on pricing keeps the £49 entry point intact (which is what protects trial conversion), scales quota and cost together automatically, and makes the Agency boundary fall out naturally at brand 6 instead of being an arbitrary line.
Simpler alternative if per-unit billing is unwanted before Stripe is even live: a fixed middle rung — Pro £49 (1 brand) / Studio £119 (up to 5 brands) / Agency (6+). Fewer moving parts, slightly less revenue capture. Either beats flat 3–5 brands at £49.
7.4 Making the downgrade unmissable
The existing PLAN_LIMIT plumbing is in decent shape — checkLimit returns a typed code, fetch.ts:13 recognises the 403, and there are limit-aware messages in ClientList.vue, ManagePlatformsDialog.vue, Step3ClientSetup.vue and ClientOverview.vue:1893. The gaps are these:
- There is no self-serve upgrade path at all.
front-end/src/pages/app/settings.vue:254reads "To change your plan, contact us." In a reverse trial, the day-31 moment is the entire conversion event, and it currently terminates in an email. This is the single highest-value fix on the list and it is blocked on the Stripe handler (webhooks.ts:222) being finished. - Limits surface as transient toasts.
notyf.error(...)inClientList.vue:298,:348and elsewhere. A red toast that disappears in four seconds reads as an error, not an offer. Limit states should be persistent inline<Card>blocks with a primary upgrade action — the store already exposesisAtClientLimit,isAtChannelLimitandisAtPostLimitfor exactly this. - No trial state anywhere in the UI. Nothing renders days-remaining. A persistent header badge ("Full access — 11 days left") from
user_subscription.current_period_endmakes the deadline visible for the whole trial rather than arriving as a surprise. - Telegram is the primary interface and gets none of this. Aimee is where these users live; the Vue dashboard is optional by design. The day-20/27/30 warnings, the day-31 downgrade notice, and every subsequent limit refusal must land in chat, each with a deep link to checkout. A downgrade communicated only in the dashboard is, functionally, a silent downgrade.
- Name the loss concretely. Not "you've been downgraded" but what stopped: "I'll stop planning your week and sending Monday summaries from today." The holding pen works because the absence of proactive work is felt — the message should say what went quiet.
A note on framing, following §4: all of this is honest only if the terms were stated at signup. Persistent upgrade prompting on top of a downgrade the user was warned about three times is a fair offer. The same prompting on top of a surprise is the pattern that "corrodes brand trust."
7.5 Terminology
The UI already says brand (ClientList.vue:114, client/[id]/settings.vue:147) while the schema and plan columns say client (customer_customer, max_clients). Worth settling on "brand" in all customer-facing copy — "client" on an agency's pricing page means their client, which is a different thing and will cause confusion at exactly the tier where the distinction matters.
8. Sources
- ChartMogul — The SaaS Conversion Report
- Kyle Poyar — Your guide to reverse trials
- Growth Unhinged — The 2026 free-to-paid conversion report
- First Page Sage — SaaS Freemium Conversion Rates 2026
- First Page Sage — SaaS Free Trial Conversion Rate Benchmarks
- SaaS Mag — The AI COGS Problem: Gross Margin Compression 2026
- Digital Applied — Freemium vs Free Trial: 2026 Decision Matrix
- Saasly — How to Price an AI-Powered SaaS (the Gross Margin Trap)
- Monetizely — The Free Tier Trap
- Monetizely — Should You Require a Credit Card for Your Free Trial?
- Chargebee — Credit Card Trials vs No Credit Card Trials
- TechTarget — Heroku to end free tiers
- Yu-kai Chou — Prospect Theory & Loss Aversion
- Monetizely — How the Endowment Effect Makes Free Trials Powerful
- Buffer vs Hootsuite pricing comparison