Built on Y Build Go from prompt to a deployed app on your own domain — no server. Start free
BuildShipCompareThe LabAbout Start building →
ybuild / Scenarios

POS for Small Retail

An independent shop runs on thin margins, a mix of cash and card, and whatever the owner can reconcile after close. Most off-the-shelf POS packages charge rent per terminal, bury your products in generic categories, and keep your data on their subdomain, while a spreadsheet-and-card-reader setup quietly loses track of tax, tender, and stock. This guide walks through the register a small retailer actually needs, and how to stand it up as a running, hosted app on ybuild, served on your own domain.

The problem

What you’d build

Register and checkout screen

A touch-friendly till: scan a barcode or search an item, build a cart, apply a line or cart discount, and watch tax compute per line by tax class at your store rate. Tender splits across cash and card, change is calculated, and a receipt prints or emails. It ships live and hosted on ybuild from the first build, on your own domain.

Inventory tied to every transaction

One product catalog where each item carries a cost, price, tax class, on-hand quantity, and reorder point. A sale deducts stock, a refund adds it back, a void never touches it, and a low-stock view flags anything below its reorder point so you order before the weekend instead of after the stockout.

Drawer close and daily reporting

A shift model: a cashier opens a drawer with a counted float, rings all day, and at close the system shows expected cash versus counted cash and logs the over or short. A Z-report totals sales, tax collected, and each tender type for the day and the tax period, ready to export for your bookkeeper, all on your live ybuild app.

The data model

products
sku, name, category, barcode, unit_cost, retail_price, tax_class, qty_on_hand, reorder_point
sales
receipt_no, register_id, cashier_id, customer_id, subtotal, discount_total, tax_total, grand_total, status, sold_at
sale_lines
sale_id, product_id, qty, unit_price, line_discount, tax_class, tax_amount, cost_at_sale
payments
sale_id, method, amount, card_brand, card_last4, processor_txn_id, change_given, is_refund
drawer_sessions
register_id, cashier_id, opened_at, opening_float, cash_payouts, closed_at, expected_cash, counted_cash, over_short

A day in the system

  1. Open: the cashier logs in and opens a drawer session with a counted opening float, say 150 dollars in small bills. The register is now live and every sale this shift ties to that session.
  2. First sale: you scan barcodes, items land in the cart at their price and tax class, a 10 percent coupon applies as a line discount, and tax computes only on the taxable lines at your store rate, then sums and rounds once.
  3. Tender: the customer pays part cash, part card. The card leg goes to your payment processor and only a token, the last four digits, and the brand come back; change is figured on the cash leg, the receipt emails, and each line deducts its product quantity.
  4. Return: someone brings an item back with a receipt. You look it up by receipt number and issue a refund as a new, linked record that reverses the exact tax and tender and puts the item back on the shelf.
  5. Correction: a mis-scan gets voided before tender and never touches stock; a completed sale that was wrong is refunded, not deleted, so the audit trail and the counts both stay intact.
  6. Exempt sale: a reseller with a resale certificate buys tax-free. You flag the whole sale exempt, capture the certificate number, and no tax is charged on any line.
  7. Restock check: mid-afternoon the low-stock view lists everything below its reorder point, so you place vendor orders before the weekend rush instead of after you run out.
  8. Close: the cashier counts the drawer. The system shows expected cash (opening float plus cash sales minus cash refunds and payouts) against counted cash, logs the over or short, and prints a Z-report of sales, tax collected, and tender totals, all hosted on ybuild.

Where AI trips up

✓ Build first
  • The register plus inventory core: a catalog with price, tax class, and quantity, a cart that scans items, per-line tax at the store rate, split cash and card tender, and stock that deducts on sale.
  • Append-only sales with refunds and voids as linked reversals, so every completed sale, return, and correction is an immutable record that reconciles.
  • Drawer sessions with an end-of-day close: opening float, expected versus counted cash, over or short, and a Z-report of sales, tax collected, and tender totals.
— Skip for now
  • A full accounting ledger. Export daily totals and tax collected as CSV for your bookkeeper or QuickBooks instead of rebuilding double-entry accounting inside the register.
  • Multi-location, per-address tax engines. v1 is one store with one rate table keyed by tax class; add jurisdictions and address-level rate lookups later.
  • E-commerce, loyalty, and marketing automation. Ship the counter first and bolt on an online store or a points program once the register is trustworthy.

FAQ

Can I store customers' card numbers so refunds and receipts are easier?

No. Storing full card numbers puts you in PCI DSS scope and is a serious liability. Route the card to your payment processor and keep only a token, the last four digits, and the card brand. Refunds reference the processor's transaction ID, so you never need the raw number, and a breach of your database exposes no usable card data.

How does the system get sales tax right on exempt items?

Every product carries a tax class such as standard, exempt, or reduced. Tax is calculated per line, only on taxable lines, at your store rate, then summed and rounded to the cent once. For a tax-exempt customer like a reseller with a valid certificate, you flag the whole sale exempt and capture the certificate number, so the paperwork exists if you are ever asked for it.

What happens when a customer returns something?

You look up the original sale by receipt number and issue a refund as a new, linked record. It reverses the exact tax and tender from the original, adds the item back to inventory, and appears on your Z-report as a refund. The original sale is never edited or deleted, so the day still reconciles.

Does it handle cash, or only cards?

Both, including split tenders on one sale. A cashier opens a drawer session with a counted float, the system tracks cash sales, refunds, and payouts through the shift, and at close it shows expected cash versus what you counted and logs any over or short. That daily reconciliation is the line between a real POS and a card-only toy.

How do I get off my current POS's per-terminal fees and subdomain?

You describe the register, catalog, tax classes, and reports you want, and ybuild builds and hosts the running app on your own domain. Your products, prices, and sales history live in a managed database that is yours, not locked inside a vendor terminal, and there is no per-register rent for the privilege of ringing a sale.

Sources

Build this for your business

Describe it, go live on your own domain in one pass — hosted, full-stack, no server. Free to start.

Start building free →
Related on ybuild
retail & local shopsSMB back-office Payments & BillingManaged DatabaseCustom Domain Hosting CRUD AppDatabase SchemaFull-Stack App
Related scenarios
Build an Appointment App for Your SpaBuild a Booking App for a Dental ClinicBuild a Booking App for Your SalonBooking App for Tutors: Recurring Lessons, Prepaid Hours & No-Show ControlBookkeeping App for Small BusinessCRM for Law Firms
Build your own app
Free · no card
Start free →