Blog
Field notes from keeping CRMs, billing and ledgers in step — the joins nobody maintains, the vendor changes we absorb, and the decisions worth settling first.
The seven joins between HubSpot, Stripe and QuickBooks that nobody maintains
Each of these three systems links its own objects natively. None of them links to the other two. Here are the seven joins you own, and what breaks at each one.
Read it →Why you have duplicate customers in QuickBooks
Almost always one of three causes: matching on the wrong email, an automation that creates before it searches, or two writers with no agreed key. How to tell which one you have.
Read it →Idempotency is not optional when money moves
A retried webhook that creates a second invoice isn't an edge case, it's a Tuesday. What an idempotency key actually has to cover, and why request-level keys alone don't save you.
Read it →When the CRM and the ledger disagree, who wins?
Five conflicts worth settling before you connect anything. Each one is a business decision disguised as a field mapping.
Read it →Run it in shadow mode first
Computing every write and showing it to you without making it sounds cautious. It's actually the fastest way to find out your rules disagree with your data.
Read it →Stripe deprecated quantity on invoice items. Here's what it breaks downstream.
quantity_decimal arrived with the 2026-03-25 API version and quantity is now deprecated. If you post invoices to a ledger, this is the kind of change that silently rounds your revenue.
Read it →Field notes on the QuickBooks Online API
Sparse updates, sync tokens, DisplayName uniqueness, and why posting an invoice is harder than the docs make it look.
Read it →Zapier, Make, or something that owns the whole chain?
An honest comparison for CRM → billing → ledger. Where automation builders are the right answer, and where they structurally can't be.
Read it →