Skip to content

Notes

What running our own product taught us.

Specific problems from a production system — the race condition, the timezone that made a report wrong, the payment integration the docs do not cover. Written up because almost nobody who solves these publishes the reasoning, and the reasoning is the part that cannot be looked up.

  1. AI automation for small business: what stays human

    The lead, email and content automations Easinvy runs for small businesses on n8n and code, and the points where a person still reviews, takes over or checks.

  2. The Next.js build id changes every build

    Two builds of one Next.js commit differed on all 36 pages, and only by the build id. Where Next writes it, and how easinvy.com's build hashes around it.

  3. Custom ERP vs off-the-shelf ERP, from one we run

    An incense maker's custom ERP, read from its code: cartons that mix fragrances, stock that cannot go below zero, and what Tally and Odoo already do.

  4. Multi-tenancy in Drizzle, from a shipped product

    Drizzle will not force a tenant filter. How a live app's 160 query functions scope by shop, and why row-level security would not have applied to it.

  5. UPI AutoPay integration, from a billing system

    UPI AutoPay from the merchant's side of a live billing system: RBI's ₹15,000 line, who sends the pre-debit notice, and the webhook behind every charge.

  6. CSP for a blob: iframe that prints a PDF

    Why printing a PDF from a hidden iframe needs blob: in frame-src, not a data: URL, what the frame inherits from your policy, and what Chrome's PDF viewer does.

  7. Content Security Policy for Razorpay Checkout

    The Content Security Policy a live billing app ships with Razorpay Checkout, line by line: why a wildcard, why unsafe-inline, and how to prove it is on.

  8. The shop's day is not the server's day

    A report grouped by the database's UTC day counts every bill before 05:30 IST against yesterday. The query that was wrong, and the query that is right.

  9. Decimal vs float for money, from a billing system

    Money is a string at rest, a float at the counter and an integer at the gateway. Three representations in one billing system, and what happens at the seams.

  10. How to revoke a JWT, from a system that does it

    The JWT spec defines no way to revoke a token. Here is the cut-off we run in production, the claim it has to compare against, and the rounding bug it had.

Stuck on a problem like these?

Tell us where it stalled. We usually reply within one working day.