Module 3: Customer Orders
⛔ 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: orders
Feature count: 149 features in v1.0
Build estimate: Strategic spec only — implementation effort TBD
Last updated: 2026-05-12
Overview
Customer Orders handles all future-dated transactions — reservations (hold-for-pickup), pre-orders (item arriving soon), special orders (item not normally stocked), contractor orders (B2B with charge accounts and project tagging), quotes/estimates, layaway, and the entire order fulfillment workflow.
Customer Orders is distinct from POS (immediate walk-in sales) because orders are future-dated, often tied to a customer (required for B2B), and may involve deposits, multi-stage payments, or specialized fulfillment workflows.
Customer Orders depends on Inventory (reservation of stock), CRM (customer attached and credit terms), and POS (sale completion when order is fulfilled).
Target Customer Profile
- Mid-size growth-stage retail nursery, $500K–$5M revenue
- 20% of revenue from landscape contractor orders
- 10% of revenue from commercial / HOA orders
- Daily reservations from phone/email customers
- Spring-weighted seasonality affects order volume dramatically
- Charge accounts for contractors; deposit handling for special orders
Architecture Principle: Configurability
Every threshold, policy, and default in Customer Orders is configurable per tenant via the Owner Dashboard (Module 10).
Feature Hierarchy (149 features across 15 groups)
Group 1: Reservation Workflow (17 features)
| # |
Feature |
Notes |
| 1.1 |
Create reservation |
Customer + items + qty + pickup/delivery date. Inventory reserved (not deducted). |
| 1.2 |
Reservation requires customer attached |
Cannot reserve anonymously. |
| 1.3 |
Reservation lines (multi-item) |
One reservation can hold multiple items. |
| 1.4 |
Reserved quantity tracked separately from on-hand |
Available = on-hand - reserved. |
| 1.5 |
Reservation hold duration (default 7 days, configurable) |
After expiry, reservation auto-cancels and stock released. |
| 1.6 |
Hold expiration warning |
Notifies customer + staff before expiry (3 days, 1 day). |
| 1.7 |
Manual reservation extension |
Staff can extend with reason; audit-logged. |
| 1.8 |
Reservation cancellation |
Customer or staff cancels; stock released; audit. |
| 1.9 |
Reservation conversion to sale at pickup |
POS picks up reservation; sale completes; inventory deducts. |
| 1.10 |
Partial fulfillment |
"5 of 7 ready, take those now" — balance stays reserved. |
| 1.11 |
Reservation status states |
draft / active / partially_fulfilled / fulfilled / cancelled / expired |
| 1.12 |
Reservation note |
Free-text note attached to reservation. |
| 1.13 |
Reservation per site (multi-loc) |
Reservation belongs to a site; cross-site fulfillment at v1.5+. |
| 1.14 |
Reservation search and list view |
Staff operational view. |
| 1.15 |
Reservation filter by status, date, customer |
Operational filters. |
| 1.16 |
Order priority levels |
VIP / Rush / Standard — affects fulfillment order. |
| 1.17 |
Order line note |
Per-line free text for special handling. |
Group 2: Pre-orders & Special Orders (13 features)
| # |
Feature |
Notes |
| 2.1 |
Pre-order for in-stock-soon items |
"Our spring shipment arrives April 1." Customer pays/commits. |
| 2.2 |
Special order from vendor (not normally stocked) |
Customer asks for plant nursery doesn't carry; staff orders specifically. |
| 2.3 |
Vendor order triggered automatically |
Pre-order/special-order generates a draft PO in Purchasing module. |
| 2.4 |
Expected delivery date on order |
When nursery expects to fulfill (based on vendor lead time). |
| 2.5 |
Customer payment options |
Full prepay / deposit + balance / pay-at-pickup. |
| 2.6 |
Deposit handling |
Capture deposit at order creation; balance owed tracked. |
| 2.7 |
Customer notification at receiving |
When vendor delivers, customer auto-notified. |
| 2.8 |
Cancellation policy for special orders |
More restrictive than reservations (nursery already ordered from vendor). |
| 2.9 |
Substitution if vendor can't fulfill |
Vendor short — staff offers similar item; customer accepts/cancels. |
| 2.10 |
Multi-vendor special order |
One customer order requires plants from multiple vendors. |
| 2.11 |
Special order vs pre-order distinction |
Pre-order = item normally stocked but out. Special order = item not normally carried. |
| 2.12 |
Special order minimum order qty |
Vendor MOQs may force "we can only order if you commit to N." |
| 2.13 |
Explicit backorder workflow |
Split order into "ship now" + "backorder" when stock is short. |
Group 3: Contractor Orders (B2B Workflow) (18 features)
| # |
Feature |
Notes |
| 3.1 |
Contractor order template |
Pre-populated with contractor's typical items + qty + pricing tier. |
| 3.2 |
Contractor pricing tier auto-applied |
Wholesale tier 1/2/3 pricing based on customer record. |
| 3.3 |
Job / project reference per order |
Order tagged to contractor's specific project. |
| 3.4 |
Customer PO number capture |
Contractor provides PO number for their accounting. |
| 3.5 |
Bulk order entry |
Quickly add many items via SKU list or paste from spreadsheet. |
| 3.6 |
Bulk pricing applied |
Quantity break pricing automatically based on order total. |
| 3.7 |
Contractor charge to account |
Order charged to A/R account at fulfillment. |
| 3.8 |
Order delivery / pickup at job site |
Site-of-delivery captured (not the nursery, the project site). |
| 3.9 |
Delivery scheduling per order |
Specific date/time window for delivery. |
| 3.10 |
Substitutions allowed flag per line |
Contractor accepts substitutions: yes/no (default: ask first). |
| 3.11 |
Order acceptance / approval flow |
Contractor may need to approve before fulfillment (text or email signature). |
| 3.12 |
Multi-day fulfillment for large orders |
One order, multiple delivery dates as stock available. |
| 3.13 |
Contractor order history per customer |
All past contractor orders on customer record. |
| 3.14 |
Contractor outstanding balance visible at order entry |
"Customer is over credit limit" warning. |
| 3.15 |
Order via SKU shortcut entry |
Power-user fast entry — type SKU + qty without searching. |
| 3.16 |
Customer's preferred substitutions auto-applied |
Per-customer "if X is out, substitute Y" rules. |
| 3.17 |
Order via phone workflow optimization |
Fast workflow for inbound phone orders. |
| 3.18 |
Payment terms visible during order entry |
Net 30, 2/10, etc. — from customer record. |
Group 4: Quotes & Estimates (10 features)
| # |
Feature |
Notes |
| 4.1 |
Create quote / estimate |
Items + qty + pricing; sent to customer for review. No inventory reservation. |
| 4.2 |
Quote validity period |
Default 30 days; configurable. Auto-expires. |
| 4.3 |
Quote line items with details |
Plant variants, sizes, pricing, optional notes per line. |
| 4.4 |
Quote PDF generation + email |
Branded PDF sent to customer. |
| 4.5 |
Quote acceptance by customer |
Customer responds yes/no via email link or in-person. |
| 4.6 |
Quote conversion to order |
One-click convert accepted quote to reservation or pre-order. |
| 4.7 |
Quote modification before acceptance |
Edit quote, send revised version; customer sees both versions. |
| 4.8 |
Quote vs estimate distinction |
Quote = firm pricing valid for X days. Estimate = approximate. |
| 4.9 |
Quote search and list |
Open, expiring soon, accepted, declined views. |
| 4.10 |
Quote follow-up reminders |
Auto-reminder to customer if no response after X days. |
Group 5: Order Fulfillment (15 features)
| # |
Feature |
Notes |
| 5.1 |
Pick list generation |
List of items to pull from yard/greenhouse for an order. |
| 5.2 |
Pick list grouped by zone |
Optimize walking — items grouped by zone/bin. |
| 5.3 |
Staging area assignment |
Each order gets a staging area code (e.g., "Staging Bay 3"). |
| 5.4 |
Item check-off during picking |
Mark each item as picked; system updates pick status. |
| 5.5 |
Quality check on picked items |
Staff confirms quality before staging (especially for contractor orders). |
| 5.6 |
"Ready for pickup" status |
When all items picked and staged, status → ready. |
| 5.7 |
Customer notification on ready |
Auto-email/SMS customer. |
| 5.8 |
Pickup verification |
Customer arrives; staff verifies identity; reservation converts to sale. |
| 5.9 |
Pick exception handling |
Picker found 4 of 5 expected — log shortage; trigger reorder or notify customer. |
| 5.10 |
Damaged item during picking |
Flag as damaged; remove from order; suggest substitute or partial fulfillment. |
| 5.11 |
Pick assignment |
Manager assigns specific picker to an order. |
| 5.12 |
Pick performance reporting |
Time-to-ready per picker; helps staffing decisions. |
| 5.13 |
Allocation logic for limited stock |
Multiple customers want same scarce item — allocate by priority/rules. |
| 5.14 |
Order packing slip generation |
Document accompanying delivery or staged pickup. |
| 5.15 |
Inventory allocation by promised date |
Pre-allocate stock for future orders. |
Group 6: Deposits & Payment Schedule (10 features)
| # |
Feature |
Notes |
| 6.1 |
Deposit at order creation |
Configurable: 0%, 25%, 50%, 100% of order total. |
| 6.2 |
Deposit payment methods |
Credit/debit, cash, check, charge to account. |
| 6.3 |
Balance owed visible on order |
Real-time balance, paid amount, deposit amount. |
| 6.4 |
Balance payment at fulfillment |
Customer pays remaining at pickup/delivery. |
| 6.5 |
Multiple payments over time |
Customer can make partial payments before fulfillment. |
| 6.6 |
Payment schedule |
"$200 deposit now, $300 in 2 weeks, balance at pickup" — flexible. |
| 6.7 |
Payment reminder notifications |
Auto-notify customer of upcoming payment due. |
| 6.8 |
Refund of deposit on cancellation |
Configurable: full refund / partial / forfeit. |
| 6.9 |
Deposit aging report |
Open deposits, time since paid, fulfillment status. |
| 6.10 |
Deposit-to-deposit transfer |
"Move my deposit from this canceled order to this new one." |
Group 7: Order Modifications (11 features)
| # |
Feature |
Notes |
| 7.1 |
Edit order after creation |
Add/remove items, change qty, change date. Audit-logged. |
| 7.2 |
Manager approval if total changes >X% |
Configurable threshold; manager PIN required. |
| 7.3 |
Customer notification on modification |
Auto-email customer when order changes. |
| 7.4 |
Reservation hold extension via modification |
Add date extension as a modification action. |
| 7.5 |
Item substitution within order |
Replace one variant with another; price adjusts. |
| 7.6 |
Delete entire order (vs cancel) |
Permanent delete only for unfulfilled orders. |
| 7.7 |
Modification history per order |
Full audit trail of every change. |
| 7.8 |
Restore previous version of order |
Undo recent modifications. |
| 7.9 |
Order discount approval workflow |
Large discounts require manager approval before order finalized. |
| 7.10 |
Internal vs customer-facing notes |
Some notes the customer sees, some are internal only. |
| 7.11 |
Order pricing override at line level |
Override line price on order before finalization. |
Group 8: Order Communications (10 features)
| # |
Feature |
Notes |
| 8.1 |
Order confirmation email |
Auto-sent when order created. |
| 8.2 |
Order receipt SMS (Pro+ tier) |
Twilio integration. |
| 8.3 |
Reservation reminder |
"Your reservation expires in 3 days." |
| 8.4 |
Ready-for-pickup notification |
Email + optional SMS. |
| 8.5 |
Order modified notification |
When staff edits order. |
| 8.6 |
Order cancelled notification |
With reason if provided. |
| 8.7 |
Special-order receiving notification |
When vendor delivers a special-order item. |
| 8.8 |
Payment due reminder |
For deposit balances or scheduled payments. |
| 8.9 |
Custom notification templates per tenant |
Branded email templates. |
| 8.10 |
Notification opt-in/out per customer |
Customer controls what they receive. |
Group 9: Order Reporting & Analytics (10 features)
| # |
Feature |
Notes |
| 9.1 |
Open orders dashboard |
All active orders, sorted by pickup date. |
| 9.2 |
Order aging report |
Orders open >X days; flags neglected ones. |
| 9.3 |
Reservation conversion rate |
What % of reservations convert to sales? Lost revenue tracking. |
| 9.4 |
Contractor orders summary |
Total value, count, avg ticket per contractor. |
| 9.5 |
Special order pipeline |
What's been ordered from vendors but not yet fulfilled. |
| 9.6 |
Quote-to-order conversion rate |
What % of quotes turn into orders? |
| 9.7 |
Order revenue forecast |
Projected revenue from pending orders for next 30/60/90 days. |
| 9.8 |
Picker performance |
Time-to-ready, accuracy, error rate per cashier. |
| 9.9 |
Backorder report |
All open backorders, expected delivery, customer notification status. |
| 9.10 |
Order fulfillment SLA tracking |
"Customer expected by X, where are we?" — flags at-risk orders. |
Group 10: Order Search & Discovery (6 features)
| # |
Feature |
Notes |
| 10.1 |
Search orders by customer |
Name, phone, email — list customer's open and past orders. |
| 10.2 |
Search orders by status |
All "ready" orders, all "expired", etc. |
| 10.3 |
Search orders by date |
Pickup date range. |
| 10.4 |
Search orders by item |
"Who has reservations for Bloodgood Japanese maple?" |
| 10.5 |
Search orders by project / PO |
Contractor work tracking. |
| 10.6 |
Quick order lookup at register |
Scan customer phone/loyalty barcode → see pending orders. |
Group 11: Multi-Site Fulfillment (Schema-ready v1.0, UI v1.5+) (6 features)
| # |
Feature |
Notes |
| 11.1 |
Customer-chosen pickup site |
"I'll pick up at Site B even though I ordered at Site A." |
| 11.2 |
Site-of-fulfillment per order |
Order assigned to one specific site for fulfillment. |
| 11.3 |
Inter-site stock transfer for fulfillment |
Move plants from Site B to Site A to fulfill order; tracked. |
| 11.4 |
Split fulfillment across sites (Enterprise) |
One order, some items from each site. |
| 11.5 |
Per-site reservation queue |
Each site sees its own pending orders. |
| 11.6 |
Cross-site reservation reporting |
Owner sees all reservations across all sites. |
Group 12: Order Templates (Recurring Contractor Orders) (8 features)
| # |
Feature |
Notes |
| 12.1 |
Save order as template |
After creating, save as reusable template. |
| 12.2 |
Apply template to new order |
Pick template, customer is asked for modifications, order created. |
| 12.3 |
Template per customer |
"Smith property weekly maintenance" specific to one contractor. |
| 12.4 |
Template per project |
"Sunset Hills HOA annual landscaping" tied to a project. |
| 12.5 |
Template scheduling |
Auto-create order on schedule (e.g., every Tuesday) — Pro+ tier. |
| 12.6 |
Template modifications |
Edit existing template; new orders use updated version. |
| 12.7 |
Template list view |
All saved templates, customer association, last-used date. |
| 12.8 |
Template-driven bulk order generation |
"Create 12 weekly maintenance orders for next 12 weeks" — one click. |
Group 13: Order Cancellation & Refunds (8 features)
| # |
Feature |
Notes |
| 13.1 |
Customer-initiated cancellation |
Customer (via app or call) cancels their reservation. |
| 13.2 |
Staff-initiated cancellation |
Staff cancels (e.g., "we ran out of stock, sorry"). |
| 13.3 |
Cancellation reason capture |
Required for cancellations over $X (configurable). |
| 13.4 |
Stock release on cancellation |
Reserved inventory automatically released to available. |
| 13.5 |
Refund/credit on cancellation |
If deposit was paid, refund processed per policy. |
| 13.6 |
Partial cancellation |
"Cancel 3 of 7 items, keep 4." Stock partially released. |
| 13.7 |
Cancellation cooling-off period |
Once cancelled, can't re-create same order for X hours (prevents accidental). |
| 13.8 |
Cancellation reporting |
Cancelled order count, reasons, $ value over time. |
Group 14: Bulk Order Operations (4 features)
| # |
Feature |
Notes |
| 14.1 |
Bulk create orders from CSV |
Upload customer + items + qty for many orders at once. |
| 14.2 |
Bulk update order status |
"Mark all of Friday's orders as ready" — manager-only. |
| 14.3 |
Bulk cancel orders |
"Cancel all orders for product X because we're out of stock" — manager-only. |
| 14.4 |
Bulk notification send |
Send custom email to all open orders matching criteria. |
Group 15: Order Holds (3 features)
| # |
Feature |
Notes |
| 15.1 |
Hold order |
Order created but on hold pending credit check, customer approval, or other gate. |
| 15.2 |
Credit-check hold |
Auto-hold orders that exceed customer credit limit until manager releases. |
| 15.3 |
Hold release with approval |
Manager releases held order with PIN + audit trail. |
Tier Behavior (Module-Level)
| Tier |
Customer Orders capability |
| Starter |
Basic reservations only (no contractor B2B features, no quotes, no templates) |
| Pro |
Full reservations + contractor orders + quotes + templates + single-site fulfillment |
| Enterprise |
+ Multi-site fulfillment + advanced allocation rules + custom workflows + SLA tracking |
Configurable Defaults (Owner Dashboard)
| Configurable |
Default |
| Deposit required at reservation |
OFF |
| Default reservation hold duration |
7 days |
| Hold expiration warning |
3 days, 1 day before |
| Auto-cancel on expiry |
ON (with email + audit) |
| Manager PIN for modifications |
ON if total changes >20% |
| Default quote validity |
30 days |
| Default deposit % |
0% (configurable per order type) |
| Contractor substitution default |
Ask first |
| Customer self-reservation via app |
OFF (future) |
| Cancellation reason required |
Required over $X |
| Cancellation cooling-off |
1 hour |
| Order template scheduling |
OFF (Pro+ tier) |
| Order priority levels enabled |
OFF |
| Auto-allocation by priority on stock conflicts |
OFF |
| Manager approval for order discounts over X% |
ON at 20% |
| Packing slip auto-print at fulfillment |
OFF |
| SLA tracking enabled |
OFF (Pro+ feature) |
| Hold order auto-release timeout |
Indefinite (manual release only) |
| Credit-check hold trigger |
Auto when customer over limit |
AI Features in Customer Orders
| Feature # |
AI capability |
| 2.9 |
AI substitution suggestions when vendor is short |
| 5.9 |
AI partial fulfillment recommendation |
| 9.5 |
AI reservation conversion forecasting |
| 9.7 |
AI revenue forecast accuracy improvement |
| 14.1 |
AI-assisted bulk order CSV mapping |
All AI features use AWS Bedrock with Claude Haiku 4.5.
Events Emitted
orders.reservation_created
orders.reservation_cancelled
orders.reservation_expired
orders.reservation_fulfilled
orders.reservation_partial_fulfilled
orders.special_order_created
orders.special_order_received
orders.contractor_order_created
orders.quote_created
orders.quote_accepted
orders.deposit_received
orders.payment_received
orders.order_modified
orders.order_cancelled
orders.ready_for_pickup
orders.fulfilled
orders.order_held
orders.hold_released
orders.backorder_created
Events Consumed
inventory.stock_changed (update available qty for reservations)
inventory.variant_updated (refresh cached variant info)
crm.customer_updated (refresh customer info)
pos.sale_completed (mark reservation as fulfilled when sale converts)
purchasing.po_received (notify customer their special order arrived)
billing.subscription_changed (enforce tier limits)
High-level surface (detailed signatures during implementation):
- Reservation lifecycle:
createReservation, modifyReservation, cancelReservation, extendReservation, fulfillReservation, partialFulfill
- Pre-orders/special orders:
createPreOrder, createSpecialOrder, linkVendorPO
- Contractor orders:
createContractorOrder, applyContractorPricing, checkCredit
- Quotes:
createQuote, sendQuote, acceptQuote, convertQuoteToOrder
- Fulfillment:
generatePickList, markItemPicked, markReadyForPickup, allocateStock, generatePackingSlip
- Modifications:
modifyOrder, addLine, removeLine, changeQty, overrideLinePrice
- Cancellation:
cancelOrder, partialCancel, releaseStock
- Holds:
holdOrder, releaseHold
- Reports:
openOrdersDashboard, agingReport, slaReport, backorderReport
- Templates:
saveOrderTemplate, applyTemplate, bulkGenerateFromTemplate
Out of Scope
| Capability |
Why excluded |
| Online customer self-ordering |
Future v1.2 (e-commerce module) |
| Online customer payment via web |
Future v1.2 |
| Real-time inventory visible to public website |
Future v1.2 |
| Wholesale RFQ (request for quote) workflows |
Wholesale territory — Module 4 (Purchasing) |
| Order routing optimization (which warehouse picks) |
Beyond retail scale |
| EDI order intake |
Wholesale territory |
| Multi-currency order support (UI) |
Schema-ready, deferred UI |
| Fax order intake |
Almost obsolete |
| AI email order parsing |
Future v2.0 |
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 |
| 4 |
Job costing / landscaping |
Module 3 Group 3 has contractor orders with project tags; no central job object |
Research §6.1 + §10.C |
Deferred (v1.5) — Job costing as first-class module ships with Enterprise launch. See ROADMAP v1.5. |
| 10 |
Workshops as sellable items |
No event/workshop reservation type with capacity/schedule/attendee list |
Research §3 — Dig Gardens |
Deferred (v1.2) — Bundle with v1.2 scheduling expansion. |