Overall Status: LAUNCH FEASIBLE BUT REQUIRES URGENT VERIFICATION
The Stylify billing infrastructure is partially built but contains critical gaps that must be closed before accepting payment on Day 1. Most critically, Stripe integration status is unclear — we don't have definitive confirmation that subscription billing actually works end-to-end. The Supabase database is on a free tier with auto-pause risk, and founding member pricing logic hasn't been verified in production.
This audit identifies 7 issues that block revenue capture, 5 that should be resolved pre-launch to avoid financial risks, and 6 that can be deferred to post-launch. Key timeline: Meta approval expected ~March 5. Supabase Pro upgrade should happen ~March 1. Stripe verification must happen this week.
- Live (non-test) Stripe account credentials
- Subscription creation endpoint test
- Trial-to-paid transition test
- Payment confirmation in production
- Webhook handling validation
- Test account signup → 14-day trial starts → day 15 automatic charge occurs
- Verify monthly subscription created in Stripe dashboard
- Verify webhook handling (payment_intent.succeeded, customer.subscription.updated)
- Document findings in DECISIONS.md
- Identifies a user as a "founding member"
- Charges them the discounted price instead of $99/mo
- Locks that price in permanently
- Grants them Pro features
- Identify where founding member status is stored (users table column?)
- Verify Stripe subscription creation passes correct price ID ($49 or $39 depending on billing period)
- Test: Create 2 founding member accounts, verify they're charged $49/$39, verify they get Pro features
- Verify lock-in mechanism (price can't change if they cancel/resubscribe)
- Document in DECISIONS.md
- Automatically start charging them based on their chosen tier
- Downgrade features to match their tier (if they chose Solo, remove auto-publishing)
- Either succeed and send confirmation, or fail and escalate
- Document the exact flow: trigger (time-based job?), payment attempt, success/failure handling
- Create a test user, verify trial-to-paid happens on day 15
- Test both success (card accepted) and failure (card declined) scenarios
- Verify feature downgrade happens correctly if user chose Solo
- Implement email notification for successful transition (or escalate to Jason)
- Document in DECISIONS.md
- UI checkbox/toggle for "pay annually" during signup/checkout
- Stripe price IDs created for annual billing intervals
- Founding member annual pricing ($39/mo = $468/yr)
- Annual billing in tier selection flow
- Create Stripe price IDs for all annual plans (6 total: Solo/Pro/Salon × monthly/annual)
- Add annual billing toggle/radio to tier selection (Step 3 of onboarding or checkout)
- Verify logic switches price IDs based on selection
- Test founding member annual pricing ($39/mo)
- Verify annual subscription auto-renews at end of year
- Email 1 (immediate): "Your payment failed. Click to update payment method."
- Email 2 (day 3): "Your payment is still pending. Access suspended in 3 days."
- Email 3 (day 6): "Your subscription has been cancelled due to unpaid payment."
- Stitch: Wire Stripe webhook events to Kit API (customer.subscription.payment_failed, invoice.payment_failed)
- Charlotte: Write 3 dunning emails (recovery-focused, not guilt-based)
- Stitch: Auto-tag users in Kit when payment fails (e.g., tag "payment-failed")
- Kit: Create automation sequence triggered by tag
- Test end-to-end: simulate failed charge, verify emails send, verify feature access suspended
- No refunds for mid-period cancellations
- Access retained through end of billing period
- Subscription automatically cancels at renewal
- Cancel button in the app
- Confirmation screen with refund policy callout
- Cancellation reason collection (for analytics)
- Subscription cancellation in Stripe
- Feature retention through period end
- Email confirmation of cancellation
- Stitch: Add "Cancel Subscription" button to Settings page (hidden until user has active subscription)
- Add confirmation modal showing: "You'll lose access on [date]. No refund for partial periods." with reason dropdown
- Call Stripe API to cancel subscription at current period end (don't charge next cycle)
- Send confirmation email with final access date
- Charlotte: Write cancellation email (acknowledge loss, offer win-back)
- Tag user in Kit for win-back sequence when they cancel
- Formal chargeback dispute response template
- Process for evaluating refund exceptions (e.g., duplicate charge, billing error)
- Appeals process if customer disputes "no refund"
- Stripe account configured to respond to chargebacks
- Staff training on when refunds are legally required (ROSCA, state laws)
- Charlotte: Document refund policy exceptions (e.g., "We'll refund if you request within 7 days of trial charge").
- Add exceptions to ToS.
- Create chargeback response template for Jason (points to trial offer, ToS, etc.).
- Research state-specific refund requirements (CA, NY, IL at minimum).
- Stitch: Ensure Stripe disputes are logged in app analytics so Jason can track.
- Free tier has no backup, no SLA, 1GB DB limit
- Keep-alive script is a hack — could fail silently
- Production data at risk
- Unacceptable for paying customers
- Upgrade Supabase to Pro ($25/mo)
- This requires entering a credit card in Supabase dashboard (Jason may need to do this)
- Verify upgrade succeeds, keep-alive can be removed
- Pro includes: daily backups, 8GB DB, 250GB bandwidth, SLA, 24/7 support
- Remove keep-alive script from server.js after upgrade
- 1 post per day per user
- Single pass through Claude for caption + context
- Occasional fallback to OpenAI
- How many users retry/regenerate captions (not 1 per day, could be 2-3)
- Whether we add photo analysis (increases per-post cost)
- Whether carousel posts (3-5 captions) are common
- Fallback rate to OpenAI (Haiku availability issues?)
- 100 founding members = $15/month in API costs (vs. estimated $7)
- 1,000 users = $150/month (vs. estimated $70)
- Set up cost tracking in Anthropic dashboard + OpenAI dashboard (sync weekly)
- Log actual per-request costs in analytics (tokens used × rate)
- After 50 founding members, calculate actual cost per user vs. estimate
- If actual > $0.12/user, investigate: regeneration rate? carousel frequency? fallback rate?
- Update financial dashboard with real rates
- Railway: Could be $50-200/mo depending on CPU/memory
- Supabase: Pro may not scale — might need to upgrade to Team plan (~$600+/mo)
- Vercel: Free tier has limits (50GB/month bandwidth, build time) — could exceed and bill
- Resend (email): Free tier is 100/day (might hit limits)
- Kit (email): $39/mo at 10K subscribers, but growth beyond requires paid tier
- Infrastructure costs could reach $1,000+/mo
- With blended ARPU $79/mo, we need ~13 users just to cover infrastructure
- No surprise bill shock if we grow fast
- Create 3-tier infrastructure cost model: 100 users, 500 users, 1,000 users
- Identify upgrade points (when to move from free to paid in each service)
- Monitor actual usage weekly and model forward
- Update financial dashboard with scaling scenarios
There's no documented full-funnel test. Multiple pieces exist but may not wire together:
- Landing page copy and "Try Free" CTA (exists)
- Signup form (exists but may not have tier/annual selection)
- Stripe checkout (exists but not verified)
- Trial setup (exists but not verified)
- Trial-to-paid transition (not verified)
- Stitch: Walk through signup flow end-to-end:
- Navigate to stylify-ai.com
- Click "Try Free" or "Start Free Trial"
- Enter email, password
- Select tier (Solo, Pro, or Salon)
- Select billing period (monthly or annual)
- Enter card info (use Stripe test card 4242 4242 4242 4242)
- See confirmation "Your 14-day trial starts now"
- Login and verify you have correct features
- Verify subscription created in Stripe dashboard
- Verify trial end date in app
- Document all screenshots in DECISIONS.md with "VERIFIED" label
- Test with both Solo and Pro tiers
- Test annual billing at least once
- Counter tracking how many founding members have signed up
- Logic to flip "accept founding members" flag to false after 100
- Messaging to tell users "founding members sold out" if they arrive after 100
- Safeguard against accidentally selling 101st founding member at $49
- Add `founding_member_count` to admin dashboard
- Create logic: on every user signup, increment counter if billing_tier='founding'
- When counter reaches 100, set feature flag `founding_members_closed=true`
- On signup form: if flag is true, hide founding member option
- Email Jason when counter hits 90, 95, 100 so he can decide if offer closes or extends
- Log this to DECISIONS.md: "Founding member enforcement implemented"
- Revenue captured this month (vs. plan)
- Churn rate and MRR impact
- Active subscription count by tier
- Failed payment attempts
- Customer acquisition cost (CAC)
- Lifetime value (LTV) by cohort
- Add admin dashboard page: "Revenue This Month"
- Queries:
- SUM(amount) from successful Stripe charges this month
- Count of active subscriptions by tier
- Count of churn this month
- Failed payment attempt count
- Email Jason weekly with summary (template in inbox)
- Bulk account creation + immediate signup (bot attack?)
- Multiple failed payment attempts from one card
- Same card used to create 5+ accounts
- Chargeback-prone card patterns (high-risk countries, prepaid cards)
- Founding member signups with test cards (4242 4242 4242 4242, etc.)
- Log signup events to analytics: email, card last-4, payment status
- Flag and email Jason if:
- Same card creates 3+ accounts in 1 day
- Same email + multiple cards (5+ cards in 1 week)
- Card matches known test patterns (Stripe has a list)
- Enable Stripe Radar for fraud detection (free in Stripe dashboard)
- Create monthly reconciliation checklist:
- Export Stripe revenue report
- Query app database for successful charges
- Compare: should be equal
- Check bank deposit matches Stripe payout
- Log any discrepancies
- Mint to own this task (spreadsheet + checklist)
Assumptions:
• Founding member launch: ~March 6
• Target: 100 founding members acquired over ~30-60 days
• Distribution: 70% monthly billing ($49/mo), 30% annual ($39/mo, 12-month prepay)
• No existing revenue (pre-launch)
• Churn: Assumed 0% in first 30 days (founding effect), then ramping
• CAC: $0 for founding (organic/direct channels)
| Month | Period | Founding Members Added | Active Subscriptions | Monthly Revenue | Annual Prepay (one-time) | Total Revenue |
|---|---|---|---|---|---|---|
| Month 1 | March 6-31 | 35 | 35 | $1,715 | $425 | $2,140 |
| Month 2 | April 1-30 | 50 | 85 | $4,165 | $608 | $4,773 |
| Month 3 | May 1-31 | 15 (cap reached) | 100 | $4,900 | $0 | $4,900 |
| 90-Day Total Revenue | $11,813 | |||||
Operating Costs Over 90 Days:
| Cost Category | Monthly | 3-Month Total | Notes |
|---|---|---|---|
| Supabase Pro | $25 | $75 | Upgraded from free (~March 1) |
| Railway Backend | $15 | $45 | Estimate: $5-20 at 100 users |
| Claude API (Haiku) | $49 | $147 | $0.07/user × avg 70 users |
| OpenAI API (fallback) | $10 | $30 | ~10% of Haiku volume |
| Kit (ConvertKit) Email | $0 | $0 | Free tier (10K subs, 1 sequence) |
| Domain (getstylify + stylify-ai) | $2.50 | $7.50 | ~$30/year prorated |
| ElevenLabs (if active) | $22 | $66 | For demo video voice cloning (optional) |
| Resend (transactional email) | $0 | $0 | Free tier (100 emails/day) |
| Vercel (frontend) | $0 | $0 | Free tier (unlikely to exceed limits) |
| Total Operating Costs (without ElevenLabs) | $123.50 | $370.50 | |
| Total Operating Costs (with ElevenLabs) | $145.50 | $436.50 |
90-Day Profit (Excluding Stripe Fees & Founder Salary):
| Scenario | Revenue | Costs | Gross Profit | Profit Margin |
|---|---|---|---|---|
| Conservative (no ElevenLabs) | $11,813 | $371 | +$11,442 | 96.8% |
| With ElevenLabs | $11,813 | $437 | +$11,376 | 96.3% |
Adjustments Not Included: Stripe processing fees (2.2% + $0.30/transaction = ~2.5% of revenue, or ~$295 on $11,813), which would reduce net profit to ~$11,100 and margin to 94%. Still highly profitable. Also not included: Jason's salary/draw, taxes, contractor costs (none expected in 90 days), or customer refunds.
- Supabase: Pro tier ($25/mo) supports 100 concurrent users. We're OK.
- Railway: $5-20/mo tier has 512MB RAM. 100 users × 2MB session state = ~200MB used. Should handle, but close.
- Claude API: If 100 users all generate captions simultaneously, we'll hit rate limits. API will reject requests.
- Stripe: No limits, processes fine.
- Email: Resend free tier can send 100 emails/day. 100 users = 100 confirmations + welcome emails = exhausts limit on day 1.
- Stitch: Pre-load test with 100 concurrent requests to generation endpoint to identify breaking point
- Stitch: Implement request queuing + backpressure (if Claude queue > 50, return "busy, try again" instead of erroring)
- Stitch: Set up Sentry alerts for error rate spikes (threshold: > 5% fail rate)
- Jason: On Day 1, monitor Sentry/logs every 30 min for first 4 hours
- If Claude rate limit hits, Stitch has fallback to OpenAI (already in code)
- If Resend limit hits, Stitch can manually send welcome emails or switch to Kit (but would require coordination)
- Have Stripe phone number ready in case charge processing has issues
- Users regenerate captions 3-4x per post (we estimate 1x)
- Carousel posts are common (3 captions instead of 1)
- Photo analysis is enabled (adds tokens per request)
- Claude API becomes unavailable and we heavily lean on OpenAI (3x cost)
- Stitch: Log every API call with token count used
- Calculate actual cost per user after 7 days, 14 days, 30 days
- If actual cost > $0.12/user, investigate: regeneration rate? carousel frequency?
- If pattern confirmed, optimize:
- Reduce context window if possible
- Switch more carousel to GPT-4o-mini (cheaper for long output)
- Implement caching (same photo gets same suggestion)
- Stripe processes chargeback, deducts $49 + $15 fee = $64 loss per chargeback
- 3 chargebacks = $192 loss
- If pattern continues, Stripe could flag account for review (high chargeback rate = increased risk)
- We have no formal refund policy beyond "no refunds" (which may not hold up legally)
- Stitch: Monitor Stripe chargeback rate weekly
- If user requests refund: Jason has authority to approve for users who sign up and don't log in (low friction, acknowledges we haven't provided service)
- Charlotte: Document refund exception policy in ToS (e.g., "Refund within 7 days if no posts generated")
- If chargeback happens: Stitch files dispute with Stripe (we have proof of service delivery)
- Stitch: Implement daily backup export (SQL dump to S3) on top of Supabase's backups
- Test restore from backup monthly
- 100 founding members → 60 active by day 90
- Revenue: 60 × $49 + 40 × $39/12 (annual cohort amortized) = ~$3K/month (instead of $5K)
- We've still built a business but with slower early traction
- Retention automation (emails, health scoring) built Day 1 to maximize retention
- NPS survey at 7 days to identify churn reasons early
- Win-back sequences for cancellations
- Add "Update Payment Method" button in Settings
- Click opens Stripe-hosted payment form (Stripe Billing Portal)
- User updates card without leaving app
- Link to Stripe receipt in settings
- Receipt email from Resend or Stripe
- In-app invoice history
- Stitch: Add "Billing History" page to Settings (lists past charges, links to Stripe invoice PDFs)
- Add "Invoice" button on Stripe receipts that opens PDF
- Charlotte: Write receipt email template (sent by Stripe webhook)
- Stripe product IDs (what's a "Solo" product ID in Stripe?)
- Price IDs for each tier × billing (6 total)
- Webhook endpoints configured (which events go to which URLs?)
- Customer sync logic (when we create a user, do we create a Stripe customer?)
- Coupon/discount configuration
- Tax settings (are we configured for sales tax?)
- Payout settings (where does money go?)
- Document in DECISIONS.md or a new "Stripe Configuration Guide":
- List all Stripe IDs, webhook endpoints, configuration choices
- Include screenshot of Stripe dashboard with key pages
- Are we collecting/remitting sales tax? (Likely yes, varies by state)
- Are we VAT/GST compliant if we get international customers?
- Do we need to report to IRS for 1099 contractors (we have none now, but may later)?
- What's our tax entity structure (sole proprietor, LLC, etc.)?
- Determine sales tax obligation in primary states (look at Stripe settings — may auto-collect if configured)
- If needed, set up sales tax remittance
- Stripe Tax can auto-calculate and collect if enabled
| Priority | Finding | Owner | Deadline |
|---|---|---|---|
| 🔴 BLOCKER | Stripe Integration Status Unknown | Stitch | This Week (2/24-2/28) |
| 🔴 BLOCKER | Founding Member Pricing Logic Not Verified | Stitch | This Week (2/24-2/28) |
| 🔴 BLOCKER | Trial-to-Paid Conversion Path Not Documented | Stitch | This Week (2/24-2/28) |
| 🔴 BLOCKER | Annual Billing Not Fully Implemented | Stitch | Before Launch |
| 🔴 BLOCKER | Dunning Emails Not Built | Stitch + Charlotte | Month 1 Post-Launch |
| 🔴 BLOCKER | Cancellation Flow Not Implemented | Stitch + Charlotte | Month 1 Post-Launch |
| 🔴 BLOCKER | Refund/Chargeback Policy Not Formalized | Charlotte + Jason | Before/Month 1 Post-Launch |
| 🟡 IMPORTANT | Supabase Free Tier Auto-Pause Risk | Stitch | ASAP (~March 1) |
| 🟡 IMPORTANT | Landing Page → Payment Flow Not End-to-End Tested | Stitch + Jason | This Week (2/24-2/28) |
| 🟡 IMPORTANT | API Cost Scaling Uncertainty | Mint + Stitch | Month 1 Post-Launch |
| 🟡 IMPORTANT | Infrastructure Costs at Scale Not Modeled | Mint + Stitch | Month 1-2 Post-Launch |
| 🟡 IMPORTANT | 100 Founding Member Cap Not Enforced in Code | Stitch | Before Launch |
| 🟡 IMPORTANT | Real-Time Revenue Dashboard Missing | Stitch | Month 1 Post-Launch |
| 🟡 IMPORTANT | No Fraud Detection or Suspicious Transaction Alerts | Stitch | Month 1 Post-Launch |
| 🟡 IMPORTANT | No Payment Method Updating UI | Stitch | Before Launch or Month 1 |
| 🟡 IMPORTANT | Invoice/Receipt System Not Documented | Stitch + Charlotte | Month 1 Post-Launch |
| 🟡 IMPORTANT | No Documentation of Stripe Account Configuration | Stitch | Before Launch |
| 🟢 POST-LAUNCH | Referral Program Not Built | Stitch + Charlotte | Month 1 Post-Launch |
| 🟢 POST-LAUNCH | Retention Email Sequences Not Built | Stitch + Charlotte | Day 1 Post-Launch |
| 🟢 POST-LAUNCH | ElevenLabs Voice Cloning Cost | Jason | Post-Launch (optional) |
| 🟢 POST-LAUNCH | Descript Subscription May Be Deferred | Jason | Post-Launch (optional) |
| 🟢 POST-LAUNCH | Monthly Financial Reconciliation Process | Mint | Month 2 Post-Launch |
| 🟢 POST-LAUNCH | Tax/Compliance Setup | Jason + Accountant | Month 2+ Post-Launch |
Key Assumptions Made in This Audit:
Biggest Uncertainties:
Stylify can launch after Meta approval (~March 5) IF AND ONLY IF the 7 blockers are resolved this week (by 2/28). The financial fundamentals are sound — the product has strong unit economics (96%+ margins), break-even is month 1, and payback is weeks 4-5. The constraint is not money; it's uncertainty about whether the billing system actually works.
This week's must-dos (2/24-2/28):
- Verify Stripe integration works end-to-end (account creation → trial → paid charge)
- Verify founding member pricing is correctly implemented and locked
- Verify trial-to-paid conversion happens automatically on day 15
- Implement annual billing (UI toggle + Stripe price IDs)
- Test the full signup → payment flow as a real user
- Document Stripe configuration (product/price IDs, webhooks, etc.)
- Enforce the 100 founding member cap in code
Pre-launch (by March 5):
- Upgrade Supabase to Pro ($25/mo) — target March 1
- Document refund policy exceptions in ToS
Once these are done, Stylify is ready to accept founding members. The post-launch tasks (dunning emails, cancellation flow, retention automation, referral program) can ship in Month 1 without blocking the launch.
Financial Upside: At 100 founding members, we're at $4,900/month recurring revenue + $1,200/month annual prepays = $6,100/month gross revenue in month 3. Operating costs are <$200/month. This is a highly profitable business from day 1.