Process Overview — 11 Steps
📧 Email In → AI Extraction → Database → 📤 Email Out
Detect PDF
Attachment
n8n / Inngest
Store PDF
to S3
Cloudflare R2
Create DS1
Record
Supabase
Pre-process
PDF
pdfplumber
Claude AI
Extraction
Claude API
Save DS1–DS4
to Database
Supabase PG
Generate
Transaction CSV
Python / pandas
Send Reply
Email
Gmail API
Swimlane Detail — by System
- Watch inbox for new emails
- Filter by subject keywords (HUD, ALTA, Settlement)
- Detect PDF attachment
- Extract sender, subject, date
Gmail API Watch
- Reply to original sender
- Attach original HUD PDF
- Attach transactions CSV (DS4)
- Include extraction summary
Gmail API Send
⚙️ Workflow
Orchestration
n8n / Inngest
- Gmail webhook fires on new email
- Parse email metadata
- Download PDF attachment
- Trigger pipeline workflow
Webhook trigger
n8n Gmail node
- Enqueue async extraction job
- Pass S3 file reference
- Set retry policy (3× on fail)
- Track job status
Inngest event
- Check confidence scores
- Route low-confidence to review queue
- Mark status: auto / needs_review
n8n if-node
- Assemble output files
- Trigger email send node
- Log completion event
n8n email node
☁️ File
Storage
Cloudflare R2 / S3
- Upload original PDF (immutable)
- Path: /originals/{doc_id}.pdf
- Generate checksum (SHA-256)
- Store signed URL reference
R2 PUT
Zero egress fees
- Save generated CSV
- Path: /exports/{doc_id}_erp.csv
- Generate download URL
R2 PUT
🤖 AI
Engine
Claude API + pdfplumber
- pdfplumber extracts raw text
- Detect & extract tables
- Normalise whitespace & layout
- Prepare prompt context
pdfplumber
PyMuPDF
- Send text to Claude claude-sonnet-4-6
- Prompt: extract DS1–DS4 JSON
- Returns structured JSON + confidence
- Validate with Pydantic schema
Claude claude-sonnet-4-6
JSON output
🗄️ Database
Supabase / PostgreSQL
- Insert document registry row
- Status: "ingested"
- Store source_file, received_date
INSERT DS1
- Upsert DS2 — transaction details
- Bulk insert DS3 — line items (47 rows)
- Bulk insert DS4 — ERP entries
- Update DS1 status → "extracted"
UPSERT DS2
BULK DS3
BULK DS4
📤 Output
Generator
Python / pandas
- Query DS4 ERP entries by doc_id
- Format: description, Dr/Cr, amount, date, acct code
- Calculate totals & validate balance
- Write transactions_{doc_id}.csv
- Attach to outbound email
pandas to_csv
ERP-ready format
Tools Used — Don't Build the Wheel