Paste any email or SMS into the admin portal. AI maps it to the product catalog and creates a structured order draft โ ready to confirm in one click. Clients never change what they do.
| Today | With AI Intake |
|---|---|
| Staff reads email: "3 cases romaine and the usual herbs, Thursday please" | Staff pastes that same email into the intake panel |
| Staff manually maps each item to the catalog, opens portal, enters one by one | AI returns a structured draft: Romaine ร 3, Mixed Herbs ร 2 (from last order), delivery Thu |
| Staff creates QB invoice manually after order ships | One-click confirm โ order enters pipeline โ packing sheet + QB invoice created automatically |
| ~15โ30 min per order ยท ~4h/day ยท ~$27โ31K/year | ~60 seconds per order ยท zero missed invoices |
| In Scope (v1) | Out of Scope |
|---|---|
| Paste email body text โ parse | Automated inbox monitoring (future) |
| Paste SMS/text message โ parse | WhatsApp / iMessage native integration |
| AI maps to existing product catalog | Creating new products from intake |
| Confidence scoring per line item | Auto-confirm without human review |
| Human review + edit before confirm | Email reply to client from portal |
| Confirmed order enters full pipeline | Multi-order batch from one paste |
| Original text stored as audit trail | Auto-detect client from email sender |
A dedicated screen inside the Admin Portal. Paste any communication โ email, text, notes โ and get a structured order draft back.
What the AI sees, what it extracts, and how it decides when to ask for human help.
| Input | Why It Matters |
|---|---|
| Pasted text | The raw email or SMS to parse |
| Product catalog (live) | All active products: name, category, unit, price, current stock. AI matches against this โ no hallucinated products. |
| Client's last order | Needed to resolve "same as last week" / "the usual" references |
| Client profile | Tier, standing orders, preferred products โ helps disambiguate |
| What | Example | Result |
|---|---|---|
| Product match | "romaine", "the leafy stuff", "baby lettuce" | Romaine Lettuce (matched from catalog) |
| Quantity | "3 cases", "two bags", "a box", "6" | 3, unit: cases |
| Delivery date | "Thursday", "this Friday", "June 10" | 2026-06-05 (resolved from today) |
| History reference | "same as last week", "the usual", "repeat my order" | Loads last order โ pre-fills + medium confidence flag |
| Conditional items | "if you have", "maybe", "only if available" | Item included + red flag โ must resolve before confirm |
| Stock risk | Any item where requested qty > current stock | Yellow flag: "Only X available, you requested Y" |
Product name matches clearly. Quantity is numeric and explicit. No ambiguity.
Product matched via synonym or history reference. Quantity inferred. Staff should verify before confirming.
Conditional logic, unknown product, or missing quantity. Confirm button stays disabled until resolved or removed.
| Situation | AI Behavior |
|---|---|
| "The usual" โ no order history for this client | ๐ด Flag: cannot infer without history. Staff must enter manually. |
| Product not in catalog | ๐ด Flag: unknown item. Staff removes or maps to correct product. |
| Quantity not stated | ๐ก Defaults to 1, flags for verification |
| Two similar products (e.g. romaine vs romaine hearts) | ๐ก Shows top 2 matches, asks staff to select |
| Requested qty exceeds stock | ๐ก Flags available qty โ staff decides partial fill or contacts client |
| Text contains no order content | Returns empty draft: "No items found in this text" |
23 stories across 4 epics. All with acceptance criteria.
| ID | Story | Priority | Acceptance Criteria |
|---|---|---|---|
| AI-01 | Staff can access "AI Order Intake" from the admin nav | P0 | Panel in nav; not visible to customers |
| AI-02 | Staff can paste any free text into the intake area | P0 | Accepts unlimited text; no formatting required |
| AI-03 | Staff selects which client the intake is for | P0 | Dropdown shows Active customers; required before parsing |
| AI-04 | Staff clicks "Parse Order" to trigger AI | P0 | Button disabled until text + client selected; shows loading state |
| AI-05 | Delivery date extracted from text is shown and editable | P1 | Extracted date pre-fills field; staff can override |
| ID | Story | Priority | Acceptance Criteria |
|---|---|---|---|
| AI-06 | AI maps product names (exact, synonyms, partial) to catalog | P0 | "romaine", "baby romaine", "the romaine" all map to Romaine Lettuce |
| AI-07 | AI extracts quantities including written numbers | P0 | "two bags" โ 2; "a case" โ 1; missing โ flagged |
| AI-08 | AI resolves "same as last week" / "the usual" via order history | P1 | History found โ pre-fills + medium flag; no history โ red flag |
| AI-09 | AI flags conditional items ("if you have", "maybe") | P1 | Conditional โ red flag; blocks confirmation until resolved |
| AI-10 | AI flags items where requested qty exceeds current stock | P1 | Over-stock โ yellow flag with available qty shown |
| AI-11 | AI extracts delivery date from relative and absolute references | P1 | "Thursday" โ resolved to correct date; shown in UI |
| AI-12 | Unknown products surfaced as red flags | P0 | Unknown item โ red flag; staff can remove or manually assign |
| ID | Story | Priority | Acceptance Criteria |
|---|---|---|---|
| AI-13 | Draft shows each line item with product, raw text, qty, confidence badge | P0 | All fields visible; badges color-coded high/medium/low |
| AI-14 | Staff can edit product, quantity, or unit on any line item | P0 | Edit โ draft updates; re-validation runs |
| AI-15 | Staff can remove any line item from the draft | P0 | Remove โ item gone; count updates |
| AI-16 | "Confirm Order" disabled until all red flags resolved | P0 | Any red flag โ button disabled + tooltip |
| AI-17 | Confirmed intake order enters pipeline as status = Confirmed | P0 | Confirm โ order in dashboard with [AI Intake] tag; status = Confirmed |
| AI-18 | Original pasted text stored on order record as audit trail | P1 | Order detail view shows "Intake source" with original text |
| AI-19 | Staff can discard draft and start over | P1 | Discard โ clears draft; no order created |
| ID | Story | Priority | Acceptance Criteria |
|---|---|---|---|
| AI-20 | Confirmed intake order triggers packing sheet generation | P0 | Same packing sheet as portal orders; includes [AI Intake] label |
| AI-21 | Confirmed intake order triggers QB invoice creation | P1 | QB invoice created within 60s; matches confirmed draft |
| AI-22 | Intake orders filterable by [AI Intake] tag in order list | P1 | Admin can filter: Portal / AI Intake / Guest |
| AI-23 | Availability decremented on confirmation (same as portal orders) | P0 | Confirm โ stock updated; same race condition rules apply |
| Epic | Stories | P0 | P1 |
|---|---|---|---|
| Epic 1 โ Intake Panel UI | 5 | 4 | 1 |
| Epic 2 โ Parsing Engine | 7 | 3 | 4 |
| Epic 3 โ Review & Confirmation | 7 | 5 | 2 |
| Epic 4 โ Pipeline Integration | 4 | 2 | 2 |
| Total | 23 | 14 | 9 |
What the AI agent builds vs. what requires human judgment. Includes 30% buffer throughout.
| Component | AI Agent | Human | Total | Notes |
|---|---|---|---|---|
| Frontend UI (intake panel, draft, inline edit, confirm bar) | 5h | 2h | 7h | Draft view is the most complex piece โ badges, flags, disabled state logic |
| Backend parse endpoint + prompt construction | 4h | 2h | 6h | Injecting catalog + history into prompt correctly takes iteration |
| Prompt calibration | โ | 5โ8h | 5โ8h | โ ๏ธ The real work. Requires Brendon's actual emails to calibrate against. |
| Pipeline integration (โ createOrder โ packing โ QB) | 2h | 1h | 3h | Reuses existing pipeline โ minimal new code |
| Testing with real emails | 2h | 3h | 5h | โ ๏ธ Cannot skip. Synthetic examples don't catch real-world patterns. |
| Edge cases + refinement | 2h | 1.5h | 3.5h | โ |
| TOTAL | ~15h | ~15h | ~30h | ~2.5 weeks ยท includes 30% buffer throughout |