I'm not a developer by background. I spent a decade as a plumber, then ran a crew-staffing company, then landed in logistics. Six months ago I started building software anyway — solo, nights and weekends, leaning hard on Claude to write the code I couldn't write myself. This is what that actually looked like, technically and otherwise.
The idea: one pattern, fourteen times
Instead of betting everything on one product, I built a portfolio: ReviewReply, HostAI, ContentBase, ProposalAI, JobPostAI, InvoiceChaser, and a few more — each a narrow AI tool solving one specific task for a specific small business owner (restaurant owners, Airbnb hosts, Etsy sellers, freelancers). Same underlying pattern every time:
- A free tier with a hard usage cap (no signup)
- A Pro subscription for unlimited use
- A one-time "Audit" report for people who want a deeper analysis emailed to them
Repeating one pattern 14 times meant every product got faster to ship. The tenth one took a fraction of the time the first one did, because the scaffolding — rate limiting, payment activation, email delivery — was already solved.
The stack
Every product runs on the same four pieces:
- Cloudflare Workers — API and business logic
- Cloudflare KV — rate limiting and Pro-token storage
- Cloudflare Pages — static frontend
- Brevo — transactional email (audit delivery, Pro activation confirmation)
Total infra cost per product on the free tier: close to zero. That matters when you don't know yet if a product will find any users at all.
The trick I'm most proud of: Stripe activation without webhooks
Every one of these tools needs to detect "this person just paid" and instantly unlock Pro features — without me running a server that listens for webhooks 24/7.
The solution: Stripe's checkout redirects back to yourapp.com/?session_id=cs_live_xxx after a successful payment. The frontend picks up that session ID and POSTs it to a /activate-pro endpoint on the Worker. The Worker validates the session ID format (it has to actually look like a real Stripe session, not just any string), stores a Pro token in KV, and emails a confirmation. No webhook infrastructure, no signature verification headaches, no missed events because a webhook silently failed. It's not the "textbook" way to do it, and I know the tradeoffs (a user could theoretically screenshot-share a session ID before it activates), but for a low-stakes $9-29 product, the simplicity is worth it.
Automating the boring parts
The part that actually ate the most engineering time wasn't the AI tools themselves — it was everything around them: finding potential customers, emailing them without getting flagged as spam, and not emailing the same person twice.
That turned into its own small system:
- Scraping public sources (Google Places, GitHub, Etsy) for relevant leads
- Validating every email through ZeroBounce before sending (our bounce rate went from 53% to under 5% once we started doing this properly)
- A dedup layer in KV — every sent email gets hashed and stored so nobody gets emailed twice across different campaigns
- A drip sequence that only sends email 2 if email 1 was actually opened, tracked via a 1x1 pixel and UTM-tagged links
None of this is novel. All of it is necessary, and none of the tutorials I found bundled it together in one place.
The honest part
Here's the part most "I built X in Y months" posts skip: as of today, across all 14 products and roughly 1,250 monthly visitors, I have exactly one paying customer — myself, testing my own checkout flow.
That's not a failure story, it's a data point, and it's a more interesting one than fake early traction would be. When I actually pulled the numbers apart this week, I found something specific: people are landing on the pages (real traffic, real sessions in GA4), but almost nobody is completing a single use of the actual tool. My own usage counters — not page views, actual "someone clicked generate" events — show 1-2 completions per product per day, against hundreds of sessions in the same window.
That's a different problem than "nobody wants this." It's closer to "something between the landing page and the first result is losing people," which is a much more solvable problem, and one I'm testing directly this week by running through every product myself as a brand-new user would.
What I'd tell someone starting this today
- Build the boring infrastructure once, reuse it everywhere. Rate limiting, payment activation, and email delivery are the same problem 14 times over — solve it once.
- Track actual usage, not just traffic. Page views told me a comforting story. Usage counters told me the true one.
- A portfolio spreads risk, but it also spreads attention. I'm still deciding whether 14 products was the right call or whether I should have gone deeper on fewer. Ask me again in a few months.
If you want to see the actual products: baseaitools.com. If you're building something similar and want to compare notes on the Cloudflare Workers + Stripe pattern, I'd genuinely like to hear from you.