Checking access…
Audit desk
What's waiting for your decision, how ready each region is, and the evidence behind it. Review opens the region in Reconciliation (read-only) when you want the detail.
Region readiness
Explained = variances with a reason. Blockers (pending moves / floor additions) must be decided before approval. Quality flags point to explanations worth questioning.
| Region | Sign-off | Missing explained | Unexpected explained | Blockers | Quality flags | Actions |
|---|---|---|---|---|---|---|
| Loading… | ||||||
Move batches waiting for approval
| Move | Reason | Proposed by | Serials (first 20) |
|---|
Floor additions waiting for a decision
| Serial | Location | Model | Reason | Detail | Requested by |
|---|
Spot-check samples drawn
Use Draw sample on a region to pick random explained variances to verify in the field. Each draw is recorded and appears in that region's evidence pack.
Recent scanner-access changes
Ghost serials
Devices that keep surviving stock counts. Missing-carried: on the books and not found, count after count (a missing device should have been reported and taken off inventory). Present-stale: found at the same location, never sold or moved, count after count. A location that wasn't counted in a month pauses the streak instead of breaking it.
How many would each threshold catch?
Serials with a streak of at least N counts, from the last run. Use it to pick thresholds from real data; your current choice is highlighted.
| Streak of at least | Missing-carried | Present-stale |
|---|---|---|
| Run the ghost check to see this. | ||
By region
| Region | Missing-carried | Stale ghosts | Stale suspects | |
|---|---|---|---|---|
| — | ||||
Ghost list
| Serial | Location | Type | Streak | History |
|---|---|---|---|---|
| Run the ghost check to see results. | ||||
Thresholds and exemptions
My actions
Every variance still to sort out, per location, for the regions you look after. Click Open to go straight to that location in Reconciliation.
| Location | Missing to explain | Unexpected to explain | WH transfers | Moves | DSR re-code | Waiting for auditor | Status | Action |
|---|---|---|---|---|---|---|---|---|
| Loading… | ||||||||
Missing / Unexpected to explain = rows with no reason yet (out of the total). WH transfers and Moves can be fixed in bulk in Reconciliation section 5, and doing so clears those rows. DSR re-code = phones coded M01 last month that are still on the shop's list but not re-coded this month. Locked regions (submitted / approved) need the super admin to reopen them.
Current data in the system
What is actually loaded in the database right now — uploaded manifests, scans captured, and the depot→region map. Persists across reloads, unlike the per-upload status messages below.
Loading…
Sign-off overview
Where every region's sign-off stands, per month and manifest type. To act on one, go to the Reconciliation tab, load a reconciliation (month + Shop/Warehouse), then click its region in the Breakdown by region table.
Loading…
Master serial search
Look up everything known about one or many serials — where each is expected, where it was scanned, by whom, its status, and its variance audit history (logged reasons + sign-off status). Case-insensitive; searches all months unless you set one. Available to auditors and super admins.
Stock count window
Controls whether the WH / Shop app can save scans to the database. Close it outside the count period so stray mid-month scans can't taint the data. Applies to everyone using this app.
When set, every scan is recorded under this month regardless of the device's calendar date — use it when a count runs past month-end (e.g. force 2026-07 on Aug 1). The scan's actual date and time are still stored. Leave blank to use each device's current month.
Upload expected inventory
CSV needs a header row with columns: serial, location, device_type, model (model optional). Uploading REPLACES the existing manifest for that month and type — re-upload a corrected file any time.
Preview — review before uploading
IMEI → model check
The first 8 digits of an IMEI (the TAC) identify the phone model. The app learns which model each TAC belongs to from MkNet (the September 2026 export, plus every manifest uploaded since) and stops scans saved under the wrong model. A TAC is trusted once it has 20+ phones and 99%+ agree on one model; rarer TACs are learning and only warn.
Mistakes found
Exceptions (one serial)
For a phone the scanner set aside: you checked the device and its model really differs from what its IMEI says. That one serial is then accepted.
TAC table
Change log
Depot → region mapping
Not scoped to a count month — each upload replaces the whole list. Powers the region filter/rollup in the Reconciliation tab.
DSR roster
Every DSR with their home depot. Upload it just before the count window opens. The file is the full list: DSRs missing from it are marked exited (never deleted) and every change is logged. You always see what would change before anything is saved.
A DSR ID is best: names alone can't tell two DSRs with the same name apart. Phone is the next best.
Current roster
| Name | Depot | Phone | DSR ID | Status |
|---|---|---|---|---|
| — | ||||
DSR stock list
Which phones are allocated to which DSR, for one count month. Upload it after the DSR roster (each DSR is found there) and before the count window opens. Each upload replaces that month's DSR list. A phone can be on one DSR's list only. You always see what would change before anything is saved.
Save the serial column as text so Excel doesn't turn IMEIs into 3.5E+14. The phone is filed under the DSR's depot on the roster, so depot and region come from there.
Lists uploaded
| Month | Phones | DSRs | Depots | Uploaded | |
|---|---|---|---|---|---|
| — | |||||
By depot
| Depot | Phones | DSRs |
|---|---|---|
| Pick a month in the table above. | ||
Sales managers & cover
Who manages which depots and regions: SE / FSM (depots), SFSM / DRM, RM, RSTL (regions), SSOM / HOS (everything). Each upload replaces the manager list; cover assignments are kept separately. Rows named "Vacant …" mark an empty seat. Everyone only ever sees the depots and regions mapped to them.
Depots with no manager
| Depot | Seat | Cover today |
|---|---|---|
| — | ||
Cover assignments
A neighbouring manager can be given a vacant (or absent) depot for the count. The depot's explain rights go to them between the dates below; they end automatically. SFSM/DRM and SSOM will be able to assign cover themselves from the mobile page; until then, the super admin does it here.
| Depot | Covered by | From | To | Status | |
|---|---|---|---|---|---|
| — | |||||
Everyone on the roster
| Name | Title | Depots | Regions |
|---|---|---|---|
| — | |||
DSR counts received
Every stock count a DSR submitted in the sales app. Late counts (sent after the count window closed) are kept aside until you accept them. Unmatched counts come from a DSR who isn't on the roster yet: upload the roster, or map the ID to the right DSR.
Unmatched DSRs
| Agent ID | Name sent | Counts | Last | |
|---|---|---|---|---|
| — | ||||
DSRs yet to count, by depot
| Depot | Active DSRs | Counted | Yet to count |
|---|---|---|---|
| — | |||
Counts
| DSR | Depot | Submitted | IMEIs | Status | |
|---|---|---|---|---|---|
| — | |||||
Admin access
Who can open this admin view. Super = full access (uploads, reset, this page); Viewer = regional admin (reconciliation, reasons, and Scanner access for the regions you tick); Auditor = review and approve. Changes apply on the person's next page load — no redeploy needed.
Loading…
Add or update an admin
Convert old free-text reasons
Reasons typed before the fixed codes existed (e.g. "CAT", "Warehouse", "Stolen Device") are converted to the new codes. The old wording is kept in the note ("was: …"). Reasons that don't match a code stay as they are, marked "old".
Reconciliation dashboard
Compares what was pre-uploaded against what the warehouse team / shop controllers actually scanned. Matching is location-strict: an item counts as matched only if scanned at the location the manifest expects it. An item scanned at the wrong location shows as Missing where it's expected and Unexpected where it was scanned.
Breakdown by region
Click a region to filter the detail below and manage its sign-off in the panel above. Click again to clear.
| Region | Expected | Scanned | Matched | Missing | Unexpected | Progress | Sign-off |
|---|
Breakdown by location
Click a row to filter the serial-level detail below to that location. Click again to clear.
| Location | Region | Expected | Scanned | Matched | Missing | Unexpected | Progress |
|---|
4Condition breakdown
Scanned items grouped by condition. Faulty units are highlighted. Respects the region/location filter above.
Nothing to fix in bulk for this month.
Found at a shop, still on the WH list
Phones the WH dispatched but never transferred on MkNet. Count at shop, send to WH counts them where they physically are, closes the WH's Missing rows automatically, and adds them to the Transfers to post list for the WH team.
Scans saved under the wrong location
Misplaced scans grouped by session (same scanner, same day, same location chosen). Propose a move with one click; an auditor approves the whole batch once. The scans are moved, not deleted — the location they were scanned under is kept.
Floor additions
Real phones found on the floor that aren't on any manifest. An Unexpected row coded U02, U03 or U04 becomes a request here. Once an auditor accepts it, it counts as inventory at that location.
Scanner access
Regional admins manage the people in their own regions (set their regions in Admin access); only the super admin can switch between Grace and Strict. Choose which locations each stock controller / WH team member can scan into. Their scan app then shows only those locations, and the server refuses scans anywhere else. The list starts from who actually scanned in the last 2 months; locations holding under 5% of a person's scans start unticked because they're probably mistakes.
| Scanner | Scanned in last 2 months | Assigned locations |
|---|
Add a scanner
Add in bulk
One line per scanner + location: email, location, valid_until (valid_until is optional, yyyy-mm-dd, for relief cover). Or upload a CSV with those columns. Adds to existing access; it doesn't remove anything.
Recent changes
Every change to scanner access, newest first, with who made it.
DSR custody tracker
Every phone coded M01 — with a DSR, but the serial is still on the shop's manifest because the allocation wasn't completed — tracked month on month. The This month column is worked out automatically from the latest manifest and scans; the Follow-up column is set by the Central Allocation Team.
| Serial | Shop | DSR / SE-FSM | Flagged | This month | Follow-up | |
|---|---|---|---|---|---|---|
| Loading… | ||||||
Clean up duplicate saves
Before the sync fix, the scan app could save the same scan 2–3 times. This keeps the first saved row for each serial + month and moves every extra copy to an archive table (nothing is deleted). It then switches on a database rule so a serial can only be saved once per month from now on.
Danger zone — reset count data
Deletes scans and uploaded manifests. Use this to clear test/stress data before a real count cycle. This cannot be undone. Does not touch the region map or admin list.