I want to be upfront: the "45 minutes" doesn't include the three hours I spent the night before trying to do the same thing with separate API accounts and giving up because I couldn't get OAuth to work with my Cloudflare Workers setup.
The 45-minute version happened the next morning after I said "screw it" and tried doing everything through one gateway. It worked. I was annoyed it was that easy, because it meant the previous night was wasted.
Here's the actual build.
What I made
InvoiceBot — a dead-simple SaaS:
- Sign up with Google
- Type a description like "3 pages of web design at $500 each"
- AI generates a professional invoice
- Send it to your client via email
- Pro plan for $9/month via Stripe
Not going to win any awards. But it has auth, payments, a database, AI generation, and email delivery. That's a real SaaS, not a landing page.
The stack
- Claude Code (my coding agent)
- SkillBoss (everything backend: AI, database, auth, email, payments, hosting)
That's it. No AWS. No Vercel. No Firebase. No SendGrid account.
The parts that went fast
Installing the skill: 30 seconds. curl -fsSL https://skillboss.co/install.sh | bash. Done.
Generating the frontend: About 5 minutes. I told Claude Code what I wanted and it spit out React + Tailwind. The first version looked like a to-do app tutorial — generic cards, default blue, you know the type. I asked it to make it "less template-y" twice before I got something I wouldn't be embarrassed to show someone.
The AI invoice generation: This was the easy part. One API call:
async function generateInvoice(description) {
const response = await fetch('https://api.heybossai.com/v1/chat/completions', {
method: 'POST',
headers: {
'Authorization': `Bearer ${SKILLBOSS_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
model: 'openai/gpt-4o',
messages: [{
role: 'system',
content: 'Generate a professional HTML invoice. Include line items, subtotals, tax line, total, due date, and clean formatting. Use a neutral business style.'
}, {
role: 'user',
content: description
}]
})
});
return response.json();
}
GPT-4o is actually decent at generating structured HTML invoices. About 4 out of 5 times the output was usable without editing. The fifth time it would do something weird with the tax calculation or forget the due date.
Email delivery: Two minutes. One fetch call, no SMTP configuration, no domain verification dance.
Deploy: node ./scripts/serve-build.js publish-worker ./dist --name invoicebot. Three minutes, including the time it took to remember the command.
The parts that were annoying
Stripe integration: This took the longest — about 15 minutes, which doesn't sound bad until you realize it was mostly waiting. Connect Stripe account (browser flow), wait for webhook verification, debug a CORS issue that turned out to be a typo in my redirect URL. Standard Stripe stuff, not a SkillBoss problem.
OAuth: Claude Code generated the OAuth flow on the first try but used a deprecated Google endpoint. I caught it because the redirect gave me a 400. Fixed in about 5 minutes once I figured out what was wrong. This is the vibe coding trap — the code looks right, and the error isn't obvious until runtime.
The database schema: Claude generated a perfectly functional schema, but it used TEXT for the primary key IDs instead of UUIDs, and didn't add an index on user_id in the invoices table. I noticed because I was actually reading the generated SQL. Most people wouldn't, and it would be fine at small scale but not great later.
Time breakdown (honest version)
| Step | Time | Notes |
|---|---|---|
| Install skill | 0.5 min | The one easy part |
| Generate frontend | 5 min | Two iterations on design |
| Database setup | 3 min | Including fixing the schema |
| Invoice AI feature | 3 min | Worked first try |
| Email integration | 2 min | Shockingly easy |
| Stripe payments | 15 min | Mostly waiting + one typo |
| Deploy | 3 min | |
| Testing + bug fixes | 12 min | OAuth redirect, CSS tweaks |
| Total | ~44 min |
Cost
SkillBoss credits used: $0.47
The biggest expense was the AI generation calls during testing. I made maybe 20 test invoices while debugging the prompt. Database, hosting, and email were basically free at this volume.
What I'd do differently
Actually test the generated code more carefully. The OAuth thing could've been a real problem if I'd shipped it without testing. Vibe coding is fast, but "fast to write" and "correct" are different things.
Not try to do it with separate APIs first. The three hours I wasted the night before were entirely unnecessary. I was stubbornly trying to configure each service individually because that's what I was used to.
Add better error handling. Claude Code generated zero error handling in the invoice generation function. If the API returns an error, the UI just shows a blank page. I added a try/catch after the fact, but a production app would need way more than that.
The honest takeaway
Building a SaaS in 45 minutes is cool but it's also kind of misleading. What I built works. It's deployed. You can use it. But "works" and "ready for real users" are separated by probably another 20-40 hours of: proper error handling, input validation, rate limiting, actual invoice PDF export (mine are HTML), mobile responsive testing, email deliverability setup, privacy policy, terms of service...
The value isn't "skip all the hard parts." It's "skip the boring parts so you can find out faster whether the idea is worth the hard parts."
For InvoiceBot specifically? Probably not. There are 500 invoice generators already. But I learned the workflow, and the next idea I test will also take 45 minutes instead of a weekend.
If you've built something with this kind of speed — what did the gap between "it works" and "it's ready" look like? I keep underestimating that gap.
Top comments (0)