poutineAI — MVP v1.0 PRD (Québec Restaurants)¶
Purpose. Define the smallest set of capabilities that (a) plug into existing email/WhatsApp habits, (b) eliminate manual invoice entry, and (c) produce accountant-ready data with auditability—without moving money yet. This earns trust and creates an obvious "yes" for pilot users in Québec. French-first UX is mandatory.
1) Problem, target user, and success¶
Problem. Owner-operators spend hours printing/annotating/transcribing invoices; they don't want another complex app or to hand over payment control. We must meet them inside their current channels and remove data entry.
Target user. Québec, French-speaking owner/manager of 1–4 locations; tech-averse to "big software," comfortable with email + WhatsApp; trusts their accountant/bookkeeper.
North-star experience. Zero-effort capture → instant extraction → one-tap approval → one-click Excel for the accountant. (Payments are stubbed only.)
Primary success metrics (30–60 day pilot). - Activation: ≥80% of invited suppliers CC the restaurant's unique Bob's email within 2 weeks. - Time saved: Owner reports ≥2 hours/week reduction in AP admin by week 4. - First value: ≥1 Excel export consumed by the accountant per tenant in month 1. - Trust signal: ≥90% of invoices approved within 3 business days of ingestion. - Time-to-first-invoice: median < 1 hour post-onboarding. - Weekly Active Invoices (WAI): count of invoices captured or approved per account per week (target: upward trend by week 2).
2) Scope (MoSCoW)¶
Must have (v1.0)¶
-
Concierge onboarding + supplier kit (French)
After signup, show the unique capture email, copy-paste supplier message (fr-CA), and register/whitelist WhatsApp numbers. -
Invoice capture
- Unique inbound email per restaurant; process PDF/JPG/PNG attachments only.
- Link-only emails (e.g., "view/download" links) auto-reply in French asking for a PDF and are ignored.
-
WhatsApp photo intake from pre-registered numbers (no separate app).
-
Extraction & review
- OCR/AI extraction of supplier, invoice #, issue date, due date, currency (CAD), total, GST, QST.
- Auto-categorization of invoices into expense types (COGS, Utilities, Professional Fees, Meals, etc.) based on supplier and line-item data.
-
Store the original file; side-by-side verify; inline edits; confidence cues.
-
Dashboard
- Lists Awaiting Approval / ✅ Due in X days / ✅ Overdue X days with search & filters.
- New supplier badge for first-time suppliers.
- Duplicate detection (invoice# + supplier + total + date window) with clear warning.
- Quick open of source PDF/image.
- Total outstanding balance across all suppliers, showing the combined amount owed for all open invoices (awaiting approval + approved)
- Suppliers tab displaying all open invoices by supplier with due dates. Default view shows total outstanding balance per supplier, with option to multi-select particular invoices to view combined total.
-
Supplier classification by expense type (e.g., COGS, Professional & Legal Services), with an option to auto-categorize all current and future invoices from that supplier under the chosen classification.
-
Approval workflow & audit
- Approve/Reject with optional note; rules by supplier and/or amount threshold (e.g., "> 3 000 $ requires Owner + Manager").
- Auto-approve under $X and/or for trusted suppliers (log in audit).
- Email notifications to assigned approvers (French).
-
Immutable audit trail per invoice.
-
Excel export (accountant-ready)
- One-click XLSX by date range with columns: Date facture, Fournisseur, No facture, Montant HT, TPS, TVQ, Total, Devise, État, Approveur, Date d'approbation, Source (email/WhatsApp)
- Expenses by Categories tab showing totals by tax category (e.g., COGS, Legal & Professional Services, Utilities, Dues & Subscriptions), including GST/QST amounts.
-
Filename: poutineai-factures-
- - .xlsx. -
Price-hike alerts 🔥 KEY DIFFERENTIATOR
- Store line items per supplier and flag when the same item appears at a higher unit price in future invoices
- Pop-up alert shown at the approval stage when price increases detected
- Configurable threshold alerts (e.g., >5% increase)
-
Historical price tracking per item per supplier
-
Payments: stub only
-
Show Pay/Schedule CTA but route to "Mark as paid" with paid date; no money movement; update status + audit trail.
-
French-first, responsive web app
-
fr-CA strings, dates, currency as default; responsive desktop/tablet/phone; WCAG AA basics.
-
Security, tenancy, and observability (baseline)
- Passwordless login (magic link) + short-lived JWT; per-tenant isolation; signed URLs for files; inbound webhook signature verification (email/WhatsApp); Sentry on FE/BE.
Should have (v1.0 if trivial)¶
- Manual drag-and-drop upload in the web app.
- Low-confidence highlighting on extracted fields.
- Due-date digest (opt-in): daily email of invoices due in next 7 days; gentle approval nudges.
- Calendar toggle (read-only due dates).
- Spend by supplier summary (table) with export.
Won't have (later phases)¶
- Real money movement (Interac, PAD, cards), CRA/RQ remittances; accounting-system sync.
- Plate-margin analytics (though line items are stored for future use).
3) User journeys (happy paths)¶
-
Onboard (owner)
Enter restaurant name, email, phone → system issues unique capture email (e.g., stevespizza@bobs.ai) → register WhatsApp numbers → show supplier kit (French template to request CC). Owner can copy & send to vendors in <3 minutes. -
Capture via email
Supplier emails PDF to the restaurant & CCs Bob's → store file → create Pending invoice → extract → surface in Awaiting approval. If link-only, auto-reply (French) requesting a PDF and do not create an invoice. -
Capture via WhatsApp (paper)
Staff snaps a photo → WhatsApp from registered number → store → extract → shows in Awaiting approval; system replies directly to the specific invoice image message with "Facture reçue ✔". If multiple images are sent, responds with "5 factures reçues ✔". -
Approve/Reject
Open invoice detail (PDF side-by-side), one-tap Approuver or Rejeter + comment. If rules require multiple approvers, show "en attente de ..." until complete. Auto-approved items are clearly labeled and logged. If price increase detected, alert popup appears before approval. -
Export
Select date range → Télécharger Excel → accountant imports; GST/QST amounts included. -
Mark as paid (stub)
Select approved invoices → Marquer comme payé (+ date) → status updates to Paid; audit records who/when.
4) Functional requirements (acceptance criteria)¶
FR-0 Onboarding - Show capture email, supplier kit (French), WhatsApp registration. - Done when: owner can copy supplier message and register at least one phone number in <3 minutes.
FR-1 Ingestion: Email - Accept PDF/JPG/PNG attachments; multi-attachment → one invoice per attachment. - Link-only emails auto-reply in French requesting a PDF; do not create invoices. - Persist original to object storage; create invoice row status=processing. - Verify inbound signatures; idempotent retries. - Done when: attached invoices appear on dashboard within minutes; link-only never create invoices; behavior documented.
FR-2 Ingestion: WhatsApp - Only registered numbers accepted; download media; multiple images → one invoice per image. - Reply directly to specific message with confirmation: single = "Facture reçue ✔", multiple = "X factures reçues ✔" - Done when: a clear photo yields a dashboard item with image preview + extracted fields; confirmations sent to correct message thread.
FR-3 Extraction & field model - Extract supplier, invoice #, issue date, due date, currency (CAD), total, GST, QST. - Extract and store line items (description, qty, unit_price) for price-hike detection. - Show extraction confidence; allow inline edits before approval. - Keep original via signed URL. - Done when: ≥95% of test invoices have correct total and due date post-edit; line items stored for price comparison.
FR-4 Dashboard - Sections: Awaiting Approval / ✅ Due in X days / ✅ Overdue X days; search by supplier/invoice #; filter by status/date. - Detail drawer/page with PDF/image + extracted fields. - New supplier badge on first invoice from a supplier; duplicate warnings inline. - Done when: pilot users can find/open/approve on mobile & desktop; badges/warnings appear correctly; approval status shown via emoji.
FR-5 Price-hike detection - Compare unit prices for same items from same supplier across invoices. - Trigger alert when price increase exceeds configurable threshold (default 5%). - Show alert popup during approval with % increase and previous price. - Done when: price increases >5% trigger alerts; historical prices tracked; alerts shown pre-approval.
FR-6 Approvals (single & simple multi) - Approve/Reject with optional note. - Rules: by supplier and/or amount threshold; auto-approve under $X and/or for trusted suppliers. - Email notifications to assigned approvers (French). - Done when: routing works; multi-approver shows partial status until complete; auto-approvals logged; audit captures every step.
FR-7 Audit trail - Immutable events: ingested, extracted, approved/rejected (who/when), edited fields (who/what), exported, auto-approved, marked paid, price-hike detected. - Done when: every invoice shows a readable timeline; filterable by event type.
FR-8 Export to Excel - XLSX by date range with: Date facture, Fournisseur, No facture, Montant HT, TPS, TVQ, Total, Devise, État, Approveur, Date d'approbation, Source. - Done when: accountants ingest without transformation; dashboard totals reconcile.
FR-9 Payments (stub) - Payer/Planifier CTA displays: "Paiement bientôt disponible — utilisez 'Marquer comme payé' pour l'instant." - Mark as paid + date updates status and audit. - Done when: paid history maintained with zero funds moved.
FR-10 Localization & accessibility - fr-CA locale for numbers/dates/currency; translation files; WCAG AA basics. - Done when: full French UX; QA verifies fr-CA across UI & Excel.
5) Non-functional requirements¶
Privacy & compliance (Canada/Québec). - Comply with PIPEDA; fr-CA default and complete to align with Québec language requirements. - Provide data subject request path: export user data (CSV/XLSX) and deletion on request.
Security. - HTTPS; magic links + short-lived JWT; per-tenant scoping; GCS signed URLs; inbound signature verification (email/WhatsApp); secrets in Secret Manager; least-privilege IAM.
Reliability. - Idempotent webhooks/workers; at-least-once extraction queue; duplicate detection by provider event IDs + content hash; documented retry policy.
Backups & DR. - Daily managed DB backups (≥7–30 day retention); object storage versioning on invoice files. - RPO ≤ 24h, RTO ≤ 8h; annual restore drill documented.
Performance/UX. - Invoices list within minutes of receipt; PDF/image open is snappy via signed URL streaming.
Observability. - Sentry (FE/BE); structured logs for webhooks/workers; surface extraction failures to UI and daily digest to team.
Future-proofing data. - Line items are always persisted when available to enable price-hike detection and future analytics.
6) Data model (MVP slice)¶
- restaurant(id, name, locale=fr-CA, timezone)
- user(id, email, phone_e164, role {Owner, Approver})
- supplier(id, restaurant_id, display_name, legal_name?, is_trusted boolean default false, default_approver_user_ids jsonb, first_seen_at, expense_category?)
- invoice(id, restaurant_id, supplier_id, supplier_display_name, invoice_no, issue_date, due_date, currency, total, gst_total, qst_total, status {pending, awaiting_approval, approved, rejected, paid}, source {email, whatsapp}, gcs_uri, extract_confidence, created_at, auto_approved boolean default false)
- invoice_line(id, invoice_id, description, qty, unit_price, total, sku?, category?) (required for price-hike detection)
- price_history(id, supplier_id, item_description, sku?, unit_price, invoice_id, recorded_at) (for tracking price changes)
- approval_rule(id, restaurant_id, supplier_id null, amount_gt_cents null, approver_user_ids jsonb, auto_approve boolean default false)
- invoice_approval(id, invoice_id, user_id, decision {approved,rejected}, note, decided_at, price_alert_shown boolean default false)
- audit_log(id, restaurant_id, invoice_id?, user_id?, event, metadata_json, ts)
Notes: Removed supplier GST/QST numbers from data model. Line items and price history tables are required for price-hike detection feature.
7) Architecture & dependencies (decision-locked for MVP)¶
- Frontend: React + Vite SPA; TanStack Query; React-Intl (fr-first); Sentry.
- Backend: FastAPI (Python) on Cloud Run; PostgreSQL (Cloud SQL, private IP); GCS for files (V4 signed URLs); Pub/Sub worker for OCR pipeline; Google Document AI Invoice Parser; inbound email (SendGrid/Mailgun); WhatsApp (Twilio); Secret Manager.
- Ops: Managed backups & object versioning; minimal CI with unit/integration tests; feature flags for calendar & reports.
8) Launch criteria (exit gates)¶
- Happy path proved: Email & WhatsApp → extraction → price-hike detection → approval → Excel export verified by an external accountant.
- French-first QA complete across devices; legal copy reviewed for Québec language compliance.
- Security checklist: webhook signature verification on; no public buckets; secrets managed; Sentry wired.
- Ops readiness: backups enabled, versioning on, restore drill checklist documented.
- Pilot readiness: supplier CC template (fr-CA), approver notification emails configured, price-hike alerts tested, and daily ingestion/extraction failure report.
9) Immediate backlog (v1.0 → v1.1 quick wins)¶
- Calendar toggle on dashboard (read-only due dates).
- Due-date digest (opt-in) + approval nudges.
- Spend by supplier summary + export.
- Smarter dedupe (invoice# + supplier + total + date window + file hash).
- Optional English pack (keep fr-first default).
- Enhanced price analytics dashboard with trend visualization.
10) Explicit non-goals (de-risking)¶
- No funds custody or movement; no CRA/RQ remittances; no QuickBooks/Xero sync in v1 (Excel only). UI stubs allowed.
- No plate-margin screens in v1 (but line items support this in v2).
Why this MVP is "impossible to say no"¶
- Zero-change supplier workflow (CC one address) + WhatsApp for paper = frictionless capture.
- Side-by-side verification + audit = trust & control for a skeptical owner.
- One-click Excel lets them keep their accountant without adopting accounting software.
- Price-hike alerts = immediate value no competitor offers, addressing a major restaurant pain point.