Skip to main content
Back to Help Centre
Coach Guide

Selling Products & Promotions

Everything a head coach needs to take payments — from one-off term fees and camps to fully automated monthly subscriptions, plus promo codes, refunds, and reporting.

What AcademyOS sells today. One-off products (term registration fees, camps, events, kit, donations) andrecurring subscriptions (monthly, quarterly, annual) with optional free trials. Parents self-serve cancel and update payment method via the Stripe-hosted Billing Portal — you don't chase them.

1. Connect Stripe before you launch

Parents pay you directly via Stripe Connect Express — funds land in your bank account, minus Stripe's processing fee and our 3% platform fee on term registrations.

  1. From the admin dashboard, the onboarding checklist shows "Connect Stripe to accept payments" as a required step.
  2. Click Resume Stripe Setup — Stripe's hosted KYC flow opens.
  3. You'll need: business details, UK bank account (sort code + account number), and a photo ID.
  4. Stripe usually verifies in under 5 minutes. Occasionally up to 24 hours.
  5. Once verified, the dashboard tile flips to ✅ and we automatically provision your Stripe Customer Portal config so parents can self-serve subscription management. Zero manual setup.
Until KYC clears, the public Buy / Register flow still works — orders land as payment_status=pendingwith a friendly "we'll email a payment link" message to the parent. No charges are attempted.

2. Creating a product

From Commerce → Products, click New product. Choose a type:

TypeUse it forPlatform fee
term_registrationSeasonal squad fees, plus the basis for recurring plans3%
campMulti-day holiday programs0%
eventAwards nights, parent evenings, tournaments0%
one_offKit, donations, individual items0%

On top of the platform fee, parents pay Stripe's standard processing fee (~1.5% + 20p). Both are bundled into a single transparent "Booking fee" line at checkout — they aren't deducted from your take.

You can't change the product type after creating it. If you mis-typed, archive it (soft-delete, reversible) and start again.

Required fields

  • Name (2–120 chars) — e.g. "Autumn 2026 — U10 Wolves"
  • Price in £ — e.g. 120.00. Use 0 for free items.
  • StatusDraft hides it; Published makes it appear on the public shop immediately.

Optional but recommended

  • Description — what's included, what to bring, refund terms in plain English. Markdown supported.
  • Capacity — once the cap is hit, parents see "Fully booked."
  • Active from / Active to — outside this window, the product is hidden from /shop.
  • Age min / Age max — restricts the product to a player age range.

3. Registration plans (the parent registration wizard)

A "registration plan" is just a product with the "Show on the parent registration wizard" toggle ticked. Whatever plans you publish appear as tiles on /register Step 3 — no more hardcoded trial/term/annual prices.

Four things to set on each plan

  1. Toggle on: tick "Show on the parent registration wizard". The plan appears on the wizard once it's also Published.
  2. Billing interval:
    • One-off — single charge via Stripe Checkout.
    • Monthly / Quarterly / Annual — recurring via Stripe Subscriptions (see §4).
  3. Display order — lower numbers appear first. Default 100. Use 10/20/30 to control where each plan sits in the grid.
  4. Free trial days (recurring only, optional) — set to e.g. 7 and parents get the first 7 days free; first charge happens after the trial. Leave blank for no trial.

Recommended starter set

For a new academy, publish at least three plans so parents have options:

PlanIntervalPriceOrder
Trial Sessionone_off£1010
Term Registrationone_off£15020
Annual Registrationone_off£42030

Add a Monthlyplan (e.g. "Monthly Membership — £25/month") if you want recurring subscribers — see §4.

Your dashboard's onboarding checklist tracks this — the fifth tile ticks the moment you have at least one published plan with the toggle on. It's there to prevent advertising registration before the wizard works.

4. Recurring subscriptions

Pick monthly / quarterly / annual as the billing interval and AcademyOS routes the parent through Stripe Checkout in subscription mode against your connected account. Stripe auto-charges them on that cadence going forward, with the same 3% platform fee on every recurring charge.

What parents see

  • On the registration wizard: a "Recurring" badge on the tile, plus a trial-day note if you set one.
  • After signup: an automatic confirmation email with the next charge date.
  • Ongoing: a Stripe-generated receipt email after every successful charge — no double-send from us.
  • In their portal (/portal/subscriptions): live subscription status, recent invoices with PDF links, and a Manage subscription button that opens Stripe's Billing Portal for cancel + update card.

Cancellations

