A security audit log - date/time, success or failure, IP address and device for every admin login attempt.
1
Check this periodically for failed attempts you don't recognize - a burst of failures can mean someone's trying to guess the password.
2
Delete logs clears the whole history if it's grown too long - this is just an audit trail, so it's safe to clear.
Audit site (audit.saitostore.com)
A separate, completely white, locked page that holds the Shion Robux sales sheet: 20 packages (Package Number, Robux List, Price) and a Total Package Sell count for each, with a Total row at the bottom.
a
Change a count: type a number in the Total Package Sell cell and press Enter, or use the small − / + buttons that appear on the row. Or use the Add entry box under the sheet (pick a package, quantity, optional note, Add). Every save is written to the Entries log with time, package, change and note.
c
Profit: Price is your stock price and can be edited per package. Type your Sell Price for each package and the sheet works out Profit Each and Total Profit ((sell price − stock price) × sold), plus a total profit, revenue and stock cost at the top. A package with no sell price yet counts no profit. Each package also has its own Note cell. Every change is logged.
d
Entries log – edit / delete: use Edit on a row to change a sale's quantity or any entry's note (the package count follows), or Delete to remove it (a sale is taken back off the count). Edited rows are marked edited, and a deletion leaves a Deleted line so nothing disappears without a trace.
e
Search & pages: the log shows 20 entries per page (Previous / Next below it). Use the Search box for a note, package number, Robux amount or type (e.g. "sell price"), and From / To for an exact date and time (Cambodia time); Today fills in today. Export entries CSV then downloads only what the search shows.
f
Guide: the black Guide button pinned at the bottom-right of the audit page opens a floating guide over the sheet (also the Guide link at the top; Close or Esc hides it). It explains how the Total row is worked out from your real numbers, how sell price becomes revenue and profit, a bar chart of stock cost against revenue per package, and the steps for using the sheet. You can keep working on the sheet while it is open.
g
Khmer / English: the audit page opens in Khmer by default. The floating ខ្មែរ | EN switch, pinned at the bottom-left of the screen (on the sign-in screen too), changes the whole page (sign-in, sheet, log, guide and messages). Your choice is remembered on that browser. Numbers and the Robux amounts stay as digits; notes you typed yourself are never translated.
b
Export: Export all (top right) downloads one zip with the sheet CSV, the whole entries log CSV and the Excel workbook. Export CSV and Export Excel download the sheet with its Total row; the Excel file also has an Entries log tab and live total formulas. Export entries CSV (above the log) downloads just the log.
1
It signs in in two steps: your username and password, then Approve in the Telegram security bot (there is no authenticator code and no code to type - the approval request arrives in the bot as soon as the password is right). The approval message says AUDIT portal, so you know which site you're approving. The admin panel itself keeps its four steps. The audit site can be open on up to 5 devices at once (each signs itself in with the bot approval; past 5 the oldest is signed out). Because the sign-in is only two steps, saving on this site no longer asks for an authenticator code either; the sign-in cap still applies (a few wrong passwords lock that address for a minute, and no more than 8 approval requests are sent per 10 minutes).
2
Until you sign in it shows only a white sign-in form; every other address on that site is a blank white page.
3
Its sign-in is separate from this panel: signing in there doesn't sign you out here, and a session from one site doesn't work on the other. It can't read or change anything in the store - only this sheet - and an idle tab signs itself out after 15 minutes (use the small Sign out link, top right, to end it sooner).
4
Each sign-in attempt on this Login History record is tagged with the site it was for (admin, audit or timer), so logins to the other sites are easy to tell apart.
Database alert
If the store's database stops answering, the site sends one Telegram message to the owner only (at most once every 10 minutes). While it is down, customers may briefly see “The store is busy right now”. Checkout keeps working from the last known prices and packages for up to 10 minutes, so most customers won't notice. No action is needed - it recovers by itself.
Timer site (timer.saitostore.com)
A separate, locked dashboard for countdown timers you create by hand for any username (real-life countdowns - they are not connected to orders or the bots). Every timer keeps running on the server: refreshing, closing the browser or opening another device never changes the time left.
1
Sign in: two steps - your username and password, then Approve in the Telegram security bot (the message says TIMER portal). There is no authenticator code and no code to type, at sign-in or when you save a change. The timer site has its own session - it doesn't sign you out here, and it can't reach anything else in the store. An idle tab signs itself out after 15 minutes (timers keep running). You can be signed in on up to 5 devices at once - each device signs itself in with the bot approval, and a new sign-in doesn't sign out the others (past 5, the oldest device is signed out). The admin panel still allows only one device at a time.
2
Create Timer: type any username, pick a duration (5 min, 10 min, 30 min, 45 min, 1 hour, 2 hours, 1 day, or set your own hours : minutes : seconds, from 1 second to 365 days) and an optional note. A new timer is Ready - it does not start by itself. Save as draft keeps it as a Draft instead: it never runs and doesn't use up the username, and Mark ready (button or More menu) turns it into a Ready timer (refused if that username already has a live one). The six statuses are Draft, Ready, Running, Paused, Finished and Cancelled; the counters at the top show each one, and notes appear as yellow note chips. One live timer per username (Ready, Running or Paused); a Finished or Cancelled one doesn't block a new one.
3
Buttons: the action buttons sit in front of the username. Ready → Start. Running → Pause and Finish. Paused → Resume and Finish. When the countdown reaches 00:00 the server marks it Finished by itself, stamped with its real end time, and it never goes negative. Many timers can run at once and never affect each other.
4
More (…) menu: View details (times, who created/changed it, live countdown and the full history), Edit, Finish, Cancel timer, History, Delete. Editing a running or paused timer's duration keeps the time already used - 30 → 45 minutes adds 15 minutes to what is left; a duration not longer than the time used is refused (use Finish instead). Finished and Cancelled timers can still have their name and note edited, not their duration.
5
Delete & restore: delete asks for confirmation and is soft - the timer leaves the list but its history stays. A running timer is paused when deleted, so no time is lost or gained. Choose the Deleted status filter and press Restore to bring it back (refused if that username now has another live timer).
6
Countdown precision: the countdown is shown as days, hours, minutes, seconds and milliseconds (e.g. 00d 00h 25m 06s 481ms) and counts down smoothly. The Precision button next to Date range cycles seconds → milliseconds → microseconds and remembers your choice. Milliseconds are the finest the server keeps; microseconds are drawn smoothly from your browser's own clock (they look continuous but are not extra accuracy from the server). The page keeps its clock in step with the server using the quickest network round trip, so the digits are as true as your connection allows (a slow connection can be off by tens of milliseconds).
f
Add or remove time (± Time): every timer that has not ended (Draft, Ready, Running, Paused) has a ± Time button in its row (also … → Add or remove time). Choose Add or Remove, tap quick amounts (+1m +5m +10m +30m +1h +1d, they stack) or type days / hours / minutes / seconds. Before you confirm, Result shows the new time left, the new end time (Cambodia time) and the original duration after the change. The original duration grows or shrinks by the same amount (30 min + 15 min added = 45 min); a running timer's end time shifts by exactly that amount and it keeps running; you can't remove more than what is left (use Finish) or go past 365 days; a finished or cancelled timer can't be changed. It is logged in the history (who, how much, time left before → after) and Undo takes it back.
$
Price & payment: timers are a paid service, so each one can have a Price in USD (optional, e.g. 2.50) and a Paid tick, set in the Create or Edit form. Price and paid can be changed in any state - a finished timer too (… → Edit note, name or price). In the list, the Price column shows the amount and an Unpaid / ✓ Paid pill: tap it to flip it (also … → Mark paid / Mark unpaid). The top of the page shows Total price, Paid and Unpaid for every timer the filters match (all pages, deleted timers excluded unless you pick the Deleted filter). Export CSV (next to the filters) downloads those timers with price, paid / unpaid and paid time, plus the three totals at the bottom. Every price change and paid mark is in the timer's history and in Activity (filter Price / payment), and Undo takes it back. Every timer-site user (owner and team members) can set prices on the timers they can see.
e
Undo / Redo (top of the page) work for the whole system, not just your own changes: create, delete, restore, edit (name, duration, note), Finish and Cancel. Start, Pause and Resume are recorded but not undoable. Undo never erases the past - the original event stays in the history and a new Undo performed / Redo performed line is added, pointing back at it with who pressed it. Undoing a manual Finish returns the timer Paused with the time it had. If the timer has changed since (for example it was started), that step is skipped and the skip is logged, so Undo never overwrites later work. Making a new change clears the Redo list.
7
History & Activity: every action is recorded with who (the admin who approved that login), what, when, and old → new values, including automatic finishes ("System"). Open a timer's details for its own timeline, or press Activity for the latest events across all timers. Times are Cambodia time. Filter Activity with the bar at its top: search a username or timer ID, pick a kind of activity (Created, Started, Paused, Resumed, Finished, Cancelled, Edited, Deleted, Restored, Undo / redo), pick an admin (or System for automatic finishes), and set From / To dates. The filters combine, and Clear resets them.
8
Search & filters: search by username, note or timer ID (e.g. 12 or #12); filter by status (All, Ready, Running, Paused, Finished, Cancelled, Deleted) and by created date range. Everything is done on the server and paged (25, 50 or 100 per page). The page refreshes itself every few seconds, so a change from another admin appears shortly.
a
Khmer / English: the timer site opens in Khmer by default. The floating ខ្មែរ | EN switch, pinned at the bottom-left of the screen (on the sign-in screen too), changes the whole page (sign-in, table, forms, history and messages). Your choice is remembered on that browser. Usernames and notes you typed yourself are never translated.
b
Guide: the black Guide button pinned at the bottom-right of the timer page (also the Guide button at the top; Close or Esc hides it) opens a floating tutorial over the dashboard: how a timer works and which buttons each state has (with how many timers are in each state right now), how changing a duration is worked out, how Undo/Redo behaves, and step-by-step instructions. You can keep working while it is open. The page is plain white, in the same style as the audit site.
c
Team members (sub-admins): you are the owner (username + password, then Approve in the Telegram bot). Press Team at the top to add a team member: a username (3–32 letters, numbers, dot, dash or underscore) and a password typed twice (6+ characters). They sign in at their own address, timer.saitostore.com/team (a page with only the username + password form - no owner login on it), with just those - no authenticator or bot. You sign in at timer.saitostore.com/owner (or /timer/) with your password and a tap in the bot; the two addresses show different forms but open the same dashboard, and neither page mentions the other. The two sign-ins are completely separate: each address uses only its own session, so signing in as a team member at /team never signs you out at /owner (or changes your account there), and the other way round - even in the same browser. A team member sees and manages only their own timers (their own counters, Activity and Undo/Redo), has the same page as you, and cannot create accounts or open Team. Two people may use the same timer username without clashing.
d
What you can do as owner: you see every timer (a small teal tag next to the username shows whose it is) and can start, pause, edit, delete or restore any of them; history records who did it. Use the Whose timers filter to look at one person. In Team you can Rename, Reset password (typed twice; signs them out everywhere), Disable / Enable (a disabled account is signed out at once), Delete (their timers and history are kept), or press View timers / Log. The Sign-in log tab lists every sign-in attempt - time, account, success or failure, IP, device and the reason (wrong password, locked, disabled). Passwords are stored hashed and can never be read back, only reset; 10 wrong tries lock an account for 15 minutes; a team member session lasts 12 hours or until they sign out. Undo / Redo is per person: a team member can only undo their own changes, and yours are yours.
9
Add the domain (one-time): in Cloudflare → Workers & Pages → saito-store → Custom domains, add timer.saitostore.com. No other setup or environment variable is needed - it uses the same database, login and authenticator secret.