Author: Product Team Status: Draft Last Updated: 2026-02-04
Orcha's billing inbox processes incoming emails through a two-stage classification: a deterministic pre-filter removes spam, followed by an LLM triage that identifies invoices for extraction. Emails that don't match invoice signals (no PDF attachments, no invoice keywords, few financial keywords) are silently dropped.
This creates a blind spot. Business-relevant emails that aren't invoices — IBAN change notifications from suppliers, payment reminders, supplier inquiries, contract updates — are lost without any trace. The AP team has no way to know these emails arrived, and no record that they were discarded.
For a mid-sized company processing hundreds of emails monthly, this means:
Surface business-relevant non-invoice emails in Orcha so the AP team has visibility into all meaningful correspondence arriving at the billing inbox:
| Metric | Target |
|---|---|
| Business-relevant non-invoice emails captured (vs. silently dropped) | 100% — no business email is lost |
| Invoice misclassification rate (invoices wrongly sent to "other") | < 1% — confidence threshold ensures invoices are still extracted |
| AP team awareness of non-invoice correspondence | Visible in UI within same session as invoice review |
| False positives in "other" tab (spam appearing as business-relevant) | < 5% of entries |
Today, emails are binary: either they're invoices (processed) or they're not (dropped). The new model introduces a third category:
| Classification | What it means | What happens |
|---|---|---|
| Invoice | Contains invoices, receipts, or bills to extract | Processed as today (no change) |
| Other | Business-relevant but not an invoice | Metadata stored, shown in "Other" tab |
| Skip | Spam, newsletters, irrelevant content | Discarded (no change) |
"Other" emails are further classified into sub-categories to help the AP team quickly scan and prioritize:
| Category | Examples |
|---|---|
| Payment Reminder | "Your invoice #123 is overdue", "Payment reminder for February" |
| IBAN Change | "Please update our bank details", "New IBAN effective March 1" |
| Supplier Inquiry | "Question about your recent order", "Request for quotation" |
| Employee Info | "New employee starting March 1", "Updated contact details" |
| Contract/Legal | "Renewal notice for contract #456", "Updated terms of service" |
| General Inquiry | "Follow-up on our meeting", business correspondence that doesn't fit above |
| Other | Catch-all for business emails that don't match any specific category |
"Other" emails are stored as metadata only — sender, subject, date, category, and attachment filenames. The email body and attachments are not retained. This is a view-only reference so the AP team knows what arrived; they can look up the original in their email system if needed.
When the system is uncertain whether an email contains an invoice, it should err on the side of processing it as an invoice rather than filing it under "other". A confidence threshold ensures that borderline cases are treated as potential invoices — it's better to over-extract than to miss an invoice.
No new roles are introduced. The "Other" tab is view-only with no actions required.
1. Supplier sends an email: "Please update our IBAN to DE89..."
2. Orcha's pre-filter passes it through (not spam)
3. LLM classifies it as "other" with category "IBAN Change"
4. Email metadata (sender, subject, date, category, attachment names) is stored
5. AP team opens the "Other" tab in document overview
6. They see the entry: "supplier@example.com | Please update our IBAN... | IBAN Change"
7. AP team looks up the original email and updates the IBAN in their banking system
1. An invoice email arrives with an unusual format (no PDF, invoice in email body)
2. LLM classifies it as "other" but with low confidence (< 0.8)
3. System overrides: upgrades the email to "invoice" for extraction
4. The invoice is processed through normal extraction pipeline
5. No data is lost
1. Newsletter email arrives at billing inbox
2. Deterministic pre-filter catches it (known spam sender or subject pattern)
3. Email is discarded — does not appear in "Other" tab or anywhere else
1. Business email arrives that doesn't fit any predefined category
2. LLM classifies it as "other" with category "other" (catch-all)
3. Email appears in the "Other" tab with category label "Other"
4. AP team can still see sender, subject, and date for context
1. Supplier sends a contract renewal with a PDF attachment
2. LLM classifies it as "other" with category "Contract/Legal"
3. Metadata stored includes attachment filename: "contract_renewal_2026.pdf"
4. AP team sees the attachment name in the "Other" tab
5. Attachment itself is NOT stored in Orcha — AP team retrieves it from their email
A new "Other" tab is added to the document overview, alongside the existing tabs (All, Needs Review, Has Errors). The tab shows the count of "other" emails if applicable.
The "Other" tab uses the same date filter as the documents view, ensuring a consistent experience. The AP team can filter by date range to find emails from a specific period.
| Column | Description |
|---|---|
| Received | Date and time the email was received (formatted as DD.MM.YY HH:MM CET) |
| Subject | Email subject line |
| Sender | Sender email address |
| Category | Human-readable category label with badge styling |
| Attachments | Comma-separated list of attachment filenames (if any) |
Categories are shown as human-readable labels with a subtle badge/tag style:
| Internal Value | Display Label |
|---|---|
| payment-reminder | Payment Reminder |
| iban-change | IBAN Change |
| supplier-inquiry | Supplier Inquiry |
| employee-info | Employee Info |
| contract-legal | Contract/Legal |
| general-inquiry | General Inquiry |
| other | Other |
| Edge Case | Behavior |
|---|---|
| Invoice classified as "other" with low confidence | Upgraded to "invoice" and processed through extraction (confidence < 0.8 threshold) |
| LLM returns an unrecognized classification | Defaults to "other" / "General Inquiry" — never throws an error or retries indefinitely |
| LLM returns an unrecognized category | Defaults to "Other" catch-all category |
| Email contains prompt injection in subject/body | Email content is sanitized before LLM processing; classification should be unaffected |
| Same email processed twice (message queue retry) | Duplicate metadata entries are acceptable — view-only tab, low impact |
| Storage failure when saving "other" email metadata | Logged as error but does not block the email processing pipeline |
| Email with no subject | Displayed with empty subject column |
| Email with many attachments | Attachment names truncated with ellipsis after reasonable length |
| Adding new categories in the future | "Other" catch-all handles unknown categories without requiring system changes; new named categories can be added as needed |
flowchart TD
START(["Email arrives at billing inbox"]) --> PREFILTER{"Deterministic\nPre-Filter"}
PREFILTER -->|"Spam / Irrelevant"| DISCARD(["Discard\n(no trace)"])
PREFILTER -->|"Passes"| LLM{"LLM\nClassification"}
LLM -->|"Invoice"| EXTRACT(["Process through\nextraction pipeline"])
LLM -->|"Skip"| DISCARD
LLM -->|"Other"| CONFIDENCE{"Confidence\n≥ 0.8?"}
CONFIDENCE -->|"No — uncertain"| EXTRACT
CONFIDENCE -->|"Yes — confident"| CATEGORIZE["Assign sub-category:\nPayment Reminder, IBAN Change,\nSupplier Inquiry, Employee Info,\nContract/Legal, General Inquiry,\nOther"]
CATEGORIZE --> STORE["Store metadata only:\nSender, Subject, Date,\nCategory, Attachment filenames"]
STORE --> DISPLAY(["Display in 'Other' tab"])
style DISCARD fill:#f4f4f4,stroke:#999,color:#666
style EXTRACT fill:#e8f5e9,stroke:#4caf50
style DISPLAY fill:#e3f2fd,stroke:#2196f3