A modern, fast Point of Sale for ERPNext
Built for speed, touch screens, and real retail workflows.
ERPNext's built-in POS is functional but limited. POS Prime is a complete replacement built from the ground up with Vue 3, designed for businesses that need a fast, reliable, and modern point of sale.
- Fuzzy item search with barcode scanning — typos, partial matches, and out-of-order words all work
- Real-time stock validation so you never sell what you don't have
- Loyalty points — redeem points at checkout with live balance deduction
- Store credit — automatically detects customer credit from returns/overpayments, apply at checkout with double-spend prevention
- Partial payments & credit limits — split pay, pay later, with automatic credit limit enforcement
- Pricing rule discounts — promo badges, strikethrough prices, discount labels, coupon codes, and free item rules
- Resizable cart panel — drag to resize the cart column, persisted across sessions
- Self-checkout kiosk mode for customer-facing touchscreens
- Customer pole display support (screen-based and VFD serial) with discount indicators
- Keyboard shortcuts (F1-F10) for lightning-fast checkout
- Desk mode — use POS inside Frappe Desk at
/app/pos-terminalor standalone at/pos-prime - Quick customer creation — create customers inline with dynamic form fields, no page navigation
- Fullscreen toggle — maximize/minimize POS with one click
- i18n ready — all UI strings wrapped for translation, RTL layout support
- Works with ERPNext's inventory, taxes, and accounting - no separate system
POS Prime does not add custom fields, custom doctypes, or modify any existing ERPNext schema. It works entirely with ERPNext's standard doctypes:
- POS Profile - your existing POS configuration
- POS Opening Entry - standard shift management
- POS Invoice - native ERPNext invoices, fully compatible with consolidation and accounting
- Item, Customer, Item Price, Bin - reads directly from your existing data
- Item Tax Template, Sales Taxes and Charges - uses your existing tax setup
Why this matters:
- Upgrade ERPNext freely - POS Prime will never block or break your upgrades
- Uninstall cleanly - remove POS Prime and nothing changes in your ERPNext data
- No data lock-in - every invoice POS Prime creates is a standard POS Invoice, visible in Desk and reports
- Works alongside ERPNext's built-in POS - use both if you want
Browse items by category with stock quantity badges, search by name or barcode, and add to cart with a single tap. Dark mode shown.
Full cart sidebar with quantity controls, invoice discount, coupon code field, and real-time totals.
Payment dialog with grand total, multiple payment method tabs (Cash, Credit Card, Bank Draft, Cheque), quick amount shortcuts, and Complete Payment button.
Receipt screen showing "Payment Successful" with itemized invoice details, Print and New Order action buttons.
Searchable invoice list with status filter tabs (All, Paid, Return, Draft). Select an invoice to view items, payments, totals, and Print/Return actions.
Return Items dialog with customer info, item search, quantity and amount adjustment, refund method selection, and Process Return button.
Customer list with selected profile showing outstanding balance, contact details, and recent POS invoice history.
Customer Display panel in the sidebar with "Open Display Window" and "Connect VFD" options for setting up a customer-facing screen.
Customer Display popup window showing the Welcome screen with phone number numpad entry for loyalty point lookup.
Full-screen customer-facing display showing company branding, live cart items with quantities and prices, subtotal, and grand total.
Welcome screen with company logo, greeting message, phone number input with numpad, and Submit button.
Cash Denomination Count dialog with Notes and Coins sections, quantity inputs per denomination, running totals, and Clear All/Apply buttons.
- Fuzzy item search powered by Fuse.js — typos, partial matches, and out-of-order words all work
- Virtual scrolling item grid for smooth performance with large catalogs (powered by @tanstack/vue-virtual)
- Item grid with images, categories, and stock indicators
- Barcode scanner support (USB/Bluetooth HID scanners)
- Keyboard shortcuts (F1-F10) for lightning-fast checkout — works even inside input fields
- Cart with inline quantity, discount, and price controls
- Multiple payment methods (Cash, Card, Bank Draft, Cheque)
- Split payments across multiple methods
- Partial payments with confirmation dialog (requires POS Profile
Allow Partial Payment) - Credit limit enforcement — displays outstanding, credit limit, and available credit; blocks transactions that would exceed the limit
- Loyalty points redemption — apply points at checkout with live grand total update
- Coupon code support — validates and applies coupon-based pricing rules (Price and Product discounts)
- Invoice-level and item-level discounts
- Pricing rule engine — applies non-coupon and coupon-based rules with smart single-rule selection per item
- Free item rules (Buy X Get Y) — automatically adds free items from Product discount pricing rules
- Tax calculation with Item Tax Templates
- POS returns and refunds
- Order history with search and filters
- Print and reprint invoices
- Email receipts with PDF attachment
- Hold and resume orders (with delete confirmation)
- Auto-fetch serial numbers (FIFO)
- Product Bundle support with computed stock availability
- Cash denomination calculator for opening/closing shifts (21 currencies supported)
- Resizable cart panel — drag the handle between items and cart to adjust width, persisted in localStorage
- Collapsible item categories sidebar — toggle visibility, preference saved across sessions
- Correct rounding support — uses ERPNext's
rounded_totalfor payment calculations, change, and display - Fullscreen toggle — maximize/minimize the POS view with a single click
- Dark/Light mode follows ERPNext user theme preference
- Favicon and app logo from Website Settings
- Access POS directly from Frappe Desk at
/app/pos-terminal— no need to leave the desk - Standalone mode at
/pos-primestill works as before - Auto-detects Frappe version and uses the correct desk URL prefix (
/app/for v14-v15,/desk/for v16+) - In-memory routing in desk mode — no URL changes, seamless navigation within the desk iframe
- Real-time pricing rule preview — promo badge, strikethrough original price, discount percentage/amount badges
- Supports all ERPNext pricing rule types: Discount %, Discount Amount, Fixed Rate
- Coupon code pricing rules — Price discounts and Product discounts (free items) via coupon codes
- Non-coupon pricing rules — automatic item-level and transaction-level rule application
- Free item rules (Buy X Get Y) — with deduplication across ERPNext versions
- Smart rule selection — best single rule per category (coupon preferred, then highest priority)
- Transaction-level promo discounts shown in cart summary
- Customer Pole Display mirrors discount indicators (Promo badge, strikethrough, discount badge)
- Automatically detects available store credit from customer returns and overpayments
- GL-based credit calculation with unconsolidated POS Invoice tracking for double-spend prevention
- Apply partial or full store credit at checkout with editable amount input
- Server-side re-validation at submit time — caps to actual available credit
- Works across multiple POS terminals and shifts for the same company
- V14: works without any POS Profile setting; V15/V16: requires
Allow Partial Paymentenabled - Credit consumption tracked via
outstanding_amounton unconsolidated POS Invoices
- Automatic loyalty point balance display on customer selector and payment dialog
- Redeem points at checkout — checkbox auto-applies full balance, or enter custom amount
- Live grand total update showing original price, redemption deduction, and effective total
- Points × conversion factor calculation shown inline
- Reads from ERPNext's standard Loyalty Program and Loyalty Point Entry doctypes
- Allow zero-payment or partial-payment invoices when
Allow Partial Paymentis enabled on POS Profile - Confirmation dialog before processing partial payments showing paid vs outstanding
- Customer outstanding balance aggregated from both Sales Invoices and POS Invoices
- Remaining credit limit displayed in payment header
- Credit limit exceeded warning blocks submission when new outstanding would breach the limit
- Invoices created with correct outstanding amount and Unpaid status
- All UI strings wrapped with
__()translation function for Frappe's translation system - RTL-compatible layout using CSS logical properties (
border-e,end-0, etc.) - RTL auto-detection from Frappe boot language data
- Accessible dialogs with
role="dialog",aria-modal,aria-label, and Escape key handling
- Fullscreen kiosk mode for dedicated touchscreens
- Barcode scanning + manual item code entry
- Phone number lookup for customer loyalty
- Card and cash payment flows
- Auto-reset after transaction completes
- Idle timeout returns to welcome screen
- Navigation prevention (no accidental exits)
- Real-time cart mirroring on a second screen
- Company branding with logo
- Phone number entry for loyalty points
- VFD serial display support
- Multi-session broadcast
- Slide-in customer detail panel with editable contact fields (email, mobile, loyalty program) — saves on blur
- Quick stats badges: loyalty points, outstanding balance, credit limit, store credit
- Primary address display
- Recent POS invoice history with status badges (last 20 invoices)
- Open full customer form in Desk with one click
- Loyalty points balance and outstanding badges on customer selector
- Quick customer search with phone number normalization — flexible matching with/without country code
- Create new customers inline without leaving the POS
- Dynamic form fields rendered from Customer doctype quick_entry metadata
- Collapsible contact and address sections
- Custom field support (e.g., NIC Number)
- Auto-selects newly created customer after creation
- Batch selection with qty and expiry dates
- Manual serial number entry or scan
- Auto-fetch serial numbers by quantity (FIFO order)
- Batch-filtered serial number selection
- Automatic detection of Product Bundle items
- Computed availability based on component stock
- Visual "Bundle" badge on item cards
- Component-level stock validation on invoice submission
- Email invoice PDF to customer from receipt screen or order detail
- Pre-fills customer email when available
- Custom message support
- Uses POS Profile print format for PDF attachment
- Automatically follows ERPNext user's Dark/Light/Automatic theme preference
- App logo from Website Settings (falls back to Company logo)
- Favicon from Website Settings
- App name from Website Settings shown in browser tab
| Shortcut | Action |
|---|---|
| F1 or / | Focus item search |
| F2 | Toggle held orders |
| F3 or F9 | Open payment |
| F4 or Ctrl+S | Hold current order |
| F5 or Ctrl+O | Open past orders |
| F8 or Ctrl+N | New order |
| F10 | Toggle returns |
| Ctrl+Enter | Open payment |
| Escape | Close current dialog |
All F-key shortcuts work globally, even when typing in input fields.
POS Prime reads 38 of 40 meaningful fields from the standard POS Profile doctype (95% coverage). The following fields are intentionally not used:
| Field | Reason |
|---|---|
disabled |
Filtered at query level when listing available profiles; not needed at runtime |
country |
Read-only field auto-fetched from Company by Frappe; not directly consumed |
All 12 layout fields (Section Break, Column Break) are structural and only relevant to the Desk form UI.
| ERPNext Version | Frappe Version | Status |
|---|---|---|
| v14 | v14 | Supported |
| v15 | v15 | Supported |
| v16 | v16 | Supported |
| Feature | v14 | v15 | v16 |
|---|---|---|---|
| Store credit | Works without settings | Requires Allow Partial Payment |
Requires Allow Partial Payment |
| Partial payments | Supported (no field needed) | Requires Allow Partial Payment |
Requires Allow Partial Payment |
| Serial/Batch bundles | Legacy fields | serial_and_batch_bundle |
serial_and_batch_bundle |
| Campaign field | campaign |
campaign |
utm_campaign |
| POS Closing invoices | pos_transactions |
pos_transactions |
pos_invoices |
| Desk URL prefix | /app/ |
/app/ |
/desk/ |
cd $PATH_TO_YOUR_BENCH
bench get-app https://github.com/ravindu2012/pos-prime --branch main
bench --site your-site.localhost install-app pos_primeAfter installation, open the POS at:
- Standalone:
/pos-prime— full-screen SPA with client-side routing - Inside Desk:
/app/pos-terminal— embedded within Frappe Desk navigation
- Open a POS session in POS Prime
- Navigate to
/pos-prime/kioskon your touchscreen device - The kiosk auto-detects the open session
- Open a POS session in POS Prime
- Click the Customer Display panel in the sidebar
- Open the display URL on your second screen
- Frontend: Vue 3 + TypeScript + Pinia + Tailwind CSS
- UI Framework: frappe-ui
- Backend: Frappe Framework + ERPNext
- Build: Vite
- Search: Fuse.js (fuzzy matching)
- Virtualization: @tanstack/vue-virtual
- i18n: Frappe translation system (
__()) with RTL support
This app uses pre-commit for code formatting and linting:
cd apps/pos-prime
pre-commit installTools used: ruff, eslint, prettier, pyupgrade
GPL v3 - see license.txt
A Raveforge Product











