Skip to content

Every action has a permission. Every change has a record.

157 distinct permissions assigned through roles, TOTP two-factor sign-in you switch on per account, and an audit trail that keeps the user, the IP, the device and the full before and after of every change.

157 permissions, grouped into roles you decide

Each permission covers one action in one part of the product — creating an invoice, applying a discount, deleting a bill. A role is a bundle of them, and most shops need only a few roles, decided once.

Roles are bundles, not presets
You name the roles — owner, manager, counter staff — and pick which of the 157 permissions each one carries. Permissions are easier to loosen later than to claw back, so start narrow; we configure the bundles with you during onboarding.
Owner holds every key by name
The owner role carries all 157 permission keys explicitly rather than an admin flag that waves every check through. That is the difference between a role you can trim and one you cannot: revoke a permission from the owner and it is actually revoked.
A new cashier starts switched off
The capabilities that cost money when they are misused — refunds, void, price override and ledger access — are off the day a cashier account is created, and the owner turns each one on deliberately. A further 9 capabilities are manager-only and cannot be granted to a cashier at all, however the roles are edited.
Enforced at the screen and at the API
Menus a role cannot use never appear, and the server checks the same permission again on every request. An endpoint that forgets to declare which permission it needs returns 403 rather than running — the check fails closed, so a missing rule blocks the action instead of allowing it.
One account per person
Staff sign in with their own accounts, so every invoice, discount, and correction attaches to a named person. That is what makes the audit trail worth reading.

Counter staff can bill. Only a manager can refund.

A role is a bundle of permissions, and a new cashier account starts with the expensive ones switched off. Here is what a typical three-role setup looks like.

PermissionOwnerManagerCounter staff
Create invoiceYesYesYes
Refund a billYesYes
Void a billYesYes
Price overrideYesYes
Ledger accessYesYes
Sample roles — 5 of 157 permissions shown.

“Who changed this price?” has an answer

Two separate records answer it. The audit trail covers what people did; balance reconciliation covers why a ledger figure moved.

The audit trail: before and after, side by side
Every request records the user, the IP address, the device, the HTTP method, how long it took, the entity it touched, and the full before and after of the row as JSON — not just that something changed, but from what to what, by whom, and when.
Sensitive fields are blanked before the log is written
31 field names — CNIC and NTN among them — are stripped out of the before-and-after payload on the way into the log, so reading the trail never means reading somebody's identity documents.
Balance corrections carry a root cause
Reconciliation is its own system. A correction records the before and after balance, who made it, how long it took, and one of 9 root causes. The last of those is “unknown” and it is what the entry defaults to — a correction nobody classified stays visibly unclassified rather than reading as explained.

Sign-in that survives a lost phone

Any account can turn on TOTP two-factor authentication, and sessions are managed from the owner seat — including the terminal somebody forgot to log out of.

TOTP two-factor, with no SMS bill
Six-digit codes come from an authenticator app and are verified in-process — there is no SMS gateway, so no per-message cost, and it keeps working in a back office where SMS does not arrive. 10 single-use backup codes cover the day the phone is lost or reset.
Guessing a password gets you locked out
5 failed sign-in attempts lock the account for 30 minutes. Nobody stands at the counter terminal working through likely passwords.
Idle sessions end themselves
Set a timeout and inactive accounts sign out on their own — the counter terminal left open at closing time is a logged-out screen by morning.
End any session remotely
See which accounts are signed in and end any session from the owner account — one at a time or all at once, for the day a phone goes missing or a staff member leaves.

Keys with scopes, webhooks with signatures

Polaris exposes a REST API and webhooks for integrations. Both are locked down by default: keys carry only the access you grant, and every webhook payload is signed.

Scoped, revocable API keys
Generate a key limited to read-only access or to specific features, rotate it on your schedule, and revoke it the moment it is no longer needed — without touching any other integration. Rate limits keep a runaway script from hammering the ledger.
HMAC-signed webhooks
Every webhook carries an HMAC signature — a cryptographic stamp the receiving system checks to verify the payload came from Polaris and was not altered on the way.
Cross-site request forgery, blocked
Forms carry CSRF tokens and requests from unexpected origins are rejected, so a malicious page open in another browser tab cannot act on behalf of a signed-in user.

Deletes are recoverable by default

Your ledger sits behind a wall the database itself enforces, deletion is a two-step affair, and balances are re-checked rather than assumed.

One tenant per business, walled off in the database
Row-level security is forced on every tenant table, so the separation holds in the data layer rather than depending on every query remembering to filter. Another shop on Polaris cannot reach your prices, your customers, or your ledger.
The wall is checked before the app is allowed to start
A deploy-time check verifies that the database role Polaris connects with cannot bypass row-level security. If it could, the boot fails — production will not start with that wall down.
Deleting is reversible; destroying is deliberate
Deleting a bill marks it deleted rather than erasing it, so it can be restored later. Removing it permanently is a separate step behind its own permission, and sensitive actions ask for your password again before they run.
The ledger is checked, not assumed
An integrity check recomputes what each account should hold and reports any that has drifted, instead of trusting the running total. Anything it turns up goes through reconciliation, which records the before and after balance, who corrected it, and the root cause they picked.

The 157 permissions are already modelled. Add your staff.

Roles and the audit trail run from the first login, and two-factor sign-in is a switch away with 10 backup codes behind it.

14 days free, no card.