MyTaxiLog — Pricing Spec

Implementation reference document. Copy individual sections or download the full spec.

📋 Pricing Overview
APP NAME: MyTaxiLog
PRICING MODEL: Freemium with Subscription (Free Trial → Monthly or Annual)

PLANS:
1. Free Trial     — £0.00  — 30 days full access, no credit card required
2. Monthly Plan   — £8.99  — per month, billed monthly, cancel anytime
3. Annual Plan    — £89.99 — per year, billed annually (~£7.50/mo, saves £17.89 vs monthly)
⏱ Free Trial Rules
TRIAL DURATION: 30 days from account creation date
TRIAL START: Automatically begins on first sign-up
CREDIT CARD: NOT required to start trial
ACCESS LEVEL: Full access to all features (same as paid plans)
TRIAL END BEHAVIOUR:
  - User loses access to premium features after trial ends
  - User is prompted to select a plan (Monthly or Annual)
  - Data is retained (not deleted) even if user does not subscribe
  - User can still view their account but cannot log new trips/expenses
GRACE PERIOD: None (access stops on day 31)
REMINDER EMAILS:
  - 7 days left: "One week left on your free trial"
  - 2 days left: "Only 2 days left"
  - Last day: "Your trial ends today"
📅 Monthly Plan Rules
PRICE: £8.99 / month
BILLING CYCLE: Monthly, on the same date each month
BILLING DATE: Set to the date the user first subscribes
PAYMENT METHODS: Card (Stripe)
CANCELLATION: Cancel anytime — access continues until end of current billing period
REFUND POLICY: No refunds for partial months
FEATURES INCLUDED:
  - Unlimited trip logging
  - Unlimited expense recording
  - MTD quarterly summaries
  - PDF report exports
  - Cloud backup & sync
  - Priority support
  - iOS, Android & Web access
UPGRADE: Can upgrade to Annual at any time (credit remaining days)
📆 Annual Plan Rules
PRICE: £89.99 / year
BILLING CYCLE: Annual, on the same date each year
EFFECTIVE MONTHLY RATE: ~£7.50/month
SAVING vs MONTHLY: £17.89/year (2 months free equivalent)
PAYMENT METHODS: Card (Stripe)
CANCELLATION: Cancel anytime — access continues until end of annual period
REFUND POLICY: Pro-rata refund within 14 days of annual renewal only
FEATURES INCLUDED:
  - Everything in Monthly Plan
  - Advanced tax reporting
  - Mileage & fuel analytics
  - Export to accountant (CSV/PDF)
  - Dedicated driver support
DOWNGRADE: Can downgrade to Monthly at renewal date
🔄 User Subscription States
STATE 1: TRIAL_ACTIVE
  - Days 1–30 after signup
  - Full feature access
  - No payment on file

STATE 2: TRIAL_EXPIRED
  - Day 31+ without a paid plan
  - Limited access (view only, no new entries)
  - Prompt to subscribe shown on login

STATE 3: SUBSCRIBED_MONTHLY
  - Active monthly subscription
  - Full feature access
  - Auto-renews monthly

STATE 4: SUBSCRIBED_ANNUAL
  - Active annual subscription
  - Full feature access
  - Auto-renews yearly

STATE 5: CANCELLED (pending expiry)
  - Cancelled but within paid period
  - Full access until period end date
  - No auto-renewal

STATE 6: EXPIRED / LAPSED
  - Paid plan ended, not renewed
  - Limited access (view only)
  - Prompt to resubscribe
⚙️ Implementation Logic
USER RECORD FIELDS NEEDED:
  - signup_date          (datetime)
  - trial_end_date       (= signup_date + 30 days)
  - subscription_status  (enum: trial_active | trial_expired | subscribed_monthly | subscribed_annual | cancelled | expired)
  - subscription_start   (datetime, null if trial only)
  - subscription_end     (datetime, null if active auto-renewal)
  - plan_type            (enum: trial | monthly | annual | none)
  - payment_customer_id  (Stripe customer ID)
  - last_payment_date    (datetime)
  - next_billing_date    (datetime)
  - cancellation_date    (datetime, null if not cancelled)

ACCESS CHECK LOGIC (run on every protected action):
  IF subscription_status == "trial_active" AND current_date <= trial_end_date → ALLOW
  IF subscription_status == "subscribed_monthly" AND current_date <= next_billing_date → ALLOW
  IF subscription_status == "subscribed_annual"  AND current_date <= subscription_end → ALLOW
  IF subscription_status == "cancelled"          AND current_date <= subscription_end → ALLOW
  ELSE → DENY (show upgrade prompt)

TRIAL EXPIRY JOB (run daily):
  FOR each user WHERE plan_type == "trial" AND trial_end_date < current_date:
    SET subscription_status = "trial_expired"
    SEND email: "Your trial has expired — choose a plan"

PAYMENT RENEWAL FAILURE:
  - Retry payment after 3 days
  - If still failed after 7 days: set status = "expired", send email
🪝 Payment Webhook Events
EVENTS TO HANDLE (Stripe):

  checkout.session.completed
    → Set subscription_status = subscribed_monthly OR subscribed_annual
    → Set subscription_start = now
    → Set next_billing_date / subscription_end accordingly
    → Send "Welcome to MyTaxiLog!" email

  invoice.payment_succeeded
    → Update next_billing_date
    → Update last_payment_date

  invoice.payment_failed
    → Send payment failure email to user
    → After 7 days grace: set status = expired

  customer.subscription.deleted (cancel at period end confirmed)
    → Set cancellation_date = now
    → Set subscription_status = cancelled (access until period end)
    → Send "We're sorry to see you go" email

  customer.subscription.updated
    → Handle plan change (monthly ↔ annual)
    → Update plan_type, next_billing_date, subscription_end
📧 Email Triggers Summary
TRIGGER                          SUBJECT LINE
─────────────────────────────────────────────────────
Sign up                          Welcome to MyTaxiLog — your 30-day free trial starts now
Trial, 7 days left               One week left on your MyTaxiLog free trial
Trial, 2 days left               Only 2 days left — don't lose access to MyTaxiLog
Trial, last day                  Your MyTaxiLog trial ends today
Trial expired (day 31+)          Your MyTaxiLog trial has ended — your data is safe
Payment successful               Payment confirmed — thanks for subscribing!
Payment failed                   Action needed: your payment didn't go through
Subscription cancelled           Subscription cancelled — access until [date]
Annual renewal reminder (30 days) Your annual plan renews on [date]