Module 2: Point of Sale
⛔ SUPERSEDED 2026-06-11 — Sprig-era feature spec (pre-pivot). The authoritative current design is the locked schema in docs/SCHEMA.md, the module's entry in docs/PROJECT_DECISIONS.md, and the responsibility/seam maps in docs/MODULE_INDEX.md + docs/CROSS_MODULE_CONTRACTS.md. This file is retained for historical feature context only; do NOT treat its scope/table/feature claims as current (it predates the nursery→generic pivot, the HR-out-of-scope cut, the identity/payments/integrations/files extractions, and the schema locks). Superseded note added 2026-06-11.
Status: ✅ Locked for v1.0
Schema: pos
Feature count: 204 features in v1.0
Build estimate: Strategic spec only — implementation effort TBD
Last updated: 2026-05-12
Overview
Point of Sale is the checkout workflow. The most visible module — cashiers touch it hundreds of times per day. POS owns the cart-to-payment workflow, hardware integration (Stripe Terminal, Tap to Pay, Bluetooth receipt printers, cash drawers), and daily register operations.
POS is integrated with Inventory (sales deduct stock), CRM (customer attach), Billing (tier checks), and Notifications (receipts). It exposes a clean service-class API to other modules — no direct cross-schema queries.
Target Customer Profile
- Mid-size growth-stage retail nursery, $500K–$5M revenue
- 5–20 cashiers operating registers at peak season
- Mix of payment methods: credit/debit (Tap to Pay + dedicated readers), cash, check, charge accounts for landscape contractors
- Daily register open/close cycle
- Heavy use of holds, layaway, gift cards, loyalty programs
- Spring-weighted seasonality (40–50% of annual sales March–June)
Architecture Principle: Configurability
Every threshold, policy, default, and rule in POS is configurable per tenant via the Owner Dashboard. This is the global product principle — not POS-specific.
The Owner Dashboard (Module 10: Settings, Admin, Staff & Labor) is where all configuration lives. POS features reference these configurations at runtime.
Architecture Principle: True Offline-First (POS Carve-Out)
POS is the only module that is true offline-first in v1.0. All other modules use the platform default (5G always-online with 60-second offline buffer). POS offline-first scope: cart, item scan/lookup, customer attach, payment via Stripe Terminal (queued), sale completion, receipt printing, local inventory deduction with sync on reconnect. Online-required: charge account validation, gift card balance lookup.
Routing note (Architecture Redesign 2026-05-13): The offline-first carve-out itself stands as written. Queued offline payments sync via PaymentsService (Payments module) on reconnect — POS does not directly retry against Stripe APIs. POS hands the queued payment intents to PaymentsService; PaymentsService handles retry, idempotency, and reconciliation against Stripe.
Rationale: outdoor garden centers have known network dead spots; outage during a sale is direct revenue loss; competitive parity with Rapid/KORONA. See ARCHITECTURE.md "Offline-First Resolution".
Feature Hierarchy (204 features across 16 groups)
Group 1: Sale Workflow — core checkout flow (18 features)
| # |
Feature |
Notes |
| 1.1 |
Open new sale / cart |
Optional customer attach. Optional cashier identification. |
| 1.2 |
Add item by barcode scan (camera) |
Default scan method. |
| 1.3 |
Add item by barcode scan (Bluetooth scanner) |
High-volume operations. |
| 1.4 |
Add item by plant search |
Multi-field, fuzzy-tolerant. |
| 1.5 |
Add item by recent / frequently sold list |
Tap-to-add for daily staples. |
| 1.6 |
Manual price entry (one-off items) |
Describe + price + tax flag. |
| 1.7 |
Quantity adjustment per line |
+/-, type qty, or scan to increment. |
| 1.8 |
Line-level discount |
Dollar amount or percentage off a single item. Reason code optional. |
| 1.9 |
Line-level price override |
Cashier can override price (with manager PIN if configured). |
| 1.10 |
Remove item from cart |
Audit-logged with cashier ID. |
| 1.11 |
Cart-level discount |
Apply to entire cart (dollar or %). Reason code. |
| 1.12 |
Cart-level note |
Free text note attached to sale. |
| 1.13 |
Hold / suspend sale |
Pause cart, save for later. |
| 1.14 |
Resume held sale |
List of held sales, tap to resume. |
| 1.15 |
Cart subtotal, tax, total displayed in real-time |
Updates with every change. |
| 1.16 |
Tax auto-calculation by jurisdiction |
Based on tenant's tax setup. |
| 1.17 |
Tax exemption flag per sale |
For tax-exempt customers. |
| 1.18 |
Multi-jurisdiction tax (state + county + city) |
Some items taxed at different rates across jurisdictions. |
Group 2: Payment Workflows (16 features)
| # |
Feature |
Notes |
| 2.1 |
Credit/debit via Stripe Terminal (dedicated reader) |
BBPOS WisePOS E or compatible. Routes via PaymentsService (Payments module); POS does not call Stripe APIs directly. |
| 2.2 |
Tap to Pay on phone (no hardware) |
iPhone or Android tap-to-pay. Stripe default cap $5,000 per transaction. UI displays cap when Tap-to-Pay is selected. If sale exceeds cap, system prompts cashier to switch to Stripe Terminal reader (feature 2.1) or split payment. Routes via PaymentsService; the $5,000 cap enforcement is a PaymentsService concern (Payments module owns the rule; POS surfaces the UX). |
| 2.3 |
Cash payment with change calculation |
Suggested denominations. |
| 2.4 |
Check payment |
Capture check number, amount, optional photo. |
| 2.5 |
Charge to customer account |
Requires customer attached + account in good standing. |
| 2.6 |
Split tender (multiple payment methods) |
Combinations of cash + credit + account, etc. |
| 2.7 |
Optional gratuity / tip |
Disabled by default; can enable for delivery/service. |
| 2.8 |
Payment retry on failure |
Card decline allows retry without losing cart. |
| 2.9 |
Refund to original payment method |
Refunds default to original card; cash for cash sales. |
| 2.10 |
Sale completion (commits transaction) |
Atomic: inventory deduction + payment + audit + receipt. |
| 2.11 |
Sale cancellation (pre-payment) |
Abandoned cart voided; reservation released. |
| 2.12 |
Sale void (post-completion, same-day) |
Manager PIN required. |
| 2.13 |
Cash drawer integration |
Auto-opens on cash payment, no-sale requires PIN, drawer close required. |
| 2.14 |
Receipt prompt at sale completion |
Email / SMS / printed / no receipt. |
| 2.15 |
Manager PIN for sensitive operations |
Void, large refunds, large discounts, no-sale, price override. |
| 2.16 |
Sale receipt number generation |
Sequential per tenant per site. Format configurable. |
Group 3: Receipts & Customer Communication (11 features)
| # |
Feature |
Notes |
| 3.1 |
Email receipt |
PDF + plain text. |
| 3.2 |
SMS receipt |
Short link to web-hosted receipt. Pro+ tier (Twilio). |
| 3.3 |
Printed receipt (Bluetooth printer) |
Star SM-L200 or compatible thermal printer. |
| 3.4 |
"No receipt" option |
Skip receipt entirely. |
| 3.5 |
Gift receipt format |
Hides prices, shows return-eligible items only. |
| 3.6 |
Branded receipt header |
Logo, name, address, phone, website. |
| 3.7 |
Custom receipt footer text |
Free-text footer per tenant. |
| 3.8 |
Receipt includes plant care QR code |
QR per plant variant links to customer-facing plant care app. |
| 3.9 |
Receipt reprint from sale history |
Look up past sale, reprint or re-email. |
| 3.10 |
Receipt language |
Defaults to tenant locale; configurable per receipt for bilingual customers. |
| 3.11 |
Receipt customer-facing message |
Personalized thank-you, events, loyalty status. Configurable templates. |
Group 4: Refunds & Exchanges (16 features)
| # |
Feature |
Notes |
| 4.1 |
Full refund with receipt |
Scan/lookup original sale, refund entire transaction. |
| 4.2 |
Full refund without receipt |
Manager PIN required. Store credit or cash by policy. |
| 4.3 |
Partial refund (line-level) |
Select specific items to refund. |
| 4.4 |
Restock decision per item |
Restock vs write-off vs discount-restock. |
| 4.5 |
Exchange workflow |
New cart created, original sale items credited. |
| 4.6 |
Store credit issuance |
Issue store credit instead of refund. |
| 4.7 |
Store credit redemption |
Apply existing store credit at payment time. |
| 4.8 |
Refund reason code |
Required for refunds over $X (configurable). |
| 4.9 |
Refund time limit policy |
Configurable per tenant. Override requires manager PIN. |
| 4.10 |
Plant guarantee claim |
Special refund flow; tracks claim against plant guarantee record. |
| 4.11 |
Damage / dead-on-arrival refund |
Refund + automatic dead-count entry; photo optional. |
| 4.12 |
Manager-approved refund flow |
Refunds above threshold trigger manager PIN + audit log. |
| 4.13 |
Return without original sale lookup |
Manual entry of item + value; manager PIN required. |
| 4.14 |
Restocking fee on returns |
Configurable per category. |
| 4.15 |
Return window enforcement by category |
Configurable rules (e.g., 30 days hard goods, 7 days perennials, no returns annuals). |
| 4.16 |
Edit completed sale (same day) |
Wrong customer attached, wrong tax jurisdiction, etc. — manager-approved correction. |
Group 5: Register Management (13 features)
| # |
Feature |
Notes |
| 5.1 |
Open register with starting cash |
Cashier counts and enters opening cash. |
| 5.2 |
Mid-day cash count |
Manager spot-counts mid-shift; variance flagged. |
| 5.3 |
Cash drop |
Remove cash from drawer to safe; recorded. |
| 5.4 |
Payout from drawer |
Cash out for non-sale expenses; reason + manager PIN. |
| 5.5 |
No-sale drawer open |
Manager PIN required. |
| 5.6 |
Close register with cash reconciliation |
End-of-day count; variance highlighted. |
| 5.7 |
Multiple registers per site |
Each register has its own open/close cycle. |
| 5.8 |
End-of-day report per register |
Sales, tenders, refunds, voids, drops, payouts, cash variance. |
| 5.9 |
End-of-day report per site |
Aggregated across all registers. |
| 5.10 |
Daily deposit slip |
Formatted summary of cash + check totals for bank deposit. |
| 5.11 |
Cash drawer variance tracking |
Historical variances per cashier; flags patterns. |
| 5.12 |
Register session audit |
Every open/close logged with cashier, timestamps, counts. |
| 5.13 |
Bulk receipt reprinting at end of day |
Reprint all today's receipts for filing/records. |
Group 6: Customer Attach & Quick Add (16 features)
| # |
Feature |
Notes |
| 6.1 |
Attach existing customer to sale |
Search by name, phone, email; select; attach. |
| 6.2 |
Quick-add new customer mid-sale |
Minimum fields: first name, last name, phone. |
| 6.3 |
Customer lookup by phone scan |
Scan customer's phone-displayed barcode. |
| 6.4 |
Customer purchase history at register |
Cashier sees prior purchases mid-sale. |
| 6.5 |
Anonymous sale (no customer) |
Most retail walk-ins; customer optional. |
| 6.6 |
Customer notes visible to cashier |
Free-text notes attached to customer record. |
| 6.7 |
Customer flagged behaviors |
"Always pays cash", "Member of garden club X", "Wholesale tier 2", etc. |
| 6.8 |
Customer charge account status visible |
Balance, available credit, overdue status. |
| 6.9 |
Customer signature capture |
Digital signature for charge accounts, large purchases, age-restricted items, guarantees. Uses in-app canvas signature path (PNG to R2). See ARCHITECTURE.md "Signature Infrastructure". |
| 6.10 |
Tax exemption certificate capture |
Photo + record of resale certificate. |
| 6.11 |
Customer PO number capture |
B2B contractor requirement; their accounting needs it. |
| 6.12 |
Job / project reference per sale |
Contractor charges to specific project. |
| 6.13 |
A/R aging-aware sale |
"Customer is overdue, require cash" — auto-flag. |
| 6.14 |
Credit hold release with manager approval |
Override A/R hold at register. |
| 6.15 |
Charge limit override per sale |
Manager-approved exception. |
| 6.16 |
Sales tax exemption certificate library |
Reference to CRM Group 9. POS calls CRMService.selectCertificateForSale(). POS does not own the cert library. |
Group 7: Holds & Layaway (9 features)
| # |
Feature |
Notes |
| 7.1 |
Hold sale (pause cart) |
Reference Group 1 (1.13). |
| 7.2 |
Resume held sale |
Reference Group 1 (1.14). |
| 7.3 |
Layaway sale |
Customer pays deposit; items reserved; balance at pickup. |
| 7.4 |
Layaway deposit collection |
Partial payment captured; balance owed tracked. |
| 7.5 |
Layaway pickup completion |
Customer returns, pays balance, items delivered. |
| 7.6 |
Layaway cancellation policy |
Forfeit deposit / refund / partial — configurable. |
| 7.7 |
Layaway aging notifications |
Reminders at 7, 3, day-of pickup. |
| 7.8 |
Layaway list / report |
All active layaways, balances, pickup dates. |
| 7.9 |
Special order at POS |
Customer pays for plant not in stock; PO triggered to vendor. |
Group 8: Loyalty & Rewards (11 features)
| # |
Feature |
Notes |
| 8.1 |
Loyalty program enable/disable per tenant |
Configurable. |
| 8.2 |
Loyalty signup at register |
Customer enrolls during sale. |
| 8.3 |
Points accrual on sale |
Configurable rate. |
| 8.4 |
Points redemption at sale |
Apply points as discount; configurable conversion. |
| 8.5 |
Tier-based loyalty discounts |
Bronze/Silver/Gold; different multipliers and benefits. |
| 8.6 |
Promo points multipliers |
"Earn 3x on roses this weekend" — scheduled promotions. |
| 8.7 |
Loyalty status displayed at register |
Points balance + tier mid-sale. |
| 8.8 |
Loyalty signup bonus |
Configurable signup bonus. |
| 8.9 |
Birthday rewards |
Configurable: double points / free item / discount. |
| 8.10 |
Loyalty redemption rules |
Minimums, maximums, blackout dates, eligible categories. |
| 8.11 |
Customer-facing loyalty status |
Customer checks balance via plant care app. |
Group 9: Gift Cards (10 features)
| # |
Feature |
Notes |
| 9.1 |
Issue gift card at sale |
Cashier loads amount; card activated. |
| 9.2 |
Gift card formats |
Physical (barcode/QR) or digital (email/SMS link). |
| 9.3 |
Redeem gift card at sale |
Scan or enter code; apply balance. |
| 9.4 |
Partial gift card use |
Use part of balance, save the rest. |
| 9.5 |
Gift card balance check |
Cashier or customer can look up. |
| 9.6 |
Reload gift card |
Add value to existing card. |
| 9.7 |
Gift card expiration policy |
Configurable; default never expire (per state law). |
| 9.8 |
Gift card audit |
Track issuance, redemptions, balances; reconcile against liability. |
| 9.9 |
Gift card refund |
Lost/stolen reissue policy configurable. |
| 9.10 |
Bulk gift card issuance |
Multiple cards at once (corporate/promotional). |
Group 10: Pricing Rules at POS (17 features)
| # |
Feature |
Notes |
| 10.1 |
Quantity break pricing |
Buy 5+ at $X, buy 10+ at $Y. |
| 10.2 |
Customer-tier pricing |
Wholesale tier 1, tier 2, contractor — auto-apply when customer attached. |
| 10.3 |
Contract pricing |
Per-customer locked prices for specific items. |
| 10.4 |
Promotional pricing |
Storewide or category promotions with start/end dates. |
| 10.5 |
Scheduled sale prices apply at checkout |
POS auto-uses sale price during sale window. |
| 10.6 |
Manual price override |
Reference Group 1 (1.9). |
| 10.7 |
Best-price-wins logic |
Apply most beneficial discount when multiple qualify. |
| 10.8 |
Per-item tax overrides |
Manually flag a line different from default. |
| 10.9 |
Bulk pricing for hardgoods |
Weight-based or volume-based pricing for mulch, soil. |
| 10.10 |
Combination discounts |
"Buy any 3 perennials, get 15% off" — configurable rules. |
| 10.11 |
Coupon code redemption |
Customer brings code from email/website. |
| 10.12 |
Employee discount (configurable) |
Staff get X% off; tracked separately. |
| 10.13 |
Combo / bundle pricing |
"Plant + pot + soil" priced as a kit. When kit-BOM SKU is sold, components are atomically deducted from inventory per Inventory Group 27 (specifically 27.3); kit pricing per 27.5 is independent of component pricing. |
| 10.14 |
Volume pricing visible during qty entry |
Real-time price ladder shown as qty increases. |
| 10.15 |
Bulk pricing approval flow |
Large-qty sales trigger bulk pricing review. |
| 10.16 |
Saved cart templates |
"Smith property weekly maintenance" — recurring contractor orders. |
| 10.17 |
Comp / freebie tracking |
Samples, replacements, charity — tracked separately for accounting. |
Group 11: Special Sales Scenarios (12 features)
| # |
Feature |
Notes |
| 11.1 |
Delivery sale |
Sale today, delivery scheduled later. Inventory reserved. |
| 11.2 |
Pickup later sale |
Customer pays today, picks up tomorrow. |
| 11.3 |
Pre-order sale |
Item not yet in stock; system tracks expected delivery. |
| 11.4 |
Special order sale |
Item not normally stocked; ordered specifically for this customer. |
| 11.5 |
Mixed inventory + service sale |
Plants + consultation hours (Module 15 territory). |
| 11.6 |
Sale with multiple fulfillment dates |
Some items pickup today, some delivery next week. |
| 11.7 |
Sale from a contractor's worklist |
Pre-built shopping list rung up at register. |
| 11.8 |
Held estimate becomes sale |
Convert prior estimate/quote to sale. |
| 11.9 |
Add gift wrap / packaging service |
$5 gift wrap, $10 boxing — line item. |
| 11.10 |
Delivery date/time picker at sale |
Customer chooses delivery slot at register. |
| 11.11 |
Pickup window scheduling |
Customer chooses pickup window. |
| 11.12 |
Drop ship sale |
Customer pays at POS; vendor ships direct. |
Group 12: Hardware Integration (10 features)
| # |
Feature |
Notes |
| 12.1 |
Stripe Terminal pairing (BBPOS WisePOS E) |
One-time per register; persistent. |
| 12.2 |
Tap to Pay on iPhone setup |
Stripe SDK; supported iPhones. |
| 12.3 |
Tap to Pay on Android setup |
Same for Android. |
| 12.4 |
Bluetooth receipt printer pairing |
Star SM-L200 or similar. |
| 12.5 |
Cash drawer connection |
Pulse cable via printer OR Bluetooth-enabled drawer. |
| 12.6 |
Customer-facing display (optional) |
Second screen showing cart in real-time. |
| 12.7 |
Barcode scanner pairing (Bluetooth) |
Handheld scanner for high-volume. |
| 12.8 |
Hardware status indicator |
Real-time connection status per device. |
| 12.9 |
Hardware diagnostic / test mode |
Test print, swipe, drawer pulse. |
| 12.10 |
Multi-device register |
One register with multiple devices (phone + printer + drawer). |
Group 13: Offline & Network Resilience (8 features)
| # |
Feature |
Notes |
| 13.1 |
Offline cart preservation |
Cart state preserved locally if network drops. |
| 13.2 |
Offline payment handling |
Stripe Terminal queues offline; Tap to Pay requires online. |
| 13.3 |
Offline inventory deduction |
Local deduction; sync when online. |
| 13.4 |
Sync conflict resolution |
Two devices sold last unit offline — flag conflict on sync; manager resolves. |
| 13.5 |
Offline mode indicator |
Clear visual indicator. |
| 13.6 |
Auto-sync on reconnect |
Queued sales/refunds/adjustments sync automatically. |
| 13.7 |
Offline-eligible operations clearly marked |
Some operations (charge account, gift card balance) require online. |
| 13.8 |
60-second offline buffer for sale completion |
Network blip doesn't fail transaction. |
Group 14: Plant-Specific POS Features (12 features)
| # |
Feature |
Notes |
| 14.1 |
Weight-based pricing at register |
Bulk soil sold by pound; price auto-calculated. |
| 14.2 |
Volume-based pricing |
Cubic yards of mulch, etc. |
| 14.3 |
Per-pot pricing variation |
Same variant, different pots = slightly different prices (manual override). |
| 14.4 |
Tag mismatch handling |
Tag scanned doesn't match expected variant — cashier resolves. |
| 14.5 |
Customer scanning their own plant photo |
Customer brings photo; cashier matches via AI. |
| 14.6 |
Plant care card included with receipt |
Tear-off card with care instructions. |
| 14.7 |
Soil/amendment recommendations at checkout |
Cart includes roses → suggest rose food. Configurable upsell rules. |
| 14.8 |
Plant guarantee registration at sale |
Auto-create guarantee record; customer signs digitally. |
| 14.9 |
Garden plan attached to sale |
Customer's saved garden plan from plant care app linked to purchase. |
| 14.10 |
Seasonal item handling |
Out-of-season warning; manager override to sell anyway. |
| 14.11 |
Substitution at register |
Variant A wanted, only B available — substitute with note + price adjust + audit. |
| 14.12 |
Plant tag re-scan at register to verify item |
Catch mis-grabbed items. |
Group 15: Compliance & Records (11 features)
| # |
Feature |
Notes |
| 15.1 |
Daily Z-tape equivalent |
End-of-day session totals for accounting. |
| 15.2 |
Receipt archive (long-term storage) |
7 years retention (configurable); searchable. |
| 15.3 |
Tax reporting helper |
Tax totals by jurisdiction. |
| 15.4 |
End-of-day audit summary |
Variance, voids, refunds, large discounts — flags for review. |
| 15.5 |
Sale audit log (per transaction) |
Cashier, time, items, discounts, payment, void/refund history. |
| 15.6 |
Compliance export |
Annual summary for IRS/state reporting. |
| 15.7 |
PCI compliance enforcement |
Never store card numbers; tokenization via Stripe. |
| 15.8 |
GDPR / data subject request support |
Export or delete customer sale history on request. |
| 15.9 |
Daily sales export to QuickBooks |
Automated nightly push to QuickBooks. |
| 15.10 |
Suspicious activity / fraud alerts |
Pattern detection: void streaks, refund patterns, discount frequency. |
| 15.11 |
Force manager approval after N consecutive returns |
Prevents fraud rings; threshold configurable. |
Group 16: Cashier Experience (14 features)
| # |
Feature |
Notes |
| 16.1 |
Cashier login |
PIN-based fast login; password after timeout. |
| 16.2 |
Cashier shift tracking |
Clock in / clock out tied to register session. |
| 16.3 |
Cashier-specific sale attribution |
Every sale tagged with cashier. |
| 16.4 |
Cashier performance reporting |
Sales per cashier, average ticket, voids. |
| 16.5 |
Cashier auto-logout on idle |
Configurable timeout (default 5 min). |
| 16.6 |
Quick cashier switch mid-shift |
Shared drawer scenarios. |
| 16.7 |
Cashier-specific permission set |
Role-based discount/refund permissions. |
| 16.8 |
Tip pool / commission tracking |
If gratuity enabled, track tips/commission rules. |
| 16.9 |
Cashier sale history |
Cashier reviews own sales today. |
| 16.10 |
Cashier training mode |
Practice transactions; doesn't affect inventory/money. |
| 16.11 |
Cashier voice/audio call to manager |
One-tap call manager for approval. |
| 16.12 |
Lock cashier on N failed PIN attempts |
Security best practice; configurable threshold. |
| 16.13 |
Today's sales-so-far live counter |
Running total without leaving register screen. |
| 16.14 |
Salesperson attribution + commission tracking |
Garden designers, salespeople on commission. |
Tier Behavior (Module-Level)
| Tier |
POS capability |
| Starter |
Full POS; capped to 1 register, 1 user, 200 SKUs (inventory cap) |
| Pro |
Full POS; up to 10 registers per site, 10 cashier users |
| Enterprise |
Full POS; unlimited registers, unlimited cashiers, multi-site features active |
Configurable Defaults (Owner Dashboard)
All defaults are configurable per tenant via the Owner Dashboard:
| Configurable |
Default |
| Manager PIN required for price overrides |
ON for >20% off |
| Line-level discount reason code |
OFF |
| Max % discount without manager approval |
20% |
| Hold sale auto-expire timeout |
24 hours |
| Gratuity / tip enabled |
OFF |
| Cash drawer required to open on cash payment |
ON |
| Cash drawer close required before next sale |
ON |
| Manager PIN required for sale void |
ON |
| Manager PIN required for refund over $X |
$50 default |
| Receipt default at sale completion |
"Ask customer" |
| Sale receipt number format |
Site code + sequential, customizable |
| Sale receipt number reset cadence |
Never (continuous) |
| Maximum cash tender per sale |
No limit by default |
| Maximum charge to account per sale |
No limit; per-customer credit limit applies |
| Refund reason code required |
ON for refunds over $X |
| Void same-day time limit |
Same calendar day |
| Partial refund restock decision |
Ask cashier per item |
| Split tender max payment methods |
3 (configurable up to 5) |
| Tap to Pay fallback behavior |
Stripe Terminal retry handles |
| Restocking fee per category |
OFF (configurable) |
| Return window per category |
30 days hard goods, 7 days perennials, no returns annuals |
| Employee discount percentage |
OFF (configurable) |
| Consecutive returns trigger |
3 (configurable) |
| Cashier failed PIN lockout |
5 attempts (configurable) |
| Hourly sales pacing comparison period |
Same day last week |
| Cashier auto-logout on idle |
5 minutes (configurable) |
| Loyalty program enable/disable |
OFF (configurable) |
| Loyalty points conversion rate |
1 point per $1, 100 points = $5 (configurable) |
| Gift card expiration policy |
Never expire (per state law) |
| Currency |
USD default; based on country at onboarding |
AI Features in POS
| Feature # |
AI capability |
| 4.13 |
AI-assisted return without receipt (suggest matching past sale) |
| 6.4 |
Customer purchase history surfaced contextually for upsell |
| 10.7 |
Best-price-wins logic when multiple discounts qualify |
| 14.5 |
AI plant matching for customer-brought photos |
| 14.7 |
AI soil/amendment recommendations at checkout |
| 15.10 |
AI suspicious activity / fraud pattern detection |
All AI features route via AIService (AI / Intelligence module; model-as-config; AWS Bedrock Claude Haiku 4.5 is the default model). POS does not call Bedrock directly.
Events Emitted
pos.sale_started
pos.item_added_to_cart
pos.sale_completed
pos.sale_voided
pos.refund_processed
pos.exchange_completed
pos.layaway_created
pos.layaway_pickup_completed
pos.gift_card_issued
pos.gift_card_redeemed
pos.loyalty_points_accrued
pos.loyalty_points_redeemed
pos.register_opened
pos.register_closed
pos.cash_drop
pos.payout
pos.suspicious_activity_detected
Events Consumed
inventory.stock_changed (update available qty in cart)
inventory.variant_updated (refresh cached variant info)
crm.customer_updated (refresh customer info on active cart)
billing.subscription_changed (enforce tier limits on downgrade)
API Contract (POSService — public methods)
High-level surface (detailed signatures during implementation):
- Sale lifecycle:
startSale, addItem, removeItem, applyDiscount, attachCustomer, holdSale, resumeSale, completeSale, voidSale, editCompletedSale
- Payment:
processCardPayment, processCashPayment, processCheckPayment, chargeToAccount, applyGiftCard, applyStoreCredit, redeemLoyaltyPoints
- Refund:
initiateRefund, partialRefund, processReturnWithoutSale, claimGuarantee
- Register:
openRegister, closeRegister, cashCount, cashDrop, payout, noSaleOpen
- Receipts:
emailReceipt, printReceipt, smsReceipt, reprintReceipt, bulkReprintReceipts
- Reports:
dailySalesSummary, cashierPerformance, registerEndOfDay, siteEndOfDay
Out of Scope (for this module)
| Capability |
Why excluded |
| Multi-tender currency conversion |
International — not in v1.0 |
| Customer-facing self-service checkout |
Different product pattern |
| Inventory adjustments from POS |
Belongs in Inventory module |
| Customer record management |
Belongs in CRM module |
| Vendor invoice payments from POS register |
Belongs in Purchasing module |
| Wholesale-tier complex pricing (industrial qty) |
Picas wholesale territory |
| EDI integration |
Picas wholesale territory |
| Variable / daily market pricing |
Niche, deferred |
Gaps Identified from Market Research
Source: See docs/MARKET_RESEARCH_GAPS.md for the master gap registry.
Status: All gaps below are Open — pending decision. None have been accepted into scope yet.
| Gap # |
Gap |
What's missing in this module |
Research source |
Possible options |
| 6 |
True offline-first capability |
POS Group 13 has 60-second offline buffer; ARCHITECTURE.md line 82 explicitly locks this as the design assumption (not full offline-first) |
Research §2.1 #7 — Shopify outages top-7 pain point; Rapid/KORONA market offline as differentiator |
(a) Revise architecture to true offline-first (hours) / (b) Keep 60-sec, document as known limitation / (c) Extend buffer to specified duration |
| 9 |
Kit-BOM at POS |
POS 10.13 now atomically deducts components via Inventory Group 27 |
Research §4.1 |
Accepted — POS 10.13 Notes updated to reference Inventory Group 27 (Kit-BOM). |
| 10 |
Workshops as sellable items |
No event/workshop primitive yet |
Research §3 — Dig Gardens |
Deferred (v1.2) — Workshops bundled with v1.2 scheduling expansion. |
| 19 |
Rugged hardware support documentation |
Hardware recommendations belong in help docs |
Research §9.B |
Rejected — Documented in customer help docs, not module specs. |
| 26 |
Markdown guidance at POS |
No AI discount suggestions yet |
Research §6.3.5 |
Deferred (v1.2) — Coupled with Inventory Gap #26 in v1.2 AI markdown bundle. |