Parents cancel themselves from the Billing Portal — no support tickets to you. Cancellation takes effect at the end of the current billing period (no proration, no refund for unused time — that's the policy your guide can quote to parents). Once the period ends, the subscription is terminated and the registration is marked inactive.

Failed payments & dunning

  1. First failure: parent + you both get an email. Stripe automatically smart-retries on its standard schedule (typically up to 4 attempts over ~2 weeks).
  2. Eventual recovery: subscription returns to active. No action needed.
  3. Final failure: subscription moves to unpaid / canceled. The local registration is auto-suspended (status=inactive) and both you and the parent get a "subscription cancelled" email.

Parents can rescue a past-due subscription themselves by going to /portal/subscriptions → Manage subscription and updating the card before the retry window exhausts.

Coach-side metrics (admin dashboard)

  • MRR tile — active + trialing subscriptions normalised to a monthly figure (so quarterly/annual don't skew it).
  • Active subscriptions count — how many parents are auto-renewing.
  • Past-due count — your dunning early-warning indicator.
  • Subscription badge column on the Registrations table (Active / Trial / Past due / Cancels [date] / Suspended).
Pricing changes only affect new signups.Existing subscribers keep paying the price they signed up at — by design, so promo prices don't break active accounts. If you genuinely need to migrate someone to a new price, refund + cancel their subscription and ask them to re-register.
Stripe Billing Portal config is automatic.The first time your KYC clears, AcademyOS provisions the Stripe Customer Portal configuration on your connected account with cancel-at-period-end and update-payment-method enabled. You don't need to touch the Stripe Dashboard.

5. Editing, archiving, deleting

You can edit name, description, price, capacity, booking window, age range, status, and the registration-plan toggles.

You can't edit the type or slug (URL) — both would break things.

Bumping the price affects only future orders / signups. Anyone who already paid (or is on a recurring subscription) keeps the price they paid. Reducing capacity does not retroactively cancel existing orders.

Archiving and deleting are both reversible (soft-delete). Existing orders stay valid and refundable. Re-publishing brings the product back unchanged.

6. Promotions and discount codes

Voucher codes

From Commerce → Promotions → New, create a code parents type at checkout to get money off.

  • Code — 3–20 characters, A–Z and 0–9 only. Auto-uppercased. Must be unique in your academy.
  • Discount typepercent (1–100) or fixed (£ off).
  • Valid from / valid to — optional date range.
  • Max redemptions — total caps across all parents.
  • Max per parent — defaults to 1.
  • Applies to — restrict to specific products or product types if you want.

Sibling discount (automatic)

Auto-applied when a parent already has another active order with you. Only one active sibling promotion per academy at a time. Parents don't need a code — the discount appears at checkout.

Redemption report

Click Reportnext to any promotion on the Promotions page to see the full redemption log: parent name, email, product, payment status, total. Useful for understanding what's converting and chasing up unpaid orders that used a discount.

Bundle and early-birdpromotion kinds exist in the schema but are not yet wired up at checkout. Don't promise either to parents.

7. Orders and refunds

Commerce → Orders lists every order — parent name, product, total paid, status, and a link to the Stripe payment.

Issuing a refund

Click an order → Refund. You can refund the full amount or a partial amount.

  • Stripe processes the refund — money returns to the parent's card in 5–10 business days.
  • Order status flips to refunded or partial_refund.
  • Stripe deducts the refund from your next payout.
The parent gets an automatic refund email.It tells them the amount, whether it's partial, your reason (if you provided one), and how long card refunds typically take. You don't need to email them separately. The refund is also written to the audit log.

8. The parent's checkout journey

For visibility, here's exactly what a parent experiences:

Standalone shop products (camps / events / one-offs)

  1. Browses /shop — sees published products grouped by type, with capacity remaining shown.
  2. Clicks a product → arrives at /shop/<slug>.
  3. Fills in details + optional promo code → Buy now.
  4. Stripe's hosted checkout opens. Pays via card / Apple Pay / Google Pay.
  5. Returns to /shop/success — order is confirmed.

Term registrations (one-off and recurring)

  1. Goes to /register — 5-step wizard.
  2. Steps 1–2: parent + player details + medical consent.
  3. Step 3: picks a squad, then picks one of your published registration plans.
  4. Step 4: terms + medical consent + photo consent (optional).
  5. Step 5: Stripe Checkout — single charge for one-off plans, subscription mode for recurring.

9. Multi-currency, taxes, payouts

  • Currency — defaults to GBP. Each product stores its own currency, but the UI assumes GBP for now.
  • Taxes — Stripe collects VAT in jurisdictions where it's registered for you. AcademyOS does not let you set per-product tax rates yet.
  • Payouts — Stripe pays you on its own schedule (typically rolling 7-day for new accounts, then daily). Configure this in your Stripe dashboard.

Common questions

Can I run a recurring monthly subscription?

Yes — fully end-to-end. Create a plan with a monthly (or quarterly / annual) billing interval and parents are auto-charged via Stripe Subscriptions. They self-serve cancel and update card from /portal/subscriptions. Failed payments trigger Stripe smart retries; if the retry window exhausts, the registration is auto-suspended and both parties are emailed. Optional free trial supported.

Can I let parents cancel their own orders?

Subscriptions: yes, from /portal/subscriptions → Manage subscription. Takes effect at end of current period — no refund for unused time.
One-off orders: not yet self-serve. Parents email you, you issue the refund.

Can I see who used a promo code?

Yes — open Commerce → Promotions, click Report on any promo for the full redemption log: parent name, email, product, status, total.

Can I take a deposit and bill the rest later?

Not directly. Workaround: create two products, "Camp Deposit" and "Camp Balance", and ask parents to buy both. Or use a recurring subscription with a low monthly amount.

Do I have to configure anything in the Stripe Dashboard for the parent portal?

No. The Stripe Customer Portal configuration (cancel-at-period-end, update payment method) is provisioned automatically the moment your KYC clears. If something looks broken — clicking Manage subscriptionfrom a parent account returns an error — tell us and we'll backfill.

For technical or billing questions, email support@flowedgeai.com — we typically reply within 2 hours during business hours.