Platform · Support
Who Gets In and Why
Every unit at every facility carries an answer to one question: should this tenant's phone open this lock right now? This playbook explains how KISS answers it, in plain language: the facts we collect, the rules each facility sets, the five states a unit can be in, and the reason codes that tell support exactly why someone is locked out.
One engine decides everything
A storage facility runs on property management software (we call it the PMS: Storedge, SiteLink, Cubby, and so on). The PMS knows the business facts. KISS knows the access rules. We keep those two things separate on purpose, and one engine combines them the same way for every facility, every PMS, and every app.
Vocabulary: "status" is out, "state" is in
The old world had one word, status, a string copied from the PMS ("overlocked", "current", "reserved") that mixed up what the PMS knew with what should happen. The new word is state: the decision our engine produces, plus a reason. Two tenants can both look "overlocked" in the old vocabulary; in the new one, one is denied · delinquent (behind on this unit) and the other is denied · blanket_delinquency (behind on a different unit). Same old label, different problem, different fix. When you talk about access, talk in states and reasons.
Every unit is in exactly one state
Only one state opens locks for a tenant: permitted. The rest describe why not, or that there is no tenant at all.
| State | Plain meaning | Tenant access |
|---|---|---|
| vacant | Nobody is in the unit (or the PMS says someone is, but we cannot match them to a KISS account yet) | No tenant to let in |
| tenant_permitted | Tenant in good standing | Opens locks |
| tenant_denied | There is a tenant, but access is denied (the reason code says why) | Locked out |
| auction | The unit is in the auction process | Locked out |
| unrentable | The unit cannot be rented (maintenance, damage) | No tenant to let in |
Why is this tenant locked out?
Whenever the state is tenant_denied or tenant_permitted, the unit also carries a reason code. This is the first thing to read on any access question, because it tells you where the fix lives.
| Reason | What it means | Where the fix lives |
|---|---|---|
| delinquent | They owe more than the facility's threshold and are past the grace period | The tenant pays (or the facility changes its rules in KISS) |
| pms_lockout | The facility flagged them in the PMS (overlock, lien, legal hold) | In the PMS: clear the flag there and it clears here on the next sync |
| system_lockout | A manager manually locked them out in KISS | In KISS: remove the override |
| future_move_in | The lease is signed but the move-in date has not arrived | Wait for the date, or correct it in the PMS |
| blanket_delinquency | They are behind on a different unit at this facility, and the facility locks all of a tenant's units together | Resolve the other unit; this one clears on its own |
The shortcut: read the prefix
Reasons that start with pms_ came from the facility's management software, so the answer lives there. Reasons that start with system_ came from KISS itself (a manager override), so the answer lives in KISS. Everything else (delinquent, future_move_in, blanket_delinquency) was computed from the money and dates we synced.
Permitted units carry a reason too: active (all checks passed), pms_exempt (the PMS says never lock this tenant out, so money checks were skipped), or system_exempt (a manager forced access on).
The checklist, in order
The engine walks one checklist for every unit, top to bottom, and the first question that matches wins. That ordering is the logic: an override beats a PMS flag, a PMS flag beats a balance check.
- Did a manager set an override? Force-on means permitted · system_exempt; force-off means denied · system_lockout. Overrides always win.
- Is the unit unrentable? Maintenance or damage. State: unrentable.
- Is it in auction? State: auction.
- Is anyone actually in it? No tenant, or a tenant we cannot match to a KISS account yet: vacant. (The unmatched case is deliberate: if we cannot tell who the tenant is, nobody gets a key.)
- Has the lease started? A move-in date in the future means denied · future_move_in. We compare calendar dates in the facility's own timezone, so a lease that starts today works all day today.
- Does the PMS say "never lock this tenant out"? If the facility honors that flag: permitted · pms_exempt, and the money checks are skipped.
- Does the PMS say "lock this tenant out"? If the facility honors that flag: denied · pms_lockout. One exception: a brand-new move-in gets a short grace window (about two days), because some PMSs leave a new unit flagged until the office finishes setup, and we do not want to lock someone out on day one.
- Do they owe too much, for too long? Balance above the facility's threshold and past the grace period: denied · delinquent.
- Are they denied on another unit here? If the facility turned on blanket delinquency: denied · blanket_delinquency. This is the only question that looks beyond the unit itself.
- Everything passed. permitted · active.
Unit locks and gates are two separate keys
A permitted unit produces up to two things: a key for the lock on that unit (if it has one), and a key for the gates and doors of the area the unit sits in. The gate rule is simply: at least one permitted unit in that area.
"They just paid. Why are they still locked out?"
Access decisions are made from our copy of the facts, so the real question is how quickly a change in the PMS reaches us. Facts arrive five ways:
| Path | When it runs | Speed |
|---|---|---|
| Webhooks | The PMS pushes changes to us as they happen (where the PMS supports it) | Seconds |
| App-open refresh | A tenant opening their app kicks off a background refresh of their own units | Under a minute |
| Scheduled sweep | A full facility refresh on a cycle, roughly every 15 minutes for most PMSs (Storedge instead relies on webhooks plus a nightly sweep) | Minutes |
| Manager re-evaluate | A manager forces the rules to re-run on a unit from the dashboard | Immediate, but see the note below |
| Manual entry | Facilities with no PMS: operators maintain the facts directly in KISS | As typed |
Quick answers
Keep this playbook in sync with
- The decision engine:
UnitAccessEvaluatorin kiss-api (the checklist order, the grace windows) and theaccess_state/access_reasoncolumns on units. - States and reasons: the
UnitAccessStatusandAccessReasonenums. - Facility rules:
LocationPolicy(threshold, grace days, blanket delinquency, respect-PMS-flag switches, move-in lockout grace). - How facts arrive: the per-PMS
Sync{Pms}FactsJobschedules, webhook handlers, the tenant app-open refresh, the manager re-evaluate endpoint, and the V2 partner push endpoints (UnitPushGuardownership rules). - The partner-facing contract:
kiss-api-docs(docs.keepitsimplestorage.com) documents what API consumers see; this playbook covers how it works inside.