Security

You are about to trust us with your invoicing, your guests' details and your clients' addresses. This page says what is done and, at the end, what is missing — because the second list tells you more about us than the first.

15
Things we prove
01
Things missing

Isolation

The boundary is the database, not a condition in the code.

Most platforms put every client in the same tables and separate them with a column. One query written in a hurry, missing the filter, and one client sees another's data. Here that query has nothing to find.

The usual way

WHERE tenant_id = ?

Every client in the same tables. The separation is a filter someone has to remember to write, on every query, forever. Forgetting once is enough.

Here

USE ajja_tenant_…

Each client in their own database. The query missing its filter still returns only what is yours, because the connection was pointed at your side before the query existed.

ajja_tenant_<slug>

One database per client
It is called ajja_tenant_<your-name> and holds only your 140 tables. The connection is switched on every request to the one that belongs to you.

DROP DATABASE

Deleted means deleted
When a client leaves, their database is dropped whole. No record sits around flagged as deleted, waiting for someone to notice.

who you are · what you pay for · which modules

The central database knows the minimum
It holds who you are, what you subscribe to and which modules you have. The day-to-day work never passes through it.

Accounts and access

Who gets in, how, and how far.

Every one of these checks runs on the server. None of them depends on what the browser decides to show or hide.

  1. 01 TOTP · 8 codes · encrypted secret

    Two steps, if you want them

    Two-factor authentication with the app you already use. The secret only takes effect once you confirm a code generated from it, so nobody gets locked out by a misread QR. You get 8 recovery codes, and both they and the secret are encrypted in the database.

  2. 02 5 minutes

    The second step has a deadline

    Between the right password and the code on your phone sits a temporary ticket that lasts five minutes. After that you start over — no half-finished login is left waiting.

  3. 03 login 5/min · 2FA 10/min · signup 3/hour · API 120/min

    Attempts are capped

    The login is capped by email and by address at the same time: five attempts a minute for the same pair, twenty a minute for the same address. Counting the email alone would let a stranger lock you out of your own account by failing on purpose. Two-factor, signup and the public check-in and booking forms are capped too. The authenticated API is limited to 120 requests a minute per user, not per address — two colleagues in one office do not share each other's budget.

  4. 04 module + role · 403

    Permissions checked on the server

    Hiding a menu item is not security. Every address passes two separate checks — the module is active for this client, and your role can see that module — and answers 403 even to someone typing the address by hand.

  5. 05 404, not 403

    A token only works in its own house

    A valid token aimed at another client's name reads nothing. And the answer is 404, not 403: someone guessing client names doesn't get to learn which ones exist.

  6. 06 one resource per link

    Portals without accounts

    Guests and owners come in through a link with its own key, which opens one thing and can carry an expiry date. There is no account to steal from them and no password to reuse somewhere else.

One request, start to finish

Seven questions before anyone sees a line of yours.

This is what happens between you pressing a button and the result appearing. The order is fixed at application boot, not left to how each route happened to be written — because a check that runs too late has already let the request start working.

  1. 01 404

    Whose house is this?

    The custom domain, the subdomain or the request header says which client it belongs to. Unknown name, it ends here.

  2. 02 402

    Is the subscription active?

    A suspended workspace is not served, not even for reading.

  3. 03 →

    Point the connection

    The database connection is switched to that client's own. Everything after this, mistakes included, can only reach this side.

  4. 04 401

    Who is asking?

    The token is verified. Without a valid one there is no step five.

  5. 05 429

    How many requests so far?

    120 a minute, counted per user. Above that the server says enough.

  6. 06 404

    Do you belong to this client?

    The token's user and the request's client have to be the same. This is the join that stops a legitimate token from reading the house next door.

  7. 07 403

    Can you see this module?

    The module has to be active for the client and visible to your role. Two checks, not one.

Only after those seven do the numbers in the address turn into records — and always out of the database step three picked.

What gets recorded

Who did what, us included.

A system that records nothing forces you to take our word for it. We would rather you could check.

The data is yours

The way out is open and signposted.

A platform that makes leaving hard is admitting it can't hold you any other way.

one request, one file

Full export
One request returns everything of yours, from the central database and from your own, stamped with when it was taken. Your team's passwords stay out of it, as they should.

no penalty

No exit fee
Cancel whenever you like. What you exported is yours and opens in any tool — it is not a format of ours that only we can read.

What comes out

  • Clients
  • Projects
  • Invoices
  • Appointments
  • Galleries
  • Photos
  • Reservations
  • Service orders
  • Items
  • Routes
  • Documents
  • Proposals
  • Team
  • Subscription
  • Support tickets

What we don't have yet

The short list, before you find it yourself.

None of this is promised or contracted. It is here so you know what you are buying today.

Questions this page didn't answer?

If you are about to trust us with other people's data, you are owed concrete answers before you sign. Create an account and ask, or ask first.

14 days free, with your card checked without a charge. Cancel before the 15th day after you subscribe and you pay nothing.