Smart Billing.
Smarter Inventory.
RFID-Powered Jewellery Management.
A complete retail system for Indian jewellers — counter billing, metal-rate-aware pricing, RFID stock control, GST reporting, multi-branch accounting and a full audit trail. Running on ordinary shared hosting, with no servers to manage.
Everything, in one place
What the system does, how each module works, the complete feature list, a working walkthrough of the interface, the quality evidence behind it, and an honest list of what is still to come.
Not another billing app with jewellery colours
Most jewellery software is a generic POS with a product field for "weight". This system was written the other way round — the jewellery comes first: metal rate, purity, wastage, making charges, RFID tag and GST rule are first-class data, and everything else is built on top of them.
◈RFID-native stock
Every piece can carry a UHF tag. Batch printing, binding to a SKU, scan sessions with a manifest, and a lifecycle of active → lost → retired → reissue — with the full history kept. Stock verification becomes a walk-past, not a weekend of counting.
₹Rate-aware to the paise
Metal rates are effective-dated and append-only — the rate is locked at the moment a bill is created, so a rate change mid-transaction can never rewrite an invoice. Valuation runs in paise with purity-adjusted fineness, not rounded rupees.
⌂Runs on shared hosting
No Redis, no queue workers, no Node SSR, no Docker, no WebSockets. Cron plus a PHP app plus MariaDB — deployable on cPanel, the way Indian retail sites are actually hosted. Zero external CDN requests, enforced by a test.
⛨Guards, not just forms
33 permissions across five fixed roles, enforced in middleware before the controller runs. The last owner can't be deleted, a super-admin flag is never accepted from a form, and no UI can grant a capability the code doesn't already have.
≡An honest audit trail
An append-only audit table — rows physically throw on update or delete. Every bill, adjustment, rate change and login is attributable to a person and a branch. Nightly zipped backups of database and files, restorable from the settings screen.
⚖GST built in, not bolted on
Statutory invoice fields, HSN-bucketed GSTR-1 and GSTR-3B working sheets as CSV and PDF, gapless financial-year numbering, credit notes that put stock back and correct the account. Reports a CA can actually file from.
Thirteen modules, 52 sections, all delivered
The system is specified section by section and every section is built. Each module below lists what it does at the counter and in the back office — this is the functionality a jewellery business gets on day one.
1 · Dashboard
§1.1–1.3A role-aware home screen: what each user sees depends on their job, and every figure reads live from the tables the rest of the system writes — no stale summaries.
- Today's sales, stock on hand, bound tags, party dues
- Five alert types incl. low stock & flagged scans
- Shortcuts that check permission before showing
2 · Products & Catalogue
§2.1–2.5Product master with variants and images, hierarchical categories that refuse to become cyclic, metal and purity as closed enums with fineness as data, and two pricing modes.
- Multi-image upload, per-variant SKU/barcode/price
- HSN codes, making %, wastage, purity (22K/18K…)
- Category reorder & drag-order maintenance
3 · Inventory & Stock
§3.1–3.5An append-only stock ledger — nothing is ever overwritten — plus per-location transfers, physical counts with variance reason codes and purity-adjusted valuation.
- Stock register by branch/location/cut
- Manual adjust with reason codes
- Count sheets: create → add lines → post/cancel
4 · RFID Tagging
§4.1–4.5The module other jewellery software doesn't have: tag batches, EPC binding, scan sessions with manifests, printable label sheets and a full tag lifecycle.
- Batch create/close/print, bind & unbind
- Scan session: reads → complete/abort
- Found / lost / retire / reissue with history
5 · Billing / POS
§5.1–5.6The counter. Open a shift with a float, build a cart on the server, hold and resume bills, split payments, run exchanges, then print statutory or thermal output.
- Counter open/close with counted-cash variance
- Hold/resume, quick customer, barcode & RFID search
- Exchange & return against the original bill
6 · Sales & Invoices
§6.1–6.4Every invoice numbered gaplessly per financial year per branch, rendered to PDF, with registers cut by day, counter and shift — and credit notes for returns.
- GST PDF, 80 mm thermal and A5 print
- Day book / counter / shift registers
- Credit note with reason codes & withdrawal
7 · Customers
§7.1–7.4Customer profiles with GSTIN-derived party type, purchase history read from actual bills, advances and dues, printable statements and a loyalty scheme.
- Ledger entries & closing-balance statement
- Earn / redeem loyalty points at the till
- Party past 30 days surfaces on the dashboard
8 · Suppliers
§8.1–8.3Supplier profiles and a payable ledger where advances are kept as their own entry type — so ageing can never count the same rupee twice.
- Payable ageing without double-counting
- Period-based printable statements
- Manual entries with audit attribution
9 · Purchases
§9.1–9.4Procurement as a state machine: draft → approved → placed → received. Goods receipts are the only place inbound stock moves, and metal bookings lock a rate for a period.
- PO line editing, approval and placement
- GRN with over/short variance explanation
- Metal bookings create/settle/cancel
10 · Metal Rates
§10.1–10.3Effective-dated, append-only rates — no retroactive overwrite ever. Live screen, history, audited manual override and an all-or-nothing CSV import.
- Per metal / purity, effective from a date
- History with no retroactive edits
- CSV import: template, validate, all-or-nothing
11 · Reports
§11.1–11.3Sales, stock, purchases and party ageing as CSV, plus GSTR-1 and GSTR-3B working sheets bucketed by HSN and rate — exportable and printable.
- 4 report families, CSV export each
- GSTR-1 & GSTR-3B as CSV and PDF
- HSN + rate bucketing for filing
12 · Analytics
§12.1–12.2Period-over-period comparison with a least-squares seven-day projection labelled as a projection, plus fast/slow/dead stock and margin against lifetime cost.
- Sales trend vs previous window
- Fast / slow / dead stock classification
- Margin on lifetime weighted-average cost
13 · Settings & Admin
§13.1–13.5Business profile and GST, branches and counters, users with a read-only role matrix, tenancy scoping, a filterable audit log and tenant backups with restore.
- Branch CRUD with own invoice prefixes
- Users: create/edit/disable, last-owner guard
- Backup create / download / restore
Every feature, plainly listed
203 endpoints in total — 184 web across 13 modules, 13 authentication endpoints and 6 REST API endpoints. Below is what a user actually meets on screen, grouped the way they experience it.
| Area | Routes | What you can do |
|---|---|---|
| Dashboard | 2 | Role-aware cards (today's sales, stock on hand, bound tags, party dues); alerts for low stock, flagged RFID scans, bindable tags, parties not seen in 30 days and bookings expiring within a week; shortcuts that check both permission and route existence. |
| Catalogue | 21 | Create/edit/delete products; multi-image upload; variant rows each with own SKU, barcode and price; category create, edit, delete and reorder; metal rate create, CSV import with template download, and effective-dated history. |
| Inventory | 13 | Stock screen with location cut; movement register; manual adjustment and branch-transfer forms; full count workflow — create sheet, add lines, post or cancel — with independent piece and weight tallies. |
| RFID | 22 | Tag batches: create, close, print, label sheet; per-tag bind, unbind, mark found, mark lost, reissue; scan sessions: start, add reads, complete, abort, view reads; bindable-tag picker for the counter. |
| Billing / POS | 18 | Counter open with opening float and close with counted cash and variance; till with line add/remove; barcode & RFID search; quick customer create; hold, resume and clear; exchange panel; post bill and reprint. |
| Sales & returns | 13 | Invoice register with day/counter/shift cuts; invoice detail; PDF download; 80 mm thermal and A5 print; return creation against a specific bill; credit note detail, print and cancel. |
| Parties | 18 | Customer and supplier CRUD; manual ledger entries; printable statement with closing balance; purchase history read straight from posted bills; customer picker live on the till. |
| Purchases | 33 | Purchase orders draft → approve → place → cancel with line-level editing; goods receipts with over/short variance explanation; metal bookings create/settle/cancel; purchase invoices post, settle and cancel with per-line returns. |
| Reports | 15 | Sales, stock, purchases and parties — each with CSV export — plus GSTR-1 and GSTR-3B as CSV and PDF, bucketed by HSN and tax rate. |
| Analytics | 2 | Sales trend with previous-window comparison and a labelled seven-day projection; inventory fast/slow/dead classification; margin against lifetime weighted-average cost. |
| Settings | 24 | Business profile and GST details; branch CRUD with own invoice prefixes; user CRUD with last-owner and last-branch guards; read-only role matrix; filterable audit log; personal access API tokens; backup create, download, restore and delete. |
| Profile | 3 | Name, email and password change for the signed-in user. |
| Authentication | 13 | Login, logout, forgot password, reset password, email verification, password confirmation, registration. |
| REST API | 6 | Sanctum-token endpoints for products, stock, bills and rates — for integrations, handhelds and future mobile clients. |
Business rules the system enforces for you
⏱State machines
- Counter session must be open before a bill exists — one shift per till
- Closing shows counted cash against expected and records the variance
- Purchase order: draft → approved → placed → received
- Goods receipt posts only with an explained variance
- Credit note is withdrawable: stock returns, account corrected
- RFID batch closes for good; a closed batch refuses a reprint
- Scan session accepts no reads once closed
⚑Guards you can't bypass
- The last active owner can't be deactivated
- Nobody deletes or demotes their own account
- The last branch can't be deleted
- Super-admin status is never accepted from a form
- Payments beyond a supplier's payable are refused
- Advances are a separate entry type, never mixed into ageing
- Rate history cannot be edited retroactively
⇩Outputs you get
- GST invoice PDF with every statutory field
- 80 mm thermal receipt via the browser print dialog
- A5 invoice print
- GSTR-1 and GSTR-3B CSV + PDF
- Sales / stock / purchase / party CSV exports
- Customer & supplier statements with balance
- RFID label sheets and count sheets
- Nightly zipped backup: database + files
Feature checklist
A flat, scannable list of what is in the box today.
The interface, demonstrated
Four working demonstrations of the real screen layouts — the dashboard a manager opens, the till a cashier lives in, the RFID scan a stockroom runs and the report an accountant files. Switch tabs; the animations replay.
Good morning, Priya
Owner · Jaipur — Bapu Bazaar · 02 Oct 2026
Sales — last 7 days today highlighted
Alerts
Bill · Till 1
Customer: Meera Sharma · 98290… · Loyalty 2,140 pts
Scan-to-verify target: < 500 ms per tag. Each read is matched against the batch manifest; anything not expected is flagged for review rather than silently accepted.
GSTR-1 · September 2026
B2B + B2C summary · HSN bucketed · GSTIN 08ABCDE1234F1Z5
| HSN | Description | Taxable value | Rate | CGST | SGST | Total |
|---|---|---|---|---|---|---|
| 7113 | Gold jewellery, 22K | ₹18,42,500 | 3% | ₹55,275 | ₹55,275 | ₹19,53,050 |
| 7113 | Silver articles | ₹1,86,400 | 3% | ₹5,592 | ₹5,592 | ₹1,97,584 |
| 7114 | Gold jewellery, 18K | ₹4,12,900 | 3% | ₹12,387 | ₹12,387 | ₹4,37,674 |
| 7102 | Diamonds, unstudded | ₹6,75,000 | 0.1%+0.1% | ₹675 | ₹675 | ₹6,76,350 |
| 9988 | Making charges (labour) | ₹2,41,600 | 5% | ₹12,080 | ₹12,080 | ₹2,65,760 |
Reconciliation
Proven by tests, not promises
Every milestone from M0 to M9 is built and runnable. The evidence sits in the repository: a PHPUnit suite that covers the state machines, guards and permissions, style checks that stay clean, and a production build that compiles.
M0 Foundation done
Laravel 13 scaffold, toolchain, brand design system, self-hosted fonts, test harness.
M1 Auth & tenancy done
Breeze re-skinned, tenant resolution chain, global scope, role permissions in code.
M2 Catalogue done
Products, variants, images, categories, metal & purity enums, HSN, pricing modes.
M3 Inventory done
Append-only ledger, transfers, adjustments with reasons, count sheets and valuation.
M4 Parties done
Customers and suppliers, ledgers, statements, advances, purchase history, loyalty.
M5 Purchases done
Orders, goods receipts with variance, metal bookings, purchase invoices and settlement.
M6 Rates done
Effective-dated append-only rates, live/history screens, audited overrides, CSV import.
M7 Billing done
Counter sessions, server-held cart, holds, exchange, split payment, thermal & statutory output.
M8 Sales & reports done
Registers, PDF invoices, credit notes, CSV reports, GSTR-1 and GSTR-3B.
M9 Dashboard, backups, hardening done
Role-aware dashboard, five alert types, nightly backups with restore, middleware ordering pinned by tests.
⛨Security posture
- Sanctum API auth; hashed passwords; session hardening
- Content-Security-Policy, HSTS, nosniff on every response
- Permission checked in middleware — before the controller
- Tenant scope is a global query scope, not a request filter
- Backups stored where the web root cannot serve them
- No default credentials: first owner via artisan command
⚙Runs anywhere cheap
- PHP 8.3 + Laravel 13 + MariaDB — nothing exotic
- Blade + Livewire + Alpine + Tailwind, compiled at deploy
- No Redis / queue worker / Node SSR / Docker / WebSockets
- Cron only — no
schedule:workprocess - File cache & session drivers, database queue
- Self-hosted fonts: zero third-party requests
✓Definition of done
- Full suite green — 732 tests, 3,103 assertions
- Laravel Pint style check clean
npm run buildsucceeds, assets committed- No external network request in devtools
- Statutory GST fields verified present
- Middleware order asserted by an automated test
What's next, honestly listed
Nothing below is broken — it is scope that has not been opened yet. These are the capabilities a live jewellery shop will ask for next, ranked by how soon it will be asked for.
High value Loyalty configuration screen
Loyalty is built and working — earn and redeem already run at the till — but the four settings that control it have no screen yet, so switching it on for a shop needs a developer today.
High value Barcode label printing
Products carry barcodes and the till searches on them, but only RFID label sheets can be printed. A jeweller not using RFID still needs adhesive barcode labels at the counter.
High value Offline billing
Billing is refresh-safe — the cart lives on the server — but a dead connection stops sales. A queue that replays transactions when the line returns is the largest remaining engineering item.
Medium Notifications & reminders
Low stock, flagged scans and overdue parties appear as dashboard alerts only. Email/SMS/WhatsApp delivery, birthday and anniversary reminders and due-payment nudges are not wired up yet.
Medium Estimates & quotations
A per-branch estimate prefix is already stored in the schema, but no screen writes it. Quotation-to-bill conversion, expiry and customer acceptance are unimplemented.
Medium GSTR filing integration
GSTR-1 and GSTR-3B are working sheets — CSV and PDF a human files in the portal. Direct IRN e-invoicing and e-way bills are an external integration, not an app feature.
Medium Custom roles
Roles are deliberately fixed in code so no screen can grant a privilege the code doesn't have. A shop wanting "senior cashier — discounts but no reports" would need a permissions editor and a security decision.
Low Languages (Hindi/regional)
Every string in the UI is already wrapped for translation — 2,094 call sites — but no language files exist yet, so everything falls back to English. Adding copy is a content job, not a code job.
Low Repairs & karigar tracking
Present in the original outline, then dropped because no section owned it. Reopening it is a genuine module with its own lifecycle — it needs a spec revision, not a finishing touch.
Different from other jewellery software
Against the two things a jeweller usually evaluates: a generic retail POS with a weight field bolted on, and legacy desktop jewellery packages that need a dedicated machine in the back office.
| Capability | MageTech Jewellery Smart | Typical POS / legacy jewellery software |
|---|---|---|
| RFID stock control | Native — batches, scan sessions, tag lifecycle, label sheets | Not available, or a third-party add-on |
| Metal rate handling | Effective-dated, append-only, locked at bill time, CSV import | A price list you overwrite; no history guarantee |
| Purity & fineness maths | Purity is an enum with fineness as data; valuation in paise | Weight × a single rate, rounded |
| Stock ledger | Append-only with reason codes; nothing overwritten | Current quantity only, edited in place |
| GST output | GSTR-1 & 3B CSV + PDF, HSN bucketed, gapless numbering | Invoice print; reports someone retypes |
| Deployment | Ordinary shared hosting / cPanel — no server to run | Desktop install, or a server you host yourself |
| Multi-branch & multi-tenant | Built in — per-branch prefixes, per-branch counters, scoped data | Separate databases per shop, or one flat file |
| Access control | 33 permissions × 5 roles, enforced in middleware | Admin/user split, or rights editable in the UI |
| Audit trail | Append-only table — rows throw on update/delete | A log screen that can be cleared |
| Backups | Nightly zipped DB + files, restorable from the UI | Manual file copy, if remembered |
| Test evidence | 732 automated tests, 3,103 assertions, CI-green | Unquantified; release notes say "improved" |
| Integration | Sanctum REST API + API token screen | Proprietary, or none |
| Ongoing cost | Your hosting, your database, your code | Per-seat / per-branch licence or SaaS rent |
| Offline billing | Not yet — named as an open gap | Desktop packages work with no line |
The stack, chosen for constraints
Every dependency was selected against one requirement: it has to run reliably on shared hosting with no long-running processes, be maintainable by a small team, and cost nothing at the infrastructure layer.
▣Backend
- Laravel 13 on PHP 8.3
- MariaDB / MySQL · utf8mb4 · paise-as-integer money
- Laravel Breeze auth, fully re-skinned
- Sanctum for REST API tokens
- Dompdf for statutory & report PDFs
- Database queue, file cache and session drivers
- Hand-written tenancy, permissions, audit, backup
◈Frontend
- Blade templates + Livewire 3.8 for interactivity
- Alpine.js for small client behaviours
- Tailwind CSS 4 with brand colour namespaces
- Chart.js for analytics charts
- Figtree + Playfair Display, self-hosted
- Vite build, committed assets — no build at deploy
- Zero external CDN or font requests
⚒Engineering
- PHPUnit 12 — 732 tests, 3,103 assertions
- Laravel Pint for style, Collision for readable failures
- 48 migrations, 39 models, 47 controllers
- 143 Blade views, 184 web routes
- Middleware order pinned by a dedicated test
- Explicitly out of scope: Redis, Docker, JVM, PostgreSQL, WebSockets
- Spec:
docs/REQUIREMENTS.mdv1.3
MageTech