From 4340a9fe0925a8521cb939ffebceb08f307be459 Mon Sep 17 00:00:00 2001 From: Thomas Durieux <5577568+tdurieux@users.noreply.github.com> Date: Thu, 12 Nov 2026 16:36:52 +0000 Subject: [PATCH] =?UTF-8?q?docs:=20keep=20the=20=E2=82=AC49=20annual=20sub?= =?UTF-8?q?scription?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Six of the first 22 subscribers chose the annual plan at €49 and it brought 79% of revenue, so cutting it to €30 would lose money. Co-Authored-By: Claude Opus 5.5 --- docs/paid-hosting.md | 2 +- scripts/test-stripe-sandbox.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/paid-hosting.md b/docs/paid-hosting.md index 346b335..f0a212e 100644 --- a/docs/paid-hosting.md +++ b/docs/paid-hosting.md @@ -7,7 +7,7 @@ Billing is opt-in. `BILLING_ENABLED=false` preserves self-hosted behavior. This Configure these EUR prices in Stripe. The amounts below are suggested prices, not hard-coded charges: - Author monthly: €5/month, recurring monthly. -- Author annual: €30/year, recurring yearly. +- Author annual: €49/year, recurring yearly. In the first nine days of paid hosting, 6 of 22 subscribers chose it and it brought 79% of revenue, so it keeps its price; it is also easy to expense on a grant. - Live updates (`author_pass`): €4 once. Automatic refresh and a separate storage allowance for one existing repository for 180 days from checkout creation. - Extended expiration (`repo_extend`): €2 once. One existing repository can be scheduled to expire up to one year after purchase. Purchases stack: each one adds a year after the latest earlier extension. - Never expire (`repo_never`): €10 once. It costs more than Extended expiration because it is the only purchase that keeps storage in use indefinitely. One existing repository can use Never expire without a subscription. diff --git a/scripts/test-stripe-sandbox.js b/scripts/test-stripe-sandbox.js index 3883210..0523d3c 100644 --- a/scripts/test-stripe-sandbox.js +++ b/scripts/test-stripe-sandbox.js @@ -43,7 +43,7 @@ async function main() { const product = await stripe.products.create({ name: "Anonymous GitHub sandbox integration " + run, metadata }); products.push(product.id); for (const [key, amount, interval] of [ - ["STRIPE_AUTHOR_MONTHLY_PRICE",500,"month"],["STRIPE_AUTHOR_ANNUAL_PRICE",3000,"year"], + ["STRIPE_AUTHOR_MONTHLY_PRICE",500,"month"],["STRIPE_AUTHOR_ANNUAL_PRICE",4900,"year"], ["STRIPE_AUTHOR_PASS_PRICE",400],["STRIPE_REPO_EXTEND_PRICE",200],["STRIPE_REPO_NEVER_PRICE",1000],["STRIPE_REPO_SLOT_PRICE",200],["STRIPE_REPO_PACK_PRICE",500],["STRIPE_CONFERENCE_SMALL_PRICE",4900],["STRIPE_CONFERENCE_PRICE",14900],["STRIPE_CONFERENCE_LARGE_PRICE",39900]]) { const p = await stripe.prices.create({ product: product.id, currency: "eur", unit_amount: amount, metadata, ...(interval ? { recurring: { interval } } : {}) }); prices.push(p.id); config[key] = p.id;