| .. | ||
| app | ||
| deployment | ||
| lib | ||
| public | ||
| .gitignore | ||
| copy_of_env_local | ||
| eslint.config.mjs | ||
| middleware.ts | ||
| next.config.ts | ||
| package-lock.json | ||
| package.json | ||
| postcss.config.js | ||
| README.md | ||
| run_local.sh | ||
| stripe_webhook.sh | ||
| stripe_webhook_payment.sh | ||
| tailwind.config.ts | ||
| tsconfig.json | ||
Got you — here’s a clean, founder-brain-friendly summary of Stripe → Invoice (Stripe → Xero) based on everything you’ve been working through, plus tight next steps that fit your nights/weekends reality.
🧾 What Stripe → Invoice Is (current state)
-
Problem you’re solving
- UK VAT-registered small businesses using Stripe struggle with audit-safe, VAT-correct invoices in Xero
- Existing tools are overbuilt, accountant-first, or break down on VAT, clearing accounts, or reconciliation
- This is fundamentally a VAT + audit correctness problem, not just “sync data”
-
Who it’s for
- UK solo founders / one-person companies / tiny teams
- Using Stripe only (Payment Links + Subscriptions)
- Using Xero
- Not accountants, not agencies, not complex multi-channel setups
-
What the MVP does today
-
Stripe OAuth + Xero OAuth both working
-
Webhooks flow end-to-end (validated against real finance manager)
-
Automatically:
- Creates clean Xero invoices from Stripe payments
- Applies VAT correctly
- Posts payments via a Stripe Clearing account
-
Validated by a finance manager → very happy (huge signal)
-
-
Key MVP constraints (intentional)
-
UK + GBP only
-
Stripe Payment Links + Subscriptions only
-
Xero contacts matched/created by email only
-
Willing to:
- Run one-off scripts
- Do manual fixes early
-
Goal: first ~5 paying customers, not scale yet
-
✅ Recently fixed
- Xero contact creation — Now checks for existing contacts by email first, reuses if found, only creates if missing
- Stripe OAuth app reuse — Added unique constraints on
userIdandstripeAccountIdto prevent duplicate connections - Smart redirect flow — Users are automatically routed based on connection state:
- Both connected →
/dashboard - Only Stripe →
/connect/xero - No connections →
/connect/stripe
- Both connected →
- Connection visibility — Dashboard now displays connected Stripe account ID and Xero tenant ID
Frontend Improvements Details
Smart Onboarding Flow
- Automatic routing based on connection state
- Users never see unnecessary steps
- Seamless progression: Login → Stripe → Xero → Dashboard
Dashboard Enhancements
- Connected account visibility (Stripe account ID + Xero tenant)
- Account code configuration (sales + clearing accounts)
- Real-time save confirmation
- Clean, minimal UI
Development Experience
- Development mode fallback for webhook testing
- Comprehensive logging at each webhook stage
- Environment-aware configuration
⚠️ Known issues & TODO
-
CRITICAL: Stripe payment integration
- Need to implement Stripe Billing API to accept payments
- Currently not accepting any money from users (test mode only)
- Must add subscription checkout flow before going live
- Reference: Stripe Billing API docs
-
Missing UX guardrails:
- No clear pre-payment checklist before enabling sync
🧪 Current mode you’re in (important)
-
You’re correctly running this in “design partner / friend test” mode
- Payments disabled
- Banner: “Internal test – not a commercial product”
- Clear paper trail of non-commercial intent
-
CFO + finance manager already acting as design partners
-
This massively de-risks VAT/audit assumptions before charging anyone
✅ What you should do next (ordered, ruthless, realistic)
1️⃣ Finish the last correctness blockers (highest ROI)
These unlock charging real money.
-
Fix Xero contact creation✅ DONECheck by email → reuse if exists → only create if missing
-
Fix Stripe OAuth app reuse (stop creating new apps)✅ DONE -
Re-enable "mark invoice as paid" via Stripe Clearing once accounts are valid✅ DONE
Outcome: rock-solid, boring, accountant-approved flow
2️⃣ Add a tiny pre-flight checklist UI (not a full settings page)
-
Dashboard shows connected accounts✅ DONEStripe account ID displayedXero tenant ID displayed
-
Smart redirect flow based on connection state✅ DONE -
VAT status detection
-
Sales account code shown (editable)
-
Stripe clearing account shown (editable)
Even basic connection visibility prevents 80% of future support pain
3️⃣ Implement subscription billing (enables first paid customer)
- Integrate Stripe Billing for subscription management
- Add usage tracking (invoice count per month)
- Create pricing page and checkout flow
- Implement subscription status checks in webhook handler
- Remove "internal test" banner once billing is live
4️⃣ Switch from "design partner" → first paid customer mode
-
Pick one:
- A founder you already know OR
- A cold UK Stripe + Xero business with obvious VAT needs
-
Offer:
- £15/month Starter plan
- "Early access / founder pricing" (50% off for life)
- Manual support included
-
Goal is money changing hands, not scale
You've said it yourself: getting paid energises you — lean into that.
5️⃣ Do targeted cold outreach (low volume, high signal)
-
5–10 emails max, not a campaign
-
Target:
- UK SaaS / indie founders
- Stripe Payment Links or Subscriptions
- Clearly VAT-registered
-
Lead with:
- "I built this because my accountant hated existing tools"
- Emphasise audit-safe, VAT-correct invoices
- Not "automation", not "syncing"
6️⃣ Future UX polish + automation (after first paying customers)
-
Auto-detect or create Stripe Clearing account in Xero
-
Bulk historical invoice sync
-
Invoice preview before creation
-
Reduce manual fixes you find yourself repeating
-
Nothing else until:
- You have ~3–5 paying users
- And they're still using it after month 1
💳 SaaS Subscription Model (proposed)
Pricing Tiers
All Plans — £50/month
- Unlimited invoices/month
- Stripe Payment Links + Subscriptions support
- Full VAT handling and audit compliance
- Email support
- Perfect for: UK businesses using Stripe + Xero, any size
Future tiers (if needed):
- Starter — £30/month (up to 50 invoices)
- Professional — £50/month (up to 200 invoices)
- Business — £100/month (unlimited)
Implementation Notes
- Billing via Stripe Checkout (dogfooding our own product)
- Monthly recurring subscriptions with automatic renewal
- 14-day free trial — no credit card required
- Founder pricing lock-in — First 50 customers get lifetime 50% off
- Usage tracking — Invoice count displayed in dashboard, soft warnings at 80% of limit
- Graceful degradation — Over-limit users get notified but sync continues (no hard cutoff)
Revenue Model
-
Target: 100 paying customers in 6 months
- 60% Starter (£900/mo)
- 30% Professional (£1,050/mo)
- 10% Business (£750/mo)
- Total: ~£2,700/mo MRR
-
Conservative burn
- Hosting: £50/mo (Vercel + DB)
- Email: £10/mo (AWS SES)
- Support: Founder time only
- Net: ~£2,640/mo profit margin
Next Steps for Monetization
- Add Stripe Billing integration to the app
- Implement usage tracking in webhook handler
- Create pricing page on landing site
- Add subscription management in dashboard
- Enable payments and remove "internal test" banner
🧠 The big picture (sanity check)
- You’re not early anymore — you’re post-validation, pre-pricing
- The hard bit (VAT correctness + finance approval) is already done
- The remaining work is boring plumbing + selling
- This is exactly where most side projects die — don’t overbuild now
If you want, next we can:
- Draft the first cold email
- Write the “Why this exists” landing page copy
- Or map a 2-week nights/weekends execution plan
Just say the word.