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