Skip to content

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)

  1. Concierge onboarding + supplier kit (French)
    After signup, show the unique capture email, copy-paste supplier message (fr-CA), and register/whitelist WhatsApp numbers.

  2. Invoice capture

  3. Unique inbound email per restaurant; process PDF/JPG/PNG attachments only.
  4. Link-only emails (e.g., "view/download" links) auto-reply in French asking for a PDF and are ignored.
  5. WhatsApp photo intake from pre-registered numbers (no separate app).

  6. Extraction & review

  7. OCR/AI extraction of supplier, invoice #, issue date, due date, currency (CAD), total, GST, QST.
  8. Auto-categorization of invoices into expense types (COGS, Utilities, Professional Fees, Meals, etc.) based on supplier and line-item data.
  9. Store the original file; side-by-side verify; inline edits; confidence cues.

  10. Dashboard

  11. Lists Awaiting Approval / ✅ Due in X days / ✅ Overdue X days with search & filters.
  12. New supplier badge for first-time suppliers.
  13. Duplicate detection (invoice# + supplier + total + date window) with clear warning.
  14. Quick open of source PDF/image.
  15. Total outstanding balance across all suppliers, showing the combined amount owed for all open invoices (awaiting approval + approved)
  16. 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.
  17. 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.

  18. Approval workflow & audit

  19. Approve/Reject with optional note; rules by supplier and/or amount threshold (e.g., "> 3 000 $ requires Owner + Manager").
  20. Auto-approve under $X and/or for trusted suppliers (log in audit).
  21. Email notifications to assigned approvers (French).
  22. Immutable audit trail per invoice.

  23. Excel export (accountant-ready)

  24. 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)
  25. Expenses by Categories tab showing totals by tax category (e.g., COGS, Legal & Professional Services, Utilities, Dues & Subscriptions), including GST/QST amounts.
  26. Filename: poutineai-factures---.xlsx.

  27. Price-hike alerts 🔥 KEY DIFFERENTIATOR

  28. Store line items per supplier and flag when the same item appears at a higher unit price in future invoices
  29. Pop-up alert shown at the approval stage when price increases detected
  30. Configurable threshold alerts (e.g., >5% increase)
  31. Historical price tracking per item per supplier

  32. Payments: stub only

  33. Show Pay/Schedule CTA but route to "Mark as paid" with paid date; no money movement; update status + audit trail.

  34. French-first, responsive web app

  35. fr-CA strings, dates, currency as default; responsive desktop/tablet/phone; WCAG AA basics.

  36. 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)

  1. 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.

  2. 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.

  3. 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 ✔".

  4. 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.

  5. Export
    Select date range → Télécharger Excel → accountant imports; GST/QST amounts included.

  6. 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)

  1. Happy path proved: Email & WhatsApp → extraction → price-hike detection → approval → Excel export verified by an external accountant.
  2. French-first QA complete across devices; legal copy reviewed for Québec language compliance.
  3. Security checklist: webhook signature verification on; no public buckets; secrets managed; Sentry wired.
  4. Ops readiness: backups enabled, versioning on, restore drill checklist documented.
  5. 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.