Post Brendon sync (May 28). Scope refined. Priority order updated. Two strategic paths identified.
Portal is built. Real data ingestion is the immediate unlock. After UAT with a few trusted clients, Victor and Brendon decide: AI email intake first, or portal adoption first.
| Channel | System | Process | Portal Role |
|---|---|---|---|
| Retail | Shopify | Automated | No change โ Shopify handles retail |
| Wholesale | Manual (email/text) | ~24h/week manual entry | This portal replaces manual process |
| Shopify sync | TBD | โ | Possible future: Shopify โ portal stock sync (not committed) |
Victor and Brendon decide between two strategic paths. See Strategic Fork tab for full breakdown. This decision drives Phase 2 scope.
| Phase | Scope | Status | Change |
|---|---|---|---|
| Pre-Sprint | Wholesale price list + customer list ingestion | In Progress | ๐ New โ not in original spec |
| Phase 1 โ MVP | Portal live, UAT with trusted clients | Ready after data | QB deferred to post-UAT |
| Phase 2 โ Path A or B | AI email parsing OR portal adoption push โ TBD | Pending decision | ๐ Fork introduced by Brendon sync |
| Phase 3 | QB integration + remaining path | Not Started | Moved later by Brendon's request |
Post Brendon sync. QB reprioritized. Bulk import added. Strategic fork reflected.
| ID | Story | Priority | Done When |
|---|---|---|---|
| DI-01 | Ingest Brendon's wholesale price list into product catalog (correct prices) | P0 | All products showing correct wholesale prices in portal |
| DI-02 | Receive Brendon's QB customer export (wholesale only, Excel) | P0 | File received from Brendon |
| DI-03 | Bulk-import customers from Excel into portal (no duplicate risk) | P0 | All wholesale customers visible in admin; no duplicates |
| DI-04 | Share admin login + portal link with Brendon for UAT | P0 | Brendon confirms access; can browse and test |
| ID | Story | Priority | Done When |
|---|---|---|---|
| AC-01 | Owner logs in โ full admin navigation visible | P0 | Owner login โ all menu items present |
| AC-02 | Staff logs in with restricted access (no Settings, QB, Staff Mgmt) | P0 | Staff login โ limited nav; delete returns 403 |
| AC-03 | B2B client logs in โ Customer Portal only | P0 | Customer login โ Customer Portal only |
| AC-04 | Guest browses catalog without login | P0 | Unauthenticated โ catalog visible |
| AC-05 | Brendon can deactivate a customer (access revoked, history preserved) | P1 | Deactivated โ "Account inactive" on next login |
| AC-06 | No public self-registration โ invite flow is the only path | P0 | No sign-up page exists |
| ID | Story | Priority | Done When |
|---|---|---|---|
| PC-01 | Create product (name, desc, category, unit, price, availability, up to 10 images) | P0 | Created โ visible in customer catalog within 30s |
| PC-02 | Set primary image and reorder via drag-and-drop | P1 | Reorder โ customer carousel reflects change |
| PC-03 | Update product availability in real-time | P0 | Set to 0 โ "Out of Stock"; can't add to cart |
| PC-04 | Set product status (Active / Inactive / Seasonal) | P1 | Inactive โ removed from customer view |
| PC-05 | Soft-delete product (history preserved) | P1 | Deleted โ off catalog; past orders still reference it |
| PC-06 | Manage categories (create, edit, delete) | P1 | New category โ available in product form immediately |
| PC-07 | Image validation: max 5MB, JPEG/PNG/WebP only | P0 | Wrong size/format โ rejection message |
| PC-08 | Price updates reflect in customer view within 60s | P1 | Admin updates price โ customer sees it on next load |
| ID | Story | Priority | Change |
|---|---|---|---|
| CM-01 | Create customer profile (business name, contact, email, phone, address, schedule, tier, notes) | P0 | โ |
| CM-02 | Send invite email to customer | P0 | โ |
| CM-03 | Customer activates via invite link (pre-filled data, set password or magic link) | P0 | โ |
| CM-04 | Invite links expire after 7 days (configurable) | P1 | โ |
| CM-05 | Resend invite (new link, old link invalidated) | P1 | โ |
| CM-06 | Convert guest order to registered customer (one click, data pre-filled) | P2 | โ |
| CM-07 | Customer lifecycle: Invited โ Active โ Inactive | P1 | โ |
| CM-08 | ๐ Bulk customer import from CSV/Excel (QB export format) โ maps columns, deduplicates by email, creates accounts in batch | P0 | ๐ Added from Brendon sync |
| ID | Story | Priority |
|---|---|---|
| OR-01 | Browse catalog with real-time availability (OOS disabled, low-stock warned) | P0 |
| OR-02 | Build order: select products, set quantities, see running total | P0 |
| OR-03 | "Repeat Last Order" โ loads previous items, flags unavailable | P1 |
| OR-04 | Submit order โ immediate confirmation (on-screen + email) | P0 |
| OR-05 | Admin sees new orders within 5 seconds | P0 |
| OR-06 | Admin confirms order (one click โ packing sheet + QB invoice) | P0 |
| OR-07 | Admin adjusts qty before confirming โ client notified automatically | P1 |
| OR-08 | Client cancels while New; can't cancel after Confirmed | P1 |
| OR-09 | Order status: New โ Confirmed โ Packed โ Delivered (admin-only) | P0 |
| OR-10 | Availability decremented on confirmation, not submission (no phantom holds) | P0 |
| ID | Story | Priority |
|---|---|---|
| GO-01 | Guest browses full catalog without login | P0 |
| GO-02 | Guest builds and submits order โ PDF emailed | P0 |
| GO-03 | Guest order appears as "Pending Review (Guest)" in admin | P0 |
| GO-04 | Rate limit: max 5 guest orders per email per day | P2 |
| GO-05 | Convert guest to registered customer (one click) | P2 |
| ID | Story | Priority |
|---|---|---|
| PS-01 | Packing sheet auto-generated on order confirmation | P0 |
| PS-02 | Sheet includes: product name, qty, unit, bin/location, check-off boxes | P0 |
| PS-03 | Generate per-order or batched by delivery date | P1 |
| PS-04 | Optimized for print and tablet | P1 |
| ID | Story | Priority |
|---|---|---|
| SO-01 | Create standing order template (client, products, quantities, schedule) | P1 |
| SO-02 | System auto-generates pending order 48h before delivery | P1 |
| SO-03 | Client notified by email to confirm or adjust | P1 |
| SO-04 | Client confirms with one click or modifies before deadline | P1 |
| SO-05 | Auto-confirm after deadline (configurable) | P2 |
| SO-06 | OOS product in standing order โ flagged + client notified | P1 |
| SO-07 | Client and admin can edit template anytime | P2 |
| ID | Story | Priority | Change |
|---|---|---|---|
| QB-01 | Connect QuickBooks via OAuth 2.0 | P1 | Was P0 โ downgraded. Post-UAT. |
| QB-02 | QB invoice auto-created on order confirmation | P1 | Was P0 โ downgraded. Post-UAT. |
| QB-03 | QB invoice cross-referenced with portal order number | P1 | โ |
| QB-04 | Access token auto-refreshed | P1 | โ |
| QB-05 | QB error โ admin notified; order still processed | P2 | โ |
| QB-06 | ๐ Customer sync QB โ portal โ when customer added to portal, sync to QB to avoid duplicates (Brendon explicitly requested) | P1 | ๐ Added from Brendon sync |
| ID | Story | Priority | Notes |
|---|---|---|---|
| AI-01 | AI parses inbound order emails and maps to product catalog | P3 | Path A. Decision pending post-UAT. |
| AI-02 | AI parses inbound SMS/text orders | P3 | Brendon: some clients text orders |
| AI-03 | Ambiguous items flagged for human review | P3 | โ |
| AI-04 | Parsed order shown as draft โ admin confirms/edits โ enters pipeline | P3 | โ |
| AI-05 | Confidence scoring per line item (high/medium/low) | P3 | โ |
| AI-06 | Confirmed parsed order โ QB invoice auto-created | P3 | Completes the emailโQB chain |
| ID | Story | Priority |
|---|---|---|
| P2-01 | Customer self-service account management | P3 |
| P2-02 | Order analytics dashboard for Brendon | P3 |
| P2-03 | Delivery tracking (status visible to client) | P3 |
| P2-04 | Mobile optimization | P3 |
| P2-05 | Shopify โ portal stock sync (TBD โ mentioned but not committed) | P4 |
Pre-sprint data ingestion added. QB removed from Sprint 1 scope per Brendon's direction.
"By end of Sprint 1, Brendon can log in with real data, manage his catalog, invite real clients, and run UAT with a few trusted customers."
| Task | Input | Done When |
|---|---|---|
| DI-01 โ Ingest price list | Wholesale price list (received from Brendon) | All products showing correct wholesale prices |
| DI-02 โ Receive customer export | Brendon's QB export (wholesale clients only, Excel) | File received |
| DI-03 โ Bulk import customers | Excel from DI-02 | All wholesale customers in admin; no duplicates |
| DI-04 โ Share admin access | โ | Brendon confirms he can log in and stress-test |
| Task | What It Means | Done When |
|---|---|---|
| A1 โ Supabase Setup | Create project, configure auth, define 4 roles: owner, staff, customer, guest | 4 roles working; local env connects |
| A2 โ Cloudflare Scaffold | Init frontend repo, deploy to staging | staging.marisgardens.com returns 200 |
| A3 โ Owner Login | Email + password; redirect to Admin Portal | Owner logs in โ full nav |
| A4 โ Staff Login | Restricted nav (no Settings, QB, Staff Mgmt) | Staff login โ limited nav; delete returns 403 |
| A5 โ Customer Login | Redirect to Customer Portal; admin URL blocked | Customer login โ portal only |
| A6 โ Route Guards | All routes protected per role | Unauthenticated /admin โ login redirect |
| Task | What It Means | Done When |
|---|---|---|
| B1 โ Product Data Model | Supabase table: products (id, name, desc, category_id, unit, price, availability, status) | Migration runs clean |
| B2 โ Image Storage | Supabase Storage; max 5MB; JPEG/PNG/WebP only | Upload validates type + size |
| B3 โ Image Ordering | sort_order join table; drag-and-drop UI | Reorder โ persisted; carousel reflects |
| B4 โ Category CRUD | categories table; admin CRUD | Create/edit/delete โ available in product form |
| B5 โ Product CRUD | Create, edit, soft-delete; status toggle | Full CRUD; soft delete preserves history |
| B6 โ Real-time Availability | Admin update โ customer sees <60s | Set to 0 โ OOS shown; can't add to cart |
| B7 โ Customer Catalog View | Product grid; filter by category; search | Customer sees catalog; OOS disabled |
| Task | What It Means | Done When |
|---|---|---|
| C1 โ Customer Data Model | Supabase table: customers (all fields) | Migration runs clean |
| C2 โ Admin Customer Creation | Form + Supabase auth invite | Profile saved; visible in list |
| C3 โ Invite Email Flow | Resend integration; branded email; 7-day link | Email within 60s; link works |
| C4 โ Customer Activation | Pre-filled form โ confirm โ account active | Activation completes end-to-end |
| C5 โ Invite Expiry + Resend | Day 8 โ error page; resend invalidates old link | Both cases handled |
| C6 โ ๐ Bulk CSV/Excel Import | Upload QB export โ map columns โ deduplicate by email โ batch create accounts | Brendon's QB export imported cleanly; no duplicates |
| Feature | When | Why Deferred |
|---|---|---|
| QB integration | Post-UAT | Brendon explicitly: test portal first, then QB |
| AI email/SMS parsing | Path A decision | Depends on UAT + strategic fork decision |
| Ordering flows | Sprint 2 | Depends on auth + catalog (this sprint) |
| Packing sheets | Sprint 3 | Depends on ordering (Sprint 2) |
| Standing orders | Sprint 3 | Depends on ordering (Sprint 2) |
| Shopify sync | TBD / Phase 3+ | Mentioned by Victor โ not committed by Brendon |
After data ingestion + UAT, Victor and Brendon choose one path. Each solves the core problem differently.
Brendon's team spends ~24h/week manually processing orders received by email and text. Every restaurant has a different format. This is the bottleneck โ and there are two ways to remove it.
Build AI that reads inbound emails and texts, maps them to the product catalog, and creates orders automatically. Restaurants keep doing exactly what they do today.
Invest in getting the 70+ B2B clients to actively use the ordering portal instead of email/text. Higher long-term payoff, harder adoption curve.
| Dimension | Path A โ AI Email | Path B โ Portal Adoption |
|---|---|---|
| Client behavior change | None โ zero friction | High โ requires onboarding + habit shift |
| Time to value | Fast โ works with existing email/text | Slow โ depends on client adoption rate |
| Data quality | Medium โ AI can misparse ambiguous requests | High โ structured input, no ambiguity |
| QB integration dependency | Required for full chain | Optional (enhances but not required) |
| Effort estimate | ~10h + ~$650 inference | ~12h + ~$650 inference |
| Risk | AI parsing accuracy โ wrong fills | Client resistance โ low adoption |
| These paths exclusive? | No โ both can be built. The decision is which to do first. | |
Path A removes the bottleneck immediately and requires no behavior change from clients. If AI parsing accuracy is high enough, Brendon sees ROI before a single client logs into the portal. Path B is the long-term play โ cleaner data, higher engagement. The strongest outcome: ship Path A first to prove ROI, then use that credibility to drive Path B adoption.
Victor and Brendon sync after data ingestion + UAT. Brendon's experience using the admin portal with real data will inform which pain point feels most urgent to solve next.