What's short of the required level, based on the most recently submitted stock count.
Maintenance request
Tell the manager what needs attention. Reports are shared live with the team.
Open requests
Checking setup...
This app already emails itself using EmailJS (a free service that lets a plain webpage send email with no server) — nothing to set up. The fields below are only needed if you ever want to change the sending account, template, or recipient.
Checking sync setup...
This app is already connected to a free shared database (Firebase) so counts, items, and history sync live across every phone automatically — nothing to set up. The box below is only needed if you ever want to point this app at a different Firebase project.
Advanced: point this at a different Firebase project
- Go to console.firebase.google.com and sign in with any Google account.
- Click Add project, give it a name (e.g. "commercial-hotel-stock"), and finish creation. Google Analytics can be turned off.
- In the left menu, go to Build > Realtime Database and click Create database. Choose any location close to you and start in test mode. Unlike Firestore, this stays on the free Spark plan — no billing account required.
- Once created, go to the Rules tab and replace the rules with:
{ "rules": { ".read": true, ".write": true, "boxcountHistory": { ".indexOn": "timestamp" } } }, then Publish. This keeps it open past the 30-day test mode limit — it's not strong security, same as the app's PIN. - Go to Project settings (gear icon) > scroll to Your apps > click the </> (Web) icon to register a web app.
- Copy the
firebaseConfigobject it shows you (it will include adatabaseURLfield) and paste the whole thing into the box above, then hit Save & Connect.
Realtime Database's free tier (1GB stored, 10GB/month transferred) comfortably covers a small team like this, with no billing account needed.
Until this is set up, each device keeps its own separate items/history, same as before.
Access PIN
Change the PIN staff need to enter to open this app on a new device or after locking it. This is a basic gate to keep casual visitors out if you host this page publicly — it isn't strong security, since the check happens in the browser. Don't use it to protect anything highly sensitive.
How to set up EmailJS (one-time, ~5 minutes)
- Go to emailjs.com and create a free account.
- Add an Email Service (connect your Gmail or any email account) — this gives you a Service ID.
- Create an Email Template. Switch the template body to the Code Editor (HTML) view, not the visual/plain editor, and paste:
<div style="font-family:Arial,Helvetica,sans-serif; max-width:600px; margin:0 auto;"> <h2 style="margin:0 0 4px; color:#2b2b2b;">Commercial Hotel Stock Order</h2> <p style="margin:0 0 20px; color:#767268; font-size:13px;">Submitted {{submitted_at}} · {{total_boxes}} boxes total</p> <h3 style="margin:0 0 8px; color:#a13d2e;">To Order</h3> {{{to_order_table}}} <h3 style="margin:28px 0 8px; color:#2b2b2b;">Full Count</h3> {{{order_table}}} </div>The app already sendsorder_tableandto_order_tableas pre-formatted HTML, so this template just needs to place them — no need to add your own line breaks around them. Important: use triple curly braces{{{order_table}}}and{{{to_order_table}}}, not double — EmailJS escapes double-brace variables into plain visible text, and only triple braces render them as actual HTML. The other variables ({{submitted_at}},{{total_boxes}},{{to_email}}) stay double-braced since they're plain text. - Set the template's "To email" field to
{{to_email}}so it follows the recipient set above. - In EmailJS, go to Account > General to find your Public Key.
- Paste all four values above and hit Save Settings.
Until this is set up, submissions are still saved to History on this device, but the email won't send.