Most practice software ships three or four fixed roles and hopes your organization happens to match one of them. Real practices never do. You have a therapist who also runs intakes, an office manager who raises invoices but must never open a chart, a supervisor who oversees two clinicians and nobody else, and a contract auditor who needs the activity history for a week and nothing else ever again. When the software cannot express that, practices do the dangerous thing: they share a login, or they give someone administrator rights “temporarily” and forget.
ASL Therapy separates the two questions that most systems collapse into one. What is this person’s job? And what, specifically, are they allowed to do? Answering them separately is what lets the permission model bend to your practice instead of the other way around.
Layer one
The base role
Ten roles covering how therapy practices are actually staffed: practice owner, therapist, intake therapist, scheduler, billing, accountant, admin assistant, security, auditor and platform administrator. The role sets the sensible default.
Layer two
Per-person capabilities
Intake, discharge, clinical supervision, invoicing, billing administration and record export are granted to individuals, independently of their title. Two therapists can differ on every line.
Layer three
Per-client visibility
Each client record is visible to the whole practice, only assigned clinicians, supervisors, or practice owners alone. The narrowest applicable rule wins.
Deny by default, and an explicit denial always wins. A role that is not recognised receives the narrowest possible access rather than the widest — the opposite of the common failure where an unmapped role silently inherits administrator rights. If a practice owner explicitly denies someone a capability, no job title, no supervision relationship and no later role change quietly restores it. That single rule prevents the most common way permission systems rot: exceptions granted in a hurry that nobody remembers to revoke.
Every rule is enforced on the server, on every request. This is the difference between a permission system and a cosmetic one. Hiding a menu item is not access control; it stops an honest person and nobody else. In this system the navigation reflects your permissions, but the navigation is not what protects the record. A client outside your visibility cannot be opened even by someone holding a direct link to it, and the same check runs again on every note, report, document, invoice and export attached to that client. We audited exactly this in August 2026, found a handful of routes that trusted the identifier without re-checking visibility, and fixed all of them before launch — that audit and its findings are documented publicly in the product repository.
Supervision is a relationship, not a rank. A supervisor sees the work of the specific people they supervise. By default they can also see the whole practice, because that is what most group practices expect on day one — and an organization administrator can switch that off with a single control, narrowing every supervisor to their own clients plus their supervisees’. Clients marked owner-only stay owner-only either way, so a sensitive record does not become visible to a dozen people because someone was promoted.
Changes are evidence, not just settings. Granting a capability, denying one, changing someone’s role, disabling an account and relaxing the report-approval rule are all written to the tamper-evident activity history with who did it and when. Access reviews stop being an archaeology project: the answer to “who could see this, and since when” is already recorded. The system also refuses to leave a practice without an owner and will not let the last administrator disable themselves.