Dharmendra Jagodana
Founder of BuildBase. Builds the platform and the six products that run on it.
101 posts · page 2 of 9
Should you run auth on your own domain?
A custom auth domain is close to a one-way door for passkeys, and a DNS record that becomes part of your login path. Here is how to decide, and how to move before anyone signs in.
How to create a default workspace on signup in Next.js, but not for invited users
Create a default workspace on signup in Next.js without giving invited users an empty one of their own, and decide when to ask for a name instead.
Idempotency in billing, and why it matters
Idempotency in billing means a retried charge, usage event, credit debit or webhook takes effect once. Having a key is the easy part. What the key names is where double billing starts.
Idempotency keys on the metering write path
How BuildBase keeps a retried usage record from counting twice: a key per hop, minted where its quantity stops changing, and the one hop where our check still runs early.
Metered vs seat-based billing: charge for people or for work
Seat-based billing charges per person with access; metered billing charges per unit of work. Pick by what grows when a customer gets more value.
How to add per-org data isolation in Next.js
Per-org data isolation in Next.js: check membership once per request, make the data layer demand that proof, and never fetch a record by its ID alone.
How to add roles and permissions per workspace in Next.js
Per-workspace roles in Next.js: hide controls with WhenPermission, check every server action with bb.workspace.can(), and know which side lags after a role change.
How to add social login in Next.js
Google, GitHub, Microsoft and LinkedIn sign-in with no OAuth routes to write. What is left is a decision: what one person becomes when they arrive through two providers.
Stale data on screen after a workspace switch
Stale data after a workspace switch is a cache that never learned the workspace changed. One switch with the Network tab open tells you which cache. The fix is a key, not a purge.
How to add team invitations in Next.js, and decide when the seat starts billing
Team invitations in Next.js: a pending invite holds a seat from the moment it is sent. Why that is the right default, and what it does to the invoice at renewal.
Transactional email landing in spam
Transactional email in spam is a verdict the receiving server already wrote into the header. How to read it, and five causes to check in the order that settles fastest.
Usage counts that do not match the invoice
Usage does not match the invoice? The invoice bills overage blocks for a period that already closed. How to reconcile the two, fastest check first.