Live app is v2.1.0. Planned work sits at the top; released versions follow. Deploy internals are omitted here.
Coming next
Added
Product custom code: shops can assign a product identification code (uppercase letters, 0–9, `/`, `-`) when adding/editing products. Searchable from the product index.
Product shipping cost: optional per-product shipping cost field (for shop records; not shown to customers).
Product margin calculator: entering cost price and margin % auto-calculates selling price (and vice versa) live via Alpine.js — no new database column needed.
Category attribute cards: product form now shows attribute fields grouped by category in a card, so owners see exactly what fields each category enables.
Public product catalog: shops with a public slug can enable a shareable `/s/{slug}/catalog` page listing all active products with name, price, and description. Toggle in Shop Settings → Public page.
Catalog "Browse" button: shop public page shows a "Browse catalog →" CTA when catalog is enabled.
Malayalam language: added `ml` (Malayalam) to the language selector in Shop Settings → Details and during shop registration (step 3). Locale is stored on the shop and passed through `ShopRegistration`.
Financials nav group: venue/chain "Books" and "Expenses" nav entries merged into a collapsible Financials group with sub-links "Cash book / Ledger" and "Expenses".
Accounting mode in Park Settings: Books mode selector moved from the Cash book page into Park Settings with clear radio cards ("Single-entry cash book" vs "Double-entry ledger") and a warning that changing mode does not migrate historical entries.
Journal entries tab: double-entry mode shows a "Journal entries" tab stub on the Cash book page (coming soon).
Account & Subscription at nav bottom: for single-owner retail shops, the account/subscription link now appears at the very bottom of the sidebar nav (after the shop section) instead of at the top, making the shop navigation primary.
Changed
Directory copy: Groups is now Businesses (Retail, Venue, or Chain). Product catalog groups, tax groups, and database `parks` are unchanged.
Shorter nav: drop New business / Add shop from the sidebar; park Settings nests payment methods; Staff (not Team); Rent, Upgrades, Join requests.
Invoice title: "New service invoice" is now "New Invoice" with a service/product type selector; type is shown on the invoice detail page.
Invoices: Edit button now available for sent and paid invoices (editing resets the invoice to draft for re-sending). Void section is a prominent card instead of a small text link.
Invoice creation: payment method checkboxes removed from create/edit form — payment methods are now selected only when marking the invoice as sent (on the invoice detail page).
Retail single-owner nav: removed the duplicate park navigation section — retail shop owners now land directly on their shop dashboard and see a single clean menu. Upgrade to chain remains accessible via Account & Subscription at the bottom of the nav.
Sidebar branding: sidebar header now shows shop logo + shop name (or park name) instead of the hardcoded "Hirah Shop" title. "Powered by Hirah Shop" link appears at the very bottom of the sidebar. Locale switcher removed from sidebar footer (language is in Shop Settings → Details).
Catalog settings UI: category selector in Shop Settings → Catalog rebuilt as category cards showing the category name, "Primary" badge for the shop's primary category, and the attribute fields it unlocks. "Load starter catalog" button removed (access via Products → Pick catalog items).
Clothing/Boutique merge: "Clothing / Boutique" category merged into "Retail & Clothing" (renamed "Retail / Clothing") via migration — both had identical attributes (size, color, material). The old slug `clothing-boutique` is deactivated; shops, registrations, attribute defs, and product templates are reassigned to the canonical `retail` category.
Cash book retitled: "Books" page heading is now "Cash Book / Ledger"; page title updated to "Financials".
Fixed
Create account email field shows a border again. Sign in / Create account / other `brand` submit buttons stay Hirah purple when the marketing layout (or a missing shop theme variable) would have left them transparent.
Missed sales is now Adjust sales; shop owners/managers can add a date or remove an adjustment (POS bills are not deleted).
Park owners see today and week totals per shop only — not POS, bills, or till. Venue park logins cannot open tenant shop POS. Park daily emails list shop totals only.
Park Live page (`/p/{slug}`) with gallery and social links; shops add Facebook / Instagram / YouTube / website on their public page.
Tax rates removed from park Settings (country slabs at signup still apply on products).
Retail single-owner park no longer shows park customer list (park customers only apply to multi-tenant venues/chains). `/park/customers` returns 403 for single-owner parks.
Upgrade prompt moved from main dashboard banner to park Settings → Subscription section.
Planned
Hide PHP / Plesk version banners at the host layer (`expose_php Off`)
WhatsApp device share / invoice messaging (beyond current receipt templates)
SaaS billing auto-debit cutover after a successful test invoice
Multi-currency checkout (plans remain INR at launch)
Arabic / RTL
Native mobile apps (REST API is the foundation)
2.1.0
Platform mail, shop calendar, Leads vs Clients, sales staff, unread notices, and venue/chain books.
Added
Denser marketing hero: two-column first view with Create account card and till photo
Shop dashboard month calendar and Week / Month / Year cash-flow chips (same totals as reports)
Encrypted platform SMTP in superadmin Mail; test send; Laravel mail uses it after a successful test, otherwise `.env`
Client show lists business → shops → staff → subscription
Platform sales role (Leads, Clients, read-only directory); superadmin creates staff on Platform → Staff
Unread notices badge and once-per-session popup (Acknowledge / Mark all read); Festival and Meeting types
Venue and chain expense categories, expense/ledger delete, optional double-entry lines, monthly rent dues
Bulk user remove (one letter confirm; skips owners of live businesses)
Payment-method usage drawer and reassign-then-remove (force hide remains)
Changed
Reports and dashboard include missed-sales entries with till sales
Superadmin nav grouped: Overview, Sales, Directory, Billing, Support, Platform (“Businesses” not Parks)
POS product tiles: `touch-manipulation`, no tap scale, cached Alpine list; shift report uses counter name instead of raw id
Fixed
Payment methods that were in use looked like “remove did nothing” (they only hid)
Changelog no longer names tenant businesses
Security
Removed leftover `public/setup-once.php` and `public/test.php`
CSRF exceptions remain Razorpay webhook only; bulk-remove uses its own rate limit
2.0.0
Catalog-aware shop, Razorpay invoices, shop REST API, and English/Hindi.
Added
Shop menu groups (`product_groups`) and product kind (product vs service)
Add products from starter catalog or a blank form with kind, group, and category attributes
Invoice lines can pick a catalog item or stay manual (`invoice_items.product_id`)
POS tabs by group, product/service filter, custom line, and full-catalog search
Owner cash counter CRUD on Settings → POS; shift-open only selects an existing counter
Settings split into short pages with a floating save bar; shop nav leads with Dashboard → POS → Products
Razorpay Checkout on public invoices (and optional POS Pay online); bank / UPI / paste-link stay offline
Shop API keys and `/api/v1` products, groups, sales, invoices, customers (Bearer `hshop_…`, rate-limited)
English / Hindi locale files, user + shop locale, switcher on shop / POS / invoice / settings
Changed
Import stock is a Products action, not a top-level nav item
Park documents and notices show only for venue groups
Group kinds on parks (`retail`, `venue`, `chain`) with signup, admin create, and billing labels (plan codes unchanged)
Venue accountant role: read-only sales, rent received, expenses, and a month cash book (`park_ledger_entries`)
Park team invite for manager or accountant
Standard shop categories grouped at signup — existing shops keep their category
Country tax catalog at signup: GST, VAT, and sales-tax slabs including Nil rated and Exempt; parks can add their own rates
Superadmin Users and Shops screens: search, deactivate logins, reset passwords, remove unwanted users, suspend outlets, and toggle POS
Park edit includes owner password reset and payment-method add / hide / remove
Faster live POS: tap products then Pay (cart only if qty needs changing); receipt paper size (58mm / 80mm / A4) is chosen on the next screen on phones
Express / Normal POS switch on the till (shop default in Settings): Express for live ticketing; Normal for customer name/phone, shop offer, line and bill discounts
Multiple cash counters when opening a shift (default Main Counter; add Counter 2+)
Warning if the same staff login is already open on another device or POS
Park Customers list (park visitors / loyalty), kept separate from each shop's POS customers
Park Team, digital onboarding documents, and Notices & offers
Public marketing pages for Retail, Venues, and Chain (old `/for/parks`, `/for/franchises`, `/for/shops` redirect)
Live paid/in-use groups cannot be deleted or have sales wiped until a superadmin allows deletion for 15 minutes
Changed
Chain outlets inherit the group activity category; retail stays one shop until upgraded to chain
Admin New Group / Manage Groups copy; park nav uses Shop / Shops / Outlets by kind
Fixed
POS checkout retries invoice allocation once if a late unique-constraint race occurs
Plans copy aimed at global launch (Retail shop / Chain stores / Venue) without changing prices or existing subscriptions
Park / mall owners can hide or remove payment methods (WAF-safe POST; used methods hide instead of failing)
Subscription billing sync failures no longer 500 POS; expired or past-due shops get a redirect (or 402 JSON) instead of a crash
1.8.0
Release G — SaaS clients/billing, onboarding, design alignment, public shop pages, HR, expenses, stock import.
Added
Billing plans + subscriptions + trial (`billing_plans`, `subscriptions`, `subscription_payments`); seed Single / Franchise / Park plans
Superadmin Clients panel (auto-created for parks on signup/admin create) and Pricing Plans CRUD
Trial banners and past-due/suspended soft lock on POS checkout and product/staff writes
Public `/pricing` driven from live plans
Multi-step onboarding wizard: Entity → Shop type → Details
Public shop business profile at `/s/{slug}` (banner, offer, gallery, products, contact) + Settings editor
Shop Expenses CRUD with shop-scoped categories (`shop_expense_categories`)
Outlet upgrade requests: Business (`single_owner`) owners can request multi-outlet; platform approves or rejects
Admin Outlet Upgrades queue (`/admin/upgrades`) with pending count on platform dashboard
Owner upgrade page (`/park/upgrade`), dashboard CTA, and settings link
Gate: Business groups cannot Add Outlet until approved (type becomes Franchise)
Changed
Existing Business parks that already had more than one shop are grandfathered to Franchise on migrate
1.6.3
Notes
Production deploy release; same fixes as 1.6.2.
1.6.2
QA Round-4 critical/high fixes.
Fixed
POS server-side validation: reject discount > line total, oversell when inventory tracked, and zero/negative sale totals (F1–F3)
Registration approval: link `shop_id` on platform approve; park UI shows platform-pending + park-pending queues; park approve gated to own park / `pending_park`
Approved-but-locked-out applicants: dashboard no longer redirects owners to unapproved shops (waits for park approval + membership grant)
Park approve grants full owner `ShopUser` permissions (discount/void)
Z-report cash-up uses frozen shift-close `system_amount`/`variance` for closed shifts; voiding sales on a closed shift is blocked
`receipt_auto_print` can be turned off (hidden `0` sentinel); receipt paper whitelist on display
Receipt shows change due on overpayment
Stronger early `X-Powered-By` removal in SecurityHeaders