Implementation reference document. Copy individual sections or download the full spec.
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)
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"
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)
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
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
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 emailEVENTS 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_endTRIGGER 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]