PassaNota
Every receipt recorded. Every expense under control.
Cost control via fiscal invoices
PassaNota
Interactive preview — try the live demo for the full experience
PassaNota is a B2B expense-control platform for Brazilian businesses. Teams photograph fiscal receipts on desktop or paired mobile devices; a vision LLM pipeline extracts structured data — vendor, line items, totals, and dates — without manual entry. Managers get dashboards with spend trends, category breakdowns, and top products, while operators capture receipts in the field. The system supports multi-company tenancy, role-based access, and platform-level admin tooling, deployed on GCP Cloud Run with Supabase auth and service-to-service IAM between frontend and API.
End-to-end AI receipt pipeline — OpenCV document preprocessing plus multi-provider vision LLM extraction
Production BFF architecture — Next.js proxy with Cloud Run IAM, Supabase JWT forwarding, and multi-tenant headers
Multi-tenant SaaS design — gestor/operador roles, QR + PIN device pairing, platform admin overview
Split architecture — Next.js frontend (`passanota-web`) and FastAPI backend (`passanota-api`) on GCP
- ›AI-powered receipt capture via file upload or live camera with document detection
- ›Async background processing with capture status tracking via Cloud Tasks
- ›Spend dashboard — totals, average ticket, period comparison, category and emitter charts
- ›Paginated invoice list with detailed line-item views and AI confidence badges
- ›Manual item editing and categorization when extraction needs correction
- ›Semantic product search over invoice line items using pgvector embeddings
- ›Multi-company support with empresa switcher and isolated tenant data
- ›Mobile device pairing (QR code + PIN) for field operators without full login
- ›Passwordless Supabase magic-link authentication with profile completion flow
- ›Platform admin panel — company metrics, usage tracking, and tenant management
The Next.js app routes all API calls through a BFF proxy at `/api/proxy/*`, forwarding the Supabase Bearer token, `X-Empresa-Id`, and device tokens. In production, the proxy swaps the user JWT for a Cloud Run IAM ID token to reach the private FastAPI service. The API runs an async pipeline: store photo in Supabase Storage, enqueue Cloud Tasks, OpenCV preprocess, vision LLM extract, persist items, then SQL-normalize categories with keyword and embedding refinement. Semantic search uses pgvector HNSW indexes on multilingual sentence embeddings.
- 01Vision LLMs handle messy thermal receipts better than template OCR — preprocessing with OpenCV still matters for extraction quality
- 02A BFF layer with Cloud Run IAM is the cleanest way to keep the API private while forwarding Supabase user context
- 03Hybrid categorization — LLM first pass plus SQL keyword/embedding refinement — keeps taxonomy consistent across tenants