About this software
About POSMaster - Point of sales system - POS
POSMaster is a Laravel 12 point-of-sale and inventory system for shops and multi-branch stores. It handles barcode/QR scanning (USB, Bluetooth or camera), offline sales that sync when the connection returns, product variants, multi-unit selling (piece/box/kg), stock transfers between branches, purchases with partial payments and returns to suppliers. Selling tools include coupons, gift cards, loyalty points, multi-item promotions, quotations, returns and voids. Fourteen reports (sales, profit & loss, product sales, stock valuation, low stock, customers, suppliers, expenses, payment methods, cashiers, tax, branch comparison, marketing) each have date and branch filters, CSV export and print. A customer display shows cart and total on a second screen; kitchen tickets print without prices for prep staff.
Why POSMaster - Point of sales system - POS
What makes it better
than the alternatives
- 01
Offline POS
- 02
Multi-unit selling
- 03
Kitchen/prep tickets
- 04
Returns to suppliers
- 05
Demo mode
Point of Sale
- Barcode/QR scanning (USB
- Bluetooth scanner or device camera via html5-qrcode)
- Autocomplete product search
- hold and resume sales
- split payments (cash
- card
- bank transfer
- cheque
- other)
- Keyboard shortcuts (F2 search
- F4 customer
- F8 hold
- F9 pay)
- Line discounts
- order discount
- coupon code
- gift card redemption
- loyalty points redemption
- Receipt printing (58 mm
- 80 mm or A4 PDF)
- optional email after every sale
- Customer display (second screen shows cart
- total
- change
- thank-you QR
- promo pictures)
- Preparation tickets (kitchen/bar
- no prices
- notes per line
- turned on per category)
- Offline mode (installable PWA
- syncs sales when connection returns
- review page for differences)
Products & Inventory
- Single products or variants (size
- colour
- etc.); each variant has SKU
- barcode
- cost
- sale price
- stock per branch
- Multi-unit selling (piece
- box of 12
- kg/g); POS and purchase screens let user pick the unit; stock movements record base unit
- Automatic EAN-13 barcode generation
- QR codes
- CSV import/export
- Barcode/QR label printing (A4 sheets or label roll
- configurable layout)
- Categories (with parent/child hierarchy
- optional image
- prep ticket flag)
- brands
- tax rates
- Stock per branch
- stock transfers
- stock adjustments (add/subtract with reason)
- full movement ledger
- Low-stock alerts (product.alert_qty compared to branch_stocks.qty)
Purchasing & Suppliers
- Purchases from suppliers (line editor
- partial payments
- status:
pending/ordered/received/cancelled - Returns to suppliers (lower what you owe or record a refund
- adjusts stock
- writes movement ledger)
- Supplier master (name
- company
- phone
- address
- tax number)
- Purchase PDF and email (Arabic shapes and reads right-to-left)
Sales & Customers
- Sales list (invoice_no
- customer
- branch
- total
- paid
- due
- status:
completed/pending/void - Quotations (convert to sale
- PDF and email)
- Returns (full or partial
- refund or store credit
- adjusts stock)
- Voids (mark sale as void
- restore stock
- record in activity log)
- Customer master (name
- phone
- tax number
- address
- loyalty points
- gift cards)
- Customer detail page (sales history
- loyalty transactions
- gift cards)
Marketing & Loyalty
- Coupons (percentage or fixed
- min order
- max discount
- usage limit
- per-customer limit
- date range)
- Gift cards (code
- balance
- expiry
- used_count
- customer)
- Loyalty points (earn X points per currency unit spent
- redeem Y points for Z discount; configurable in Settings)
- Multi-item promotions (e.g. 'buy 3 drinks
- save 10%'; applies automatically at checkout)
Reports & Analytics
- 14 reports: Sales
- Profit & Loss
- Product Sales
- Stock Valuation
- Low Stock
- Customers
- Suppliers
- Expenses
- Payment Methods
- Cashiers
- Tax
- Branch Comparison
- Marketing (coupons/gift cards/points)
- Each report has date and branch filters
- CSV export
- Charts (Chart.js): daily sales
- top products
- payment methods
- branch comparison
- Dashboard
today/yesterday/monthKPIs - 30-day chart
- recent sales
- low stock items)
Multi-Branch & Warehouses
- Branches (name
- code
- phone
- address
- is_warehouse flag
- is_active)
- Stock per branch (branch_stocks table: branch_id
- product_variant_id
- qty)
- Stock transfers (from_branch_id
- to_branch_id
- status:
pending/in_transit/received/cancelled - Branch switcher in topbar (session('active_branch_id')
- middleware ActiveBranch)
- Warehouse branches (stock only
- no POS sales; is_warehouse = true)
Users & Permissions
- Users (name
- password
- branch_id
- is_active
- must_change_password
- last_login_at)
- Roles (spatie/laravel-permission: name
- permissions array)
- Permission matrix (module.action: products.view|create|edit|delete
- sales.view|create|edit|delete
- etc.)
- Activity log (spatie/laravel-activitylog: log_name
- description
- causer
- subject
- properties
- created_at)
Settings & System
- Business info (name
- phone
- address
- tax number
- logo upload)
- Currency format (symbol
- position
- decimal separator
- thousands separator)
- Tax settings (default tax rate
- tax inclusive/exclusive)
- Document prefixes (invoice
- quotation
- purchase
- adjustment
- transfer)
- Receipt layout (header text
- footer text
- show logo
- show tax number)
- POS & scanner (barcode mode: scan-to-add or scan-to-search
- prep ticket enabled)
- Loyalty rules (points per currency unit
- redemption rate)
- Email (SMTP host
- port
- username
- password
- from address
- from name; test button)
- Backups (manual create with optional password
- upload
- restore
- automatic nightly with retention)
- Demo mode (lock deletes/edits
- nightly reset command
- POS_DEMO_LOCK env flag)
- Languages (English
- French
- Arabic included; Super Admin can upload JSON for more)
Installation & Deployment
- Web installer (requirements check
- folder permissions
- database setup
- admin account
- shop details)
- Docker Compose (app
- MariaDB
- phpMyAdmin; entrypoint.sh runs migrations and seed)
- SQL install files
database/sql/schema.sqland seed.sql; built by pos:sql command) - CLI install (php artisan pos:install --email=… --password=… --name=…)
- Demo data (php artisan migrate:fresh --seed or pos:demo-reset; 100+ products
- sales
- customers)
- Help site
resources/docs/*.md →docs/*.html; built by pos:docs command)
| Language | Version | Framework | Used for | Share of code |
|---|---|---|---|---|
| HTML | — | — | Front-end | 41.3% |
| PHP | — | — | Web, API | 39.2% |
| SQL | — | — | Database | 13.5% |
| JavaScript | — | — | Front-end | 5% |
| CSS | — | — | Styling | 1% |
| Shell | — | — | Scripts | 0.1% |
- Primary language
- PHP 8.2
- Framework
- Laravel 12
- Database
- MySQL 5.7 / MariaDB 10.4
- Authentication
- Laravel session-based authentication with roles and permissions (Spatie Laravel Permission)
- Licence
- Single-site
- Screens
- 47
- Database tables
- 39
- Supported languages
- English, French, Arabic (RTL)
- Browser support
- Modern browsers (Chrome, Firefox, Safari, Edge)
| Minimum | Recommended | |
|---|---|---|
| CPU | 1 vCPU | 2 vCPU |
| RAM | 1 GB RAM / 5 GB storage | 2 GB RAM / 10 GB storage |
| OS | PHP 8.2+, Composer 2, Node.js 18+ (for build), MySQL 5.7+ or MariaDB 10.4+ | PHP 8.2+, Composer 2, Node.js 18+ (for build), MySQL 5.7+ or MariaDB 10.4+ |
| Est. monthly hosting | $10 | $10 |
1. Upload the `laravel-project` folder contents to your web root 2. Point the document root to `public/` 3. Create a MySQL database and user 4. Visit `http://yourdomain.com` and follow the web installer 5. Set folder permissions: `storage/` and `bootstrap/cache/` writable
```bash
sudo apt update && sudo apt install -y php8.2 php8.2-{cli,fpm,mysql,mbstring,xml,curl,zip,gd,bcmath} mysql-server nginx composer
git clone <repo> posmaster && cd posmaster/laravel-project
composer install --no-dev -o
cp .env.example .env
php artisan key:generate
# Edit .env with database credentials
php artisan migrate --force
php artisan db:seed --class=BaseSeeder
npm install && npm run build
sudo chown -R www-data:www-data storage bootstrap/cache
# Configure Nginx to serve public/ folder
``````bash cd POSMaster-v1.2.0 cp .env.docker.example .env # Edit .env: set POS_DB_PASSWORD and POS_DB_ROOT_PASSWORD docker compose up -d --build docker compose exec -u www-data app php artisan migrate --seed # Access at http://localhost:8000 ```
```bash cd laravel-project composer install npm install cp .env.example .env php artisan key:generate php artisan pos:install php artisan serve & npm run dev # Open http://localhost:8000 ```
Quality report
Manually reviewedHow to read the quality report
What this is. Every project on Vibe96 goes through an automated audit of its source code before a reviewer in Dubai checks it by hand. The score is out of 100; 75 is the minimum to be listed, and any single failing check blocks a listing regardless of the score.
- Security
- No real credentials in the code, every data-changing route protected, admin areas role-gated, no SQL built from user input.
- Code structure
- A developer can navigate and extend it: clear module boundaries, no giant files, little copy-paste.
- Docs & completeness
- The setup guide, example config, schema and required files the builder committed to are actually in the archive.
- Dependency health
- Packages pinned, no known critical vulnerabilities, no abandoned libraries in production paths.
- Build & deploy
- A clean machine can restore, build and start it by following the shipped instructions.
Warnings are problems that didn't block the listing; they stay visible here until a later version clears them. The audit reads the code — it does not run it — so always try the live demo before you buy. Lines of code are counted from the same audited archive.
Reviewer notes (4 minor)
Dependencies mostly current; a few outdated packages but no known critical vulnerabilities; strong auth guards on all routes; minor ownership gaps on read endpoints; weak default passwords in docker example and committed .env with app_key; moderate code duplication and some oversized files; structure generally sound but refactoring needed; multiple unscoped deletes, missing indexes on foreign keys, and raw sql concatenation risks. None of these stop the software from working; the developer has been told and improvements come in a future update.
Versions & updates
No updates yet. New versions appear here with a changelog.
Buyers receive updates free for 1 year.
What you get
- </>Full source codeThe complete audited source, delivered as a download from your account. No obfuscation.
- ▤DocumentationSetup guide, architecture notes, CLAUDE.md and AGENTS.md.
- ↻One year of updatesEvery new version the builder publishes, free for 12 months.
- ♧30 days of supportInstallation and defect support through Vibe96 tickets.