Arnold Schwarzenegger has a newsletter.
Yeah. That Arnold Schwarzenegger.
So do Codie Sanchez, Scott Galloway, Colin & Samir, Shaan Puri, and Jay Shetty. And none of them are doing it for fun. They're doing it because a list you own compounds in ways that social media never will.
beehiiv is where they built it. You can start yours for 30% off your first 3 months with code PLATFORM30. Start building today.
⚙️ THE WORKFLOW
Manual invoice tracking is where solo operators lose time and credibility simultaneously. You forget to follow up on an overdue invoice, the client forgets they owe you money, and an awkward conversation costs you a relationship. Or you're reconciling payments at the end of the month and realise you missed logging three transactions.
This workflow eliminates that. Every Stripe event — payment succeeded, payment failed, invoice created, refund issued — fires a webhook to n8n, which logs it to Baserow, calculates running MRR, and pings Slack on anything that needs attention.
The node chain:
| Node | What it does |
|------|-------------|
| Webhook | Receives all Stripe events |
| Switch | Routes by event type (payment_intent.succeeded, invoice.payment_failed, etc.) |
| Set — Payment | Extracts amount, customer, description, date |
| Baserow — Create Row | Logs transaction to Payments table |
| AI Node | Categorises payment description (services, products, refunds) |
| If — Overdue | Checks if invoice is >7 days past due |
| Slack — Alert | Posts to #finance for failures or overdue events |
| HTTP Request | Updates MRR field in Baserow Stats table |
Step by step:
1. Stripe webhook setup
In Stripe Dashboard → Developers → Webhooks → Add endpoint. Point to your n8n webhook URL. Select events: payment_intent.succeeded, payment_intent.payment_failed, invoice.payment_failed, invoice.paid, refund.created. One endpoint handles all of them.
2. Switch node routing
Route on event.type. You'll have four active branches: succeeded, failed, refunded, and a catch-all that logs the raw event and exits.
3. Extract and normalise
The succeeded branch: extract amount_received (divide by 100 — Stripe sends cents), customer.email, description, created (Unix timestamp, convert to ISO date). The failed branch: also extract failure_message — this goes into the Slack alert.
4. Baserow logging
One row per event. Fields: Date, Amount, Customer Email, Event Type, Description, Category, Status. The Category field is AI-populated.
5. AI categorisation
Pass the description field to Gemini Flash with a simple prompt: "Categorise this payment description into one of: services, retainer, product, refund, other. Respond with one word." This makes your financial reports actually readable.
6. Overdue invoice check
Run a daily cron (separate workflow) that queries Baserow for invoices with Status = "pending" and Date < today - 7 days. Each match triggers a Slack alert and an automated follow-up email template ready to review and send.
7. MRR calculation
After each succeeded payment, fetch all retainer payments from the last 30 days from Baserow and sum them. Write the result to a Stats table. Your Baserow MRR figure is always current.
Time saved: 3–4 hours/month of manual reconciliation, plus the occasional recovered overdue payment worth 10× that.
🔧 THE STACK MOVE
Stripe — still the only real choice for indie payment infrastructure
I've tried Paddle, Lemon Squeezy, and a brief stint with PayPal before I came to my senses. Stripe is the only one with an API that doesn't make you want to throw your laptop.
Price: 1.5% + €0.25 per transaction in Europe (Stripe Payments). No monthly fee. The 1.5% stings on smaller transactions — a €250 audit invoice costs €4 in fees. On a €2,000 retainer it's negligible. Factor it into your pricing from day one rather than treating it as a surprise.
The honest tradeoff: Stripe's dispute process is heavily weighted toward buyers, not sellers. If you're doing B2B service work, a signed statement of work is not optional — it's your only meaningful protection against a chargeback. I've seen solo operators lose €3,000+ to fraudulent disputes on services that were clearly delivered. Stripe will not help you. Get everything in writing, have clients confirm receipt via email, and keep those records indefinitely.
The other genuine limitation: Stripe's invoicing UI is mediocre for anything beyond simple line items. For complex project breakdowns, generate your invoice as a PDF and attach it to the Stripe payment link manually.
📡 THE SIGNAL
Stripe's new payment element is actually good now — stripe.com/docs
The embedded payment element that used to look like it was designed in 2015 got a proper redesign. It now handles SEPA Direct Debit, Bancontact, and iDEAL without custom styling. For European indie operators, this removes the last reason to consider Paddle.
Chargeback fraud is rising for digital services — chargebackgurus.com
The stat that should scare you: 60% of chargebacks on digital services are now first-party fraud (the customer disputes a legitimate charge). The mitigation is boring but it works — email confirmation of delivery, signed SOW, and Stripe Radar rules. None of this is automated out of the box. Build it yourself.
MRR tracking for solopreneurs — indiehackers.com
The debate about whether to count one-time project fees in MRR will never die. My position: track them separately. Mixed MRR is a lie you tell yourself when retainer revenue is low. Keep the numbers honest.
Subscribe to Pro Reader Business Insights
A subscription gives you access to hand-on guides and use cases around AI tools that save you time from endless manual searching and scrolling around other media.
Upgrade![Theo [Founder]](https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,quality=80,format=auto,onerror=redirect/uploads/user/profile_picture/05538803-f858-4c87-aeb1-e1c6ca95e8e2/Photo_on_13-3-25_at_12.33__2.jpeg)



