Unwrapped

Legacy SaaS dossier · expensify

Expensify

Expensify

CategoryExpense managementExpensify Collect, 250 employeesSite ↗

Receipt OCR, an approval queue and a CSV to your accounting system, wrapped in a per-active-user fee that bites the month everyone travels.

01 · Data

Data the SaaS sits on

Receipts
ReceiptsYours
QuickBooks / NetSuite
QuickBooks / NetSuiteAPI
Card feed
Card feedAPI
SSO
SSOYours

Internal Build Score

0.62

Feasibility of a useful internal substitute for the actually-used 20% of this SaaS, built with Claude and your own data layer.

IBS = 0.25·U + 0.25·C + 0.20·D + 0.15·I + 0.15·Mthis record · 62%
  • U

    User adoption gap

    weight 0.250.70

    How much licensed surface area sits idle.

  • C

    Core simplicity

    weight 0.250.65

    How small the actually-used 20% is when re-implemented honestly.

  • D

    Data portability

    weight 0.200.50

    How clean the exit is, exports, formats, audit lock.

  • I

    Integration burden (inverse)

    weight 0.150.50

    How few external systems must keep working through the SaaS.

  • M

    Moat erosion

    weight 0.150.70

    How much the original differentiator has been commoditised by LLMs + cheap infra.

Editorial heuristic. Not investment advice, not a procurement recommendation.

03 · Feature usage

Commonly used vs. rarely touched

Commonly used

05

  • Receipt capture and OCR
  • Expense report assembly
  • Approval workflow by manager
  • Policy rule checks
  • Export to accounting system

Rarely touched

06

  • Per-active-user pricing that spikes monthly
  • Expensify Card program
  • Travel booking
  • Bill pay and invoicing
  • A chat product bolted on
  • Concierge and audit upsells

Internal build

Build it yourself

01 · Stack & flow

Claude vision
Claude vision
Postgres
Postgres
Slack approvals
Slack approvals
S3
S3

Internal build map

Data in

Receipt
Policy
Card feed

Agent layer

Receipt extractor

Logic

match to card txn
policy check
manager approval
accounting export

Outputs

Expense line
Accounting batch
Build time
8 weeks
Run cost
$4/seat·mo
vs. SaaS
$45K / yr

Build outline

  1. Receipt upload to S3
  2. Claude vision extracts line fields
  3. Policy rules check + manager approval in Slack
  4. Export batch to the accounting system
  5. Audit log per report

02 · Build it

Paste into Cursor or Claude Code in an empty repo. It scaffolds the working core, with the AI step embedded.

Build prompt · Expensify

// Build: internal expense capture (Expensify replacement) # Paste into Cursor or Claude Code in an empty repo. Build an internal expense tool covering the part of Expensify we use: receipt capture + OCR, report assembly, approvals, and an accounting export. Keep the accounting system and any card program as-is. Stack: Next.js + Postgres (Drizzle) + S3 + Claude (vision) + Slack. Data model: - receipts(id, user_id, s3_key, merchant, date, total, currency, tax, category, reimbursable, policy_flags jsonb, status) - policy(categories[], limits jsonb, receipt_rules jsonb) Build, in order: 1. Upload a receipt photo to S3. 2. Extract fields with Claude vision: """ From one receipt image + the policy (categories, per-category limits, receipt rules), return JSON { merchant, date(YYYY-MM-DD), total, currency, tax, category(from policy only, else "uncategorised"), reimbursable(bool), policy_flags[] }. Never approve; flag only. """ 3. Manager approval in Slack (approve/deny buttons). 4. Nightly export of approved lines to the accounting system (CSV/API). Skip: the card program, travel booking, bill pay, chat. Done when: snap a receipt, fields fill, a manager approves, and it lands in the accounting export.

03 · Result

Extract an Uber receipt for $48.20
rcpt:9921

category: Travel · reimbursable: true · flags: none