π₯ͺ Sandwich Grill β Billing Software Guide
Version 2 Β· Bills saved in the cloud (Supabase) Β· Opened from a secure https:// address in Google Chrome or Microsoft Edge
What is new in Version 2 (read this first)
Everything below this section is the Version 1 guide. It still explains the menu, bills, reports and the printer.
Where it talks about opening index.html, browser storage or restoring a backup, the Version 2 rules here replace it.
- Open the app from its https:// address (the bookmark), not from a folder. Both laptops then always run the same, newest version.
- Log in. The Admin and the Shop Manager each have their own email and password. Never share them or write them on the laptop.
Press Log out when you leave a laptop.
- The light at the top: green "Online" means bills save and both laptops update by themselves.
Amber means bills still save but the other laptop updates once a minute. Red means no internet: bills cannot be saved.
- "Saved" only after the cloud confirms. A bill is finished only when the screen says "Saved in the cloud: bill SG-β¦".
- No internet: keep the bill on screen, take payment as usual, and press Save when the light is green again. Nothing is saved on the laptop only.
- NOT CONFIRMED: if the internet drops while saving, the bill stays on screen and is locked. Press Try saving again when the light is green.
It never makes the same bill twice.
- Cancel or refund instead of delete: open the bill in Orders and press "Cancel / Refund" with a reason. It stays in the list "Cancelled / refunded".
- Menu delete asks you to type the item's name. "Switch off instead" hides the item but keeps it safe.
- Printer settings (paper width, auto print) are saved on each laptop separately.
- New version: a banner says a new version is ready; the app reloads by itself after the current bill.
- Daily copy: bills are safe in the cloud, but press Settings β Download full copy every day for extra safety.
- UPI: the app does not check the bank. Check the payment on the phone as before.
1. The simple approach
The app is a set of normal web files (HTML, CSS, JavaScript) that you keep in a folder on your laptop. You open index.html in Chrome or Edge, and the app runs inside the browser.
- No internet needed, no website, no hosting, no server, no monthly fee.
- Data is saved inside the browser on this laptop (using the browser's built-in database called IndexedDB). Everything is saved the moment you click a button.
- Printing uses the normal Windows print window, so any printer with a working Windows driver can print the receipt. No paid printing service.
- Backups are files you download with one click and keep on a pen drive or Google Drive.
Why IndexedDB and not "localStorage"? Both are built into the browser. localStorage only holds about 5 MB, which a busy shop could fill in a few months of bills. IndexedDB can hold much more, so it is safer for years of bills.
2. The files and folders
SandwichGrill\ β the main folder (keep it in one place)
β index.html β OPEN THIS to start the app
β GUIDE.html β this guide
β README.txt β short start instructions
ββ css\
β style.css β colours and layout of the app
β receipt.css β how the printed bill looks
ββ js\
default-data.js β your starting menu + prices (used only the first time)
utils.js β helpers: money format, dates, pop-ups, downloads
storage.js β saving/loading data, bill numbers, calculations
receipt.js β builds the 80mm / 58mm receipt and opens Print
billing.js β the Billing screen
orders.js β the Orders page (search, status, reprint, delete)
reports.js β Dashboard and Reports pages
menu-admin.js β the Menu page (items, sizes, prices, costs, combos)
settings.js β Settings, test print, backup and restore
main.js β starts the app and switches pages
You do not need to edit any file to change prices, items or the shop name. Do that inside the app.
3. Run it on your Windows laptop
- Download the file sandwich-billing.zip.
- Open File Explorer β Downloads. Right-click
sandwich-billing.zip β Extract Allβ¦
- In the box, type
C:\SandwichGrill and click Extract. (Any folder is fine, but then never move or rename it later.)
- Open
C:\SandwichGrill. You should see index.html, GUIDE.html, and the folders css and js.
If you see one more folder inside, open it: the files must be directly in the folder you use.
- Right-click
index.html β Open with β Google Chrome (or Microsoft Edge). The Billing screen appears with your menu.
- Make it easy for your father: in Chrome press Ctrl+D to bookmark it. Press F11 for full screen (press F11 again to exit).
Make a desktop icon (recommended)
- Right-click on the desktop β New β Shortcut.
- Paste this as the location (for Chrome):
"C:\Program Files\Google\Chrome\Application\chrome.exe" --start-fullscreen "file:///C:/SandwichGrill/index.html"
For Edge use:
"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" --start-fullscreen "file:///C:/SandwichGrill/index.html"
- Click Next, name it Sandwich Grill Billing, click Finish.
Choose ONE browser and stick to it. Chrome and Edge keep separate data. Bills made in Chrome will not appear in Edge. Also always open the same index.html from the same folder, and do not use Incognito / InPrivate windows.
4. First-time setup
a) Shop name and contact details
- Click βοΈ Settings & Backup.
- Shop name is already Sandwich Grill. Fill in Address line 1, Address line 2, Phone number, and an optional extra line (e.g. Instagram).
- Check the thank-you message and "Bill number starts with" (default
SG-, so bills are SG-0001, SG-0002 β¦).
- Click πΎ Save settings.
b) Check the menu and prices
- Click π Menu. All 43 items from your printed menu are loaded in 9 categories.
- Click Edit on any item to change its name, category, sizes, selling price or cost. Click πΎ Save item.
- Use the Available switch to turn an item off when it is sold out. It shows as "Not available" on the Billing screen.
- Categories tab: add, rename, delete (only empty ones) and change the order of categories.
- Sauces tab: sauce prices start at βΉ0 because your menu does not give a price for each sauce. Type the price and click πΎ Save sauces.
- Combo offers tab: click Create combo, add the items inside it, type the combo price, and the estimated cost (the "use item costs" button adds up the item costs for you).
c) Preparation cost (for profit reports)
The menu does not show your costs, so every cost starts at βΉ0 and reports warn you. For each item, click Edit and type your estimated cost to make one (bread, filling, cheese, sauce, packingβ¦). Until you do this, the "estimated gross profit" is too high.
Price and cost changes apply to new bills only. Old bills keep the price they were sold at, so your past reports stay correct.
5. Daily use (for the counter)
- Open the app. The Billing screen shows categories on the left, items in the middle, the bill on the right.
- Tap a category, then tap an item. If the item has sizes (Medium/Large, Steam/Fried, Sandwich/Wrap) or sauces, a window asks you to choose; tap β Add to bill.
- Use + and β to change quantity. To type a big number (e.g. 6), click on the number itself. Tap β to remove an item.
- Discount: type the amount, and choose βΉ (rupees) or % (percent).
- Choose Cash, UPI or Card.
- Finish the bill:
- π¨οΈ Complete & Print β customer has paid; saves and prints.
- β
Complete β customer has paid; saves without printing.
- β³ Save as Pending β order taken but not paid / not handed over yet.
- Pending orders: click β³ Pending orders (top of Billing) or the Orders page. Click β
Complete when paid. Click View β βοΈ Edit items to add items to a pending order.
- For UPI: check that the money has arrived on your phone/UPI app before clicking Complete. This software does not check UPI or card payments; it only records what you select.
6. Connect and test the thermal printer
I have not been able to test with a real POSIFLOW Shreyans printer. The receipt is designed for 80mm paper and tested as an 80mm and 58mm PDF. Please check compatibility with the steps below before depending on it in the shop.
a) Before buying β check compatibility
- Ask the seller / POSIFLOW support: "Does this printer have a Windows 10/11 64-bit driver, so it appears in the normal Windows printer list and can print from Chrome?" Their website has a Drivers & Demo menu.
- The model in your photo is USB only (no Wi-Fi/Bluetooth). Your laptop needs a free USB port (or a USB adapter).
- Buy 80mm thermal paper rolls (80 Γ 50mm or similar). The 58mm option in the app is only for 58mm printers.
b) Install the driver
- Download the Windows driver for your exact model from POSIFLOW's "Drivers & Demo" page (or use the CD/pen drive in the box). Only download from the official site.
- Run the installer as the instructions say. Choose the USB port when asked. Some drivers ask you to choose a model name like "POS-80" β pick the one the manual says.
- Plug in the printer, load the paper (shiny side towards the print head β usually paper comes out from under the roll), close the lid, switch it on.
- Printer self-test: most thermal printers print a self-test page if you hold the FEED button while switching on. Check your manual.
- Open Settings β Bluetooth & devices β Printers & scanners. The printer should be listed. Click it β Print test page.
c) Printer settings in Windows
- In Printers & scanners β your printer β Printing preferences.
- Paper size: choose the 80mm roll size (names differ: e.g. 80mm Γ 297mm, 72mm Γ Receipt, Roll Paper 80 Γ 3276mm).
- If there is a cut option (auto cutter), choose "cut at end of document / page".
- Tip: do not set it as the default printer if you also use a normal printer; Chrome remembers the last printer you used anyway.
d) Print the test receipt from the app
- App β βοΈ Settings & Backup. Paper width: 80 mm. Click π¨οΈ Print test receipt.
- In the print window: Destination = your thermal printer.
- Click More settings: Margins = None, Scale = Default, untick Headers and footers.
- Click Print. Chrome remembers these settings for next time.
Check: shop name at the top, all text inside the paper, βΉ symbol visible, total in bold, paper cut after the thank-you line.
| Problem | Fix |
| Text too small / too big | Settings β Text size on receipt β change β Save β test again. |
| Right side cut off | Check Margins = None and Scale = Default. Choose the 80mm paper size in Printing preferences. |
| Bill split onto 2 pieces, or very long blank paper | Settings β Page length β "Let the printer decide" β Save β test again. |
| Nothing prints | Is the printer on, with paper and lid closed? Does the Windows test page print? If not, the driver is the problem, not the app. |
| Very faint print | Paper loaded upside down (thermal paper prints only on one side), or poor-quality paper. |
Optional (only after printing works well): to print without the print window every time, add --kiosk-printing to the desktop shortcut, before the "file:///β¦" part. Chrome then prints straight to the default printer, so the thermal printer must be the Windows default printer.
7. Backup every day, and restore
Daily backup (2 minutes after closing)
- Click βοΈ Settings & Backup β β¬οΈ Download full backup (or the orange button in the yellow reminder bar).
- A file like
sandwich-grill-backup_2026-10-17_2215.json is saved in Downloads.
- Copy it to a pen drive and/or upload it to Google Drive. Keep at least the last 7 days. A copy only on the same laptop does not protect you if the laptop breaks.
The app shows a yellow reminder at the top on any day you have bills but no backup.
Restore (only when needed)
- Settings & Backup β π Choose backup fileβ¦ β select the backup file.
- The app checks the file. If it is damaged or from another program, nothing is changed.
- You see what is in the file next to what is in the browser now (number of bills, items, shop name), and a warning if the file has fewer bills.
- Type RESTORE and click Replace my data with this backup. The app first downloads a SAFETY backup of your current data, then replaces it.
Excel / CSV exports
- Orders page β Bills CSV (one row per bill) or Item lines CSV (one row per item sold), using the current filters.
- Reports page β Report CSV (summary, day-by-day and item-wise for the chosen dates).
- CSV files open in Excel or Google Sheets. They are for reading; to restore data you need the .json backup.
8. How the numbers are counted
| Situation | What the app does |
| Completed bill | Counted in sales, payment totals, best sellers and profit. |
| Pending bill | Not counted as sales. Shown separately ("Pending orders") until you mark it Completed. Each order has only one status: Pending or Completed. |
| Customer cancelled / refund given | Open the bill β ποΈ Delete bill β type the reason (e.g. "Refund given β cold food"). The bill is removed from all sales, and a copy is kept in Orders β Deleted bills with the reason and time. Its bill number is never reused, so a gap in numbers can always be explained. Partial refunds are not supported in this version: delete and re-bill the correct items. |
| Bill date | Reports use the date and time the bill was first created. |
| Discount | Subtracted from the bill. Sales figures are after discount. |
| Estimated gross profit | Final amount β (preparation cost Γ quantity) for completed bills. It is not net profit: rent, salaries, electricity, gas and other expenses are not included. It is only as correct as the costs you enter. |
9. Limits you must know
- One laptop, one browser. Data is not shared with other computers or phones. There is no online access.
- Clearing browser data deletes everything. Never clear "Cookies and other site data" / "Hosted app data". Uninstalling Chrome/Edge or resetting Windows can also remove it. Your backups are the only protection.
- The browser may delete stored data in rare cases if the disk is almost full. Keep free disk space and take daily backups.
- Use the app in one tab only. The app warns you if it is open twice.
- No GST invoice. The receipt is a simple bill. It does not calculate GST or show a GSTIN, so it is not a GST tax invoice. If the shop is GST-registered, talk to your accountant before using it for GST billing.
- No payment checking. UPI and Card are only recorded, not verified.
- No user login or passwords. Anyone using the laptop can change prices or delete bills. (Deleted bills stay in the log.)
- No stock / inventory, no kitchen order tickets (KOT), no customer database in this version.
10. Test it yourself (10 minutes)
I tested all of these automatically in Chrome (48 checks, all passed). Do them once on your laptop too, before the shop starts using it:
- Add Veg Sandwich β choose Wrap + Garlic Mayo β qty 2. Add Coke 3 times, French Fries Large. Check the subtotal: 158 + 60 + 159 = βΉ377.
- Type discount 10 β total βΉ367. Choose % β total βΉ339.30. Set it back to βΉ.
- Choose UPI β Save as Pending. Bill SG-0001 appears in Pending orders.
- Make another bill with 6 Γ Masala Bread Omelette (click the quantity and type 6) β Complete.
- Close the browser and open the app again. Both bills are still there (Orders page).
- Orders β SG-0001 β β
Complete. Dashboard shows today's sales, Cash and UPI split.
- Reports β Today β Report CSV and open it in Excel.
- Settings β Print test receipt (choose "Save as PDF" if the printer is not connected yet).
- Settings β Download full backup. Then Orders β delete one bill with a reason. Then restore the backup file: the bill comes back.
- When you are happy, reset everything for real use: see "Start fresh" below.
Start fresh after testing
Test bills stay in the data. When testing is finished: Settings & Backup β ποΈ Delete all bills β type DELETE. All bills are removed and numbering starts again at SG-0001. Your menu, prices, costs and shop details are kept, and a safety backup is downloaded first.
11. Menu details to confirm
- Spelling corrected from the printed menu: Panner β Paneer, Mushroon β Mushroom, Nugets β Nuggets.
- Sandwich / Wrap items: the printed menu column says "Sandwich/wrap" with one price, so each item has two types, Sandwich and Wrap, at the same price. Delete the Wrap type if you do not offer it.
- Chicken Popcorn βΉ159 / βΉ259: entered as Medium / Large (same column as the fries). Rename if different.
- Momos: Steam / Fried prices as listed. Schezwan Momos βΉ159 has one price.
- Sauces: the Munchies sauce box on your menu says "@29". I did not set sauce prices; type 29 (or the right price) in Menu β Sauces if sauces are charged.
- The "Sandwich" card on the menu has a "Steam/Fried" heading, which looks like a design mistake, so those items have one price.
- Costs are all βΉ0 until you enter them.
12. Problems and fixes
| Problem | Fix |
| All my bills are gone | Are you in the same browser (Chrome vs Edge), not an Incognito window, opening the same index.html? If data was cleared, restore the latest backup. |
| "The billing app could not start" | Use Chrome or Edge (not Internet Explorer), not a private window. Press F5. |
| Menu items missing on Billing | Check the item's category and the Available switch on the Menu page. |
| Screen does not fit | Press F11 for full screen, or Ctrl+β to zoom out (Ctrl+0 to reset). |
| Backup file not found | Look in Downloads. In Chrome press Ctrl+J to see downloads. |
13. How the code works (for learning)
- index.html has the page structure: top tabs, the Billing screen, the Orders page, and empty sections that JavaScript fills in.
- storage.js β
Store.load() reads everything from IndexedDB into memory when the app starts. Every change calls a save function (saveOrder, saveMenuβ¦) that writes to IndexedDB at once.
- A bill (order) is saved like this:
{ billNo: "SG-0001", createdAt: "2026-10-17T12:30:00Z", status: "Pending",
payment: "UPI", subtotal: 377, discount: 10, total: 367, totalCost: 0,
lines: [ { name: "Veg Sandwich", sizeName: "Wrap", sauces: [{name:"Garlic Mayo"}],
qty: 2, unitPrice: 79, unitCost: 0 }, ... ] }
- The bill copies the name, price and cost at the moment of sale. That is why menu changes don't change old bills.
- Calc.totals() in storage.js calculates subtotal, discount and total. Calc.summarize() makes the report numbers (only Completed bills).
- receipt.js builds the receipt HTML, measures its length, sets the paper size (80mm or 58mm wide), and calls
window.print(). receipt.css hides the app and shows only the receipt when printing.
- To change colours, edit the values at the top of css/style.css (for example
--orange).