Originally published at chudi.dev
"I want to build something that converts bank statements to spreadsheets."
Seven days later, StatementSync was live. Users could sign up, upload PDFs, and download Excel files. Stripe was processing payments.
Here's exactly how that happened.
The Starting Point
Input: A problem statement.
"Freelance bookkeepers spend 10+ hours per week manually transcribing PDF bank statements into spreadsheets. Existing tools either charge per file ($0.25-1.00 each) or require proprietary software integrations."
That's it. No spec document. No wireframes. No architecture plan.
MicroSaaSBot takes it from here.
Phase 1: Validation (Day 1-2)
The Researcher agent investigates whether this is worth building.
Day 1: Market Research
Activities:
- Web search for existing solutions
- Competitor pricing analysis
- User pain point research (forums, Reddit, reviews)
- Market size estimation
Findings:
- TextSoap: $0.50/file, professional but expensive
- HappyFox: $0.25/file, complex setup
- Zapier connectors: $1.00/file, requires technical setup
- Manual OCR tools: Free but 60-80% accuracy
Day 2: Scoring and Persona
Validation Score: 78/100
- Severity: 24/30 (daily pain, hours wasted)
- Frequency: 16/20 (constant for active bookkeepers)
- Willingness to Pay: 22/30 (already paying competitors)
- Competition: 16/20 (clear differentiation opportunity)
Persona:
Freelance bookkeepers processing 50+ bank statements monthly for multiple clients. Tech-comfortable but not developers. Currently using per-file tools or manual transcription.
Differentiation Path:
Flat-rate pricing ($19/month unlimited) vs per-file competitors. Simple drag-drop interface vs complex workflows.
Score: 78 > 60. Proceed to Architecture.
Validation Handoff Document
problem: Bank statement transcription for bookkeepers
score: 78
recommendation: proceed
persona:
who: Freelance bookkeepers
behavior: 50+ statements/month
pain: 10+ hours/week manual work
current_spend: $25-100/month
differentiation:
primary: Flat-rate pricing
secondary: Simple UX, high accuracy
constraints:
- Must achieve near-zero marginal cost
- Must support top 5 US banks
- Must be simpler than competitors
Phase 2: Architecture (Day 3)
The Architect agent designs the technical system.
Tech Stack Selection
Based on constraints and differentiation:
| Component | Choice | Reasoning |
|---|---|---|
| Framework | Next.js 15 | App Router, serverless-ready |
| Auth | Clerk | Handles OAuth, fast setup |
| Database | Supabase | PostgreSQL + Storage + RLS |
| Payments | Stripe | Industry standard |
| PDF Parsing | unpdf | Serverless-compatible |
| Hosting | Vercel | Serverless, auto-scaling |
Database Schema
-- Users (synced from Clerk)
CREATE TABLE users (
id UUID PRIMARY KEY,
clerk_id TEXT UNIQUE,
email TEXT,
subscription_tier ENUM('FREE', 'PRO'),
conversions_this_month INT DEFAULT 0,
created_at TIMESTAMP DEFAULT NOW()
);
-- Conversions (processed statements)
CREATE TABLE conversions (
id UUID PRIMARY KEY,
user_id UUID REFERENCES users(id),
original_filename TEXT,
status ENUM('PENDING', 'PROCESSING', 'COMPLETED', 'FAILED'),
extracted_data JSONB,
excel_path TEXT,
csv_path TEXT,
created_at TIMESTAMP DEFAULT NOW()
);
Key Decisions Surfaced
Decision 1: Pattern-based vs LLM extraction?
- Pattern-based: $0/extraction, 99% accuracy, 3-5 seconds
- LLM: $0.01-0.05/extraction, 99.5% accuracy, 10-30 seconds
Human approved: Pattern-based (cost control for flat-rate model)
Decision 2: Flat-rate vs per-file pricing?
- Flat-rate: $19/month unlimited, attracts heavy users
- Per-file: $0.25-0.50/file, matches competitors
Human approved: Flat-rate (differentiation strategy). The full case for flat-rate over per-file pricing is in flat-rate vs per-file SaaS pricing.
Tech stack defined, schema complete, key decisions approved. Proceed to Development.
Architecture Handoff Document
tech_stack:
frontend: Next.js 15 (App Router)
auth: Clerk
database: Supabase PostgreSQL
storage: Supabase Storage
payments: Stripe
pdf: unpdf
hosting: Vercel
features:
- user_auth
- file_upload
- pdf_extraction
- excel_export
- csv_export
- stripe_billing
- usage_tracking
- conversion_history
pricing:
free_tier:
conversions: 3
batch_size: 1
history_days: 7
pro_tier:
price: 19
conversions: unlimited
batch_size: 20
history_days: 90
Phase 3: Development (Day 4-6)
The Developer agent builds features incrementally.
Day 4: Core Infrastructure
Features built:
- Project setup (Next.js, TypeScript, Tailwind)
- Clerk authentication integration
- Supabase connection and schema migration
- Basic dashboard layout
Checkpoint: User can sign up, sign in, see empty dashboard.
Day 5: PDF Processing
Features built:
- File upload component (drag-drop, validation)
- PDF parsing engine (unpdf integration)
- Transaction extraction (pattern-based)
- Bank detection (Chase, BofA, Wells, Citi, Capital One)
Checkpoint: User can upload PDF, see extracted transactions.
pdf-parse failed on Vercel serverless. Native dependency issue. Switched to unpdf—2 hour debugging, then back on track. The full technical story is in serverless PDF processing: unpdf vs pdf-parse.
Day 6: Export and Billing
Features built:
- Excel export (ExcelJS with formatting)
- CSV export
- Stripe integration (products, prices, checkout)
- Webhook handler (subscription status)
- Usage tracking (conversions per month)
- Tier enforcement (free vs pro limits)
Checkpoint: Full flow works—upload, extract, export, pay.
Build passes. Types compile. Core flow functional. Proceed to Deployment.
Development Handoff Document
build_status: passing
type_check: clean
features_complete:
- auth_flow: true
- file_upload: true
- pdf_extraction: true
- excel_export: true
- csv_export: true
- stripe_billing: true
- usage_tracking: true
env_vars_needed:
- NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY
- CLERK_SECRET_KEY
- DATABASE_URL
- SUPABASE_URL
- SUPABASE_ANON_KEY
- STRIPE_SECRET_KEY
- STRIPE_WEBHOOK_SECRET
Phase 4: Deployment (Day 7)
The Deployer agent ships to production.
Morning: Infrastructure Setup
Activities:
- Create Vercel project
- Connect GitHub repository
- Create Supabase production project
- Run database migrations
- Configure environment variables
Afternoon: Billing Configuration
Activities:
- Create Stripe product ("StatementSync Pro")
- Create Stripe price ($19/month)
- Configure Stripe webhook endpoint
- Test subscription flow
Evening: Final Verification
Checklist:
- [ ] Home page loads
- [ ] Sign up flow works
- [ ] Sign in flow works
- [ ] File upload accepts PDFs
- [ ] Extraction completes
- [ ] Excel download works
- [ ] CSV download works
- [ ] Free tier limits enforced
- [ ] Checkout redirects to Stripe
- [ ] Subscription activates on success
- [ ] Webhook updates user tier
All checks passed.
Live URL accessible. Auth works. Payments work. Deployment complete.
The Result
Day 7, 8:00 PM: StatementSync is live.
https://statement-sync-gamma.vercel.app
- User auth working
- PDF processing functional
- Stripe billing active
- Free and Pro tiers enforced
From "bookkeepers hate transcription" to production SaaS in exactly 7 days.
The Timeline Summary
| Day | Phase | Agent | Output |
|---|---|---|---|
| 1 | Validation | Researcher | Market research |
| 2 | Validation | Researcher | 78/100 score, approved |
| 3 | Architecture | Architect | Tech stack, schema |
| 4 | Development | Developer | Core infrastructure |
| 5 | Development | Developer | PDF processing |
| 6 | Development | Developer | Export + billing |
| 7 | Deployment | Deployer | Live production URL |
What Each Phase Gets Wrong When Done Manually
Understanding the failure modes in traditional MVP development shows why the phase-gated approach matters.
Validation done manually usually collapses into confirmation bias. You search for evidence that your idea is good, find a few Reddit threads that validate it, and declare the problem validated. You miss the competitor that solved it six months ago, the forum where your target persona says the problem isn't as painful as you thought, and the pricing research that would have revealed your target users already have a $10/month tool they love.
MicroSaaSBot's Researcher agent is adversarial by design. It explicitly searches for reasons the idea won't work: "Find competitors," "find criticism of similar products," "find examples where users chose not to solve this problem." The 78/100 score for StatementSync came after that adversarial process, not before it.
Architecture done manually usually results in technology choices made from familiarity, not fitness. Developers reach for the stack they know best rather than the stack that fits the constraints. The key decision in StatementSync—pattern-based extraction instead of LLM extraction—was surfaced by the Architect agent precisely because it analyzed the pricing model requirement first. Manual architecture rarely starts from business constraints.
Development done manually often suffers from premature optimization. You spend Day 4 perfecting the auth flow instead of getting to the core feature. The Developer agent works against a fixed feature list with explicit priorities: auth first, core feature second, nice-to-haves last. No scope creep. No gold-plating.
Deployment done manually is where most MVPs go to die. Environment variables don't match. Database migrations fail in production. Stripe webhooks weren't tested with actual subscription events. The Deployer agent runs a pre-flight checklist—every environment variable verified, migrations smoke-tested, webhook delivery confirmed before declaring deployment complete.
What Made This Possible
- Validation first - Didn't waste time on a bad idea
- Clear handoffs - Each phase knew exactly what to do
- Incremental checkpoints - Caught the pdf-parse issue on Day 5
- Focused scope - MVP only, no feature creep
- Human gates - Key decisions were approved, not assumed
MicroSaaSBot didn't replace thinking. It replaced the tedious execution that turns weeks into days. The 7-day timeline is reproducible—not because the system is magic, but because validation gates kill bad ideas before they consume weeks of effort, and checkpoints between phases prevent bad architecture decisions from compounding into bad code.
Related: Introducing MicroSaaSBot | Portfolio: StatementSync
Top comments (0)