Needs attention
| When | Customer | Alert | Detail |
|---|
Default Google account for FRP — used when a shop has not picked one
A phone follows this only when it has no pin of its own and its selling shop's Profile has no account either — a shop's own choice always wins, and a device the admin pinned by hand (or deliberately cleared) ignores it entirely. Numeric Gaia IDs only, and nothing is armed until you press Save default. “Find with Google” reads the ID off the account you pick on Google's page — a lookup, not a sign-in.
Recent activity
| When | Customer | Event | Detail |
|---|
New customer & plan
Selecting a retailer draws one of their allocated enroll keys (Accounts → Enroll keys — you get a409 if their pool is empty). Selecting a dealer pre-assigns them in the ledger; the phone links with the retailer code of the shop that owns the sale.
Customer ledger
| # | Customer | IMEI / device | Plan | State | Enroll code | Seller | Dealer | Actions |
|---|
Devices — the kill switch applies on the phone's next sync (immediately on any connectivity change, reboot or alarm)
| Customer | Device | State | Lock deadline | Last seen | Controls | Kill switch |
|---|
New retailer / dealer account
Every account signs in with username + password — dealers included. A dealer also keeps a dealer code (DLR-…) as a second sign-in credential, and can open the retailers of their own dealership from this tab (and stock them with keys). A phone number may belong to one account only. Every retailer gets a retailer code — their phone number — which is what the phone types when linking a device.
Enroll keys — pre-allocate ENR codes to a retailer; a customer created under them draws one (ownership = the key) and the phone links with the shop's retailer code — that link burns the key, so it never comes back to the pool
| # | Key | Retailer | Status | Customer |
|---|
Accounts
| # | Role | Name | Username | Retailer code | Keys | Customers | Status |
|---|
Enroll a phone — 2 steps
On the fresh (or factory-reset) phone, tap the welcome screen 6× in the same spot to open the QR scanner, then scan this code: Android downloads TestDPC and sets it as device owner.
Scan with Google Lens to download LetzPay Locker, then link the device with the customer's enroll code.
Or open this link on the phone.
Your enroll keys
| Key | Status | Customer |
|---|
New customer — draws one of your keys above; the phone links with the enroll code + your retailer code (Profile), and that link consumes the key for good
My customers
| # | Customer | Device | Plan | State | Enroll code | Actions |
|---|
Profile — shop details the mobile app shows
The lock message replaces the default text on the phone's lock screen while it is locked (leave blank for the default). Your retailer code above is what the phone asks for when linking a device.
Google account for FRP — factory-reset protection
Nothing saved yet. Press 🔎 Find with Google and choose the Google account this shop sells with — the address you signed in as appears beside the button and its 21-digit ID below. Nothing is armed until you press Save.
These Google account IDs become the selling shop's default: every phone you sell is pinned to them on its next sync, so after a factory reset it can only be set up again with one of them. Numeric IDs only (a Gmail address is refused), and nothing is armed until you press Save. The “Find with Google” button reads the ID off the account you sign in as; it does not sign you into anything. A phone the admin has pinned by hand keeps its own value and ignores this default.
Payment QR — what the customer scans in the app
Upload the shop's printed QR (PNG or JPEG). It is decoded server-side and redrawn on the phone — this replaces the per-customer pay-link QR. With no upload, a UPI id above generates one instead.
Profile picture
Change password
Site domain — where every link this server hands out points
Used for the install QR and APK download link, the app's update and Support site, the website's canonical URLs and the Google “Find with Google” redirect. Type the bare domain (letzpaylocker.info) or the full https://… — it is normalised to the origin and saved without a restart. Clearing the field goes back to SITE_URL in .env. The address baked into the apps when they were built does not change, so keep the old domain serving too.
Notifications — installment reminders and phone nudges
Leave a secret blank to keep what is already saved — it is never shown again after saving, so typing a new value is the only way to replace it. Switching a channel off stops every message on it (the attempt is still logged under Notifications). Push is only an accelerator: phones still poll, so killing a device works either way.
Change password — signs in to this dashboard
The password lives in the database, not in .env, so it survives a restart. To take the login back from a shell, change ADMIN_PASSWORD and restart the container.
LetzPay Locker