One database per customer
Most software like this keeps every customer in the same tables and adds a column that says whose row is whose. Every query then has to remember to filter on it, and the one that forgets shows one agency another agency’s invoices.
Zetratech Studio does not have that column. When you sign up, a MySQL database is created for you, the schema is loaded into it, and every query your workspace runs is connected to that database and no other. Isolation is which database the connection points at, not a condition someone had to remember to write.
It also means your data is portable in the most literal sense: a copy of your database runs on the self-hosted version of the same code, without us.
One hostname, and a signed cookie that knows whose workspace
Every customer signs in at the same address. The session cookie is signed, and the workspace it belongs to is inside the signature — so a browser can delete its cookie, but cannot edit it into somebody else’s workspace.
Signing in with just an email works because a small directory in the control plane maps an email to its workspace. It holds that one fact and nothing else: names, roles and passwords live in each agency’s own database.
Numbers that are facts
An invoice is paid when the payments recorded against it add up to its total. Nobody ticks a box. The outstanding figure, the bookkeeping picture and the forecast all read from the same rows, so there is nothing to reconcile.
Invoice numbers run in one sequence per workspace that never restarts, and the next number is always the highest ever issued plus one. Deleting a draft cannot hand a client’s number to someone else.
Anywhere rupees and dollars are added together, the total is converted at a rate you set and labelled as converted. There is no unlabelled figure that quietly mixes the two.
Two prices, because two gateways
An Indian company cannot take a dollar mandate through Razorpay, and a foreign card cannot be mandated in rupees through PayPal. So there is a rupee plan and a dollar plan for the same product, and the country you choose at sign-up picks one. Monthly or yearly, on either.
What it does not do, on purpose
The outreach module records outreach; it does not send it. Automated cold email from hundreds of customers’ own mailboxes would put every one of their sending reputations, and ours, in the hands of the least careful sender.
There is no “log in as any customer” button for support. There is a grant: one workspace, one reason, one use, fifteen minutes, written to an audit log before the link exists — and you see a banner across every page while it is in use.
Nothing from Google runs on these pages unless we have turned it on, and it never runs inside a workspace. Visits are counted by us, without a cookie.
The stack
Next.js and React on the front, TypeScript throughout, MySQL underneath with direct parameterised queries and no ORM. Passwords are bcrypt hashes; the credential vault is encrypted at rest with a key that never leaves the server. PDFs are rendered on the server. The same codebase runs as one agency’s private install or as this hosted platform, decided by a single setting.
Who made it, and why it is priced the way it is, is on the about page. What it does, module by module, is under features.