Shopiflow POS
Modern counter checkout with smart grid catalog, custom sales, and draft orders.
Final
Product Team
About this flow
Shopiflow POS is a high-speed tablet and counter checkout application for modern retail and hospitality businesses. Designed around an adaptable smart grid layout, fast search, custom item creation, customer assignment, and split-tender processing, it provides staff with an efficient checkout experience and reliable order tracking.
What it can do
Smart Grid Customization
Organize your sales counter with customizable color-coded grid tiles for products, categories, and workflow actions.
Flexible Payment Tenders
Accept cash, card, tap-to-pay, gift cards, and split-tender transactions with automated change rounding and balance tracking.
Park and Resume Drafts
Save order drafts when customers need to step away and quickly reload them onto the register cart later.
Order History & Digital Receipts
View past orders, process line-item refunds, print 80mm thermal receipts, or dispatch receipts directly via email or SMS.
Dynamic Theme Options
Switch seamlessly between high-contrast dark and light appearance modes tailored for different store lighting environments.
Screenshots
Tags
Version history
- v2.0.0Current
QA update — all nine reported issues, plus the engine theming system and the 0.6.1 auth surface. The nine QA issues - Order history has its own place: completed sales now lead the Orders screen, drafts follow (they used to push history below the fold). - Parking a sale no longer depends on a grid tile: Save as draft order lives in the cart's ••• menu, and registers set up by an older build now grow the draft tiles they were missing. - The 8-tile ceiling is gone: 12 tiles per page (4x3), and "Add tile" moved to the grid header so adding always works from any page. - Pages are visible: prev/next chevrons, dots and an "n / N" counter are always on screen, and a newly added tile navigates to the page it landed on. - One home each: the grid icon is the register, the house is station home. - The ••• button above the cart works — Apply discount / Save as draft order / Add order note. - Discount removed from the nav rail (it read as a navigation tab but opened a modal); it lives in the ••• menu and on the grid tile. - User switching is a real flow-owned lock screen: staff picker, 4-6 digit PIN checked by the platform's own headless authenticateUser, then setActiveUser. 5 wrong tries pauses for 30s. - Apps icon and panel removed. Theming is now configuration - Every --fp-* token is an alias of, or a derivation from, an engine theme token, so appearance, palette and corners are theme knobs rather than CSS. The in-app Dark/Light toggle is gone: post-alias it could only work by reassigning engine-owned tokens. - Contrast corrected throughout: blue is a FILL token, with a separate ink token for text and icons (the raw primary measured below AA as text on dark surfaces). Bugs found and fixed along the way - Swiping between grid pages was ringing up a product: a drag inside a tile crossed the paging threshold and still landed its click. - Removed tiles came back after a reload: the tile's local key and the host row id were one string, so deletes were sent with a synthesised id and the host deleted nothing. Recolouring an unsaved tile could also duplicate it. - A 10% order discount displayed as "-0.1%". It now shows the money taken off, derived from the register's own totals. - Resuming a draft could report "nothing has been resumed" after 1.75s on a slower register, when the sale had in fact loaded. - Discard copy corrected: discarding cancels a parked order, it does not delete it, and it only works while the order is still parked. - Stock counts are unit-aware: a product sold two ways no longer sums quantities measured in different units. - Products sold more than one way (by the glass and the bottle, or in several sizes) can now sell any of them — the register asks which; a single-variant product still adds in one tap. - Draft counts read the register's own total instead of capping at the 50-row page. Not verified in preview and needing a device: unlocking with a real staff PIN, the smart-grid migration on an existing register, real card/tap tenders, and printing.
- v1.2.0
Money-path release. Rebuilt the payment and refund paths against command-frame 0.6.0. Payments - Settlement is now read from the tender response (saleFinalized / remainingBalance) instead of being inferred from whether an order came back. The old ./frame031 bridge hand-typed the cash response and cast both fields away, so the screen structurally could not see them. - Because some hosts omit those two required fields at runtime, settlement is tri-state: the host's own answer, else order-returned plus a fresh cart re-read, else an explicit "balance not confirmed". A fully-paid sale no longer renders "Partially paid" with a Void button, and nothing fabricates a settled sale. - Change and cash rounding are read from the response, never recomputed. The host is asked for the true cash charge before staff collect a tender, and the rounding line only appears when the company actually rounds. - Every charge re-reads the cart at the instant of charging, so a split leg landing mid-flow can't cause an overpayment. - Split legs are taken with a real tender for a sub-balance amount. partialPayment only QUEUES an amount and moves no money, but was being reported as "Payment leg captured" — the drawer came up short. - An unsettled order now has recovery controls (take the remainder, or void and return what was captured) instead of only "New order". Refunds - Quantity caps come from getRemainingRefundableQuantities, not the order's original quantities, so a part-refunded order can no longer be over-selected. Cart fees and tips are now shown and refundable. - The refund total comes from getRefundPlan's own per-tender legs, and the same items array feeds both the quote and the commit, so the figure on screen cannot disagree with what is returned. - The commit is headless (openUI:false) with the plan's legs. Left at the 0.6.0 default, a multi-tender order raises the POS's own modal and returns success:true with refundId:null having committed nothing — which was being shown as "Refund processed". Success now requires a real refundId; the modal case says plainly that nothing was refunded here. - Stock disposition rides on the items, and each row carries its real type instead of a blanket "product" that silently dropped custom sales. Catalog - New catalog.ts owns the product-to-category join. Category identity is a candidate-key set and the join is an overlap test, because the mock and the 0.6.0 contract disagree on both sides of it (id vs _id; category objects vs plain id strings). Collection tiles were saving refId:undefined and drilling into an empty screen. - The grid waits for categories before seeding defaults, so the default collection tile is no longer dropped on a slow load. Theme - Light and dark both painted from tokens; on-colour tokens added so button labels stop being pinned to one appearance.
- v1.1.1
Upgraded host integrations across payments, refunds, and catalog browsing for improved reliability and visual consistency. - Fixed payment settlement handling to accurately track partial payments and full checkout completion. - Refactored refund flow to support fees, tips, and clear cancellation states. - Resolved category linking so product drill-downs and collection tiles load correctly. - Updated theme contrast tokens and backdrops across the register interface.
- v1.1.0
Refunds: clear the host-side refund selections whenever a refund screen is abandoned (Cancel, Back, Close), and again before applying an explicit partial selection, so an initiated refund target and its every-line selection can never outlive the screen that made them or leak into a partial refund. resetRefundDetails is routed through the time-bound frame031 seam so an older host cannot leave the call pending and hang the refund.
- v1.0.3
Shopiflow POS has been updated with enhanced draft management, real receipt capabilities, and improved theme support. - Manage parked orders with new draft retrieval and count badges - Send real email and SMS receipts directly from order history - Toggle between light and dark modes in the updated settings - Apply and remove line-item discounts directly within the cart
About the maker
Final
Product Team
St. John's, Newfoundland
Final's in-house flow studio. We publish official themes built to the platform's highest standard, pairing dependable designs you can ship today with experiments that point to what's next.
