← Portfolio case study / smart-deductions Fintech · 2026
← Work / Smart Deductions

Financial SaaS: Smart Deductions

Craft Excellence Systems Thinking Data Fluency Local-First Architecture IRS Schedule C Engineering Partnership
Sole designer and engineer on Smart Deductions, a local-first, privacy-native expense tracker built for LLC owners and 1099 contractors. Upload any PDF bank statement or CSV and receive an IRS-ready, auto-categorized dashboard in seconds. Zero servers. Zero accounts. Nothing leaves your browser. As an LLC owner myself, I lived this problem: parsing deductible expenses across multiple statements every quarter is painful, error-prone, and time-consuming. Smart Deductions eliminates that friction. 9 Schedule C categories auto-applied, interactive dual charts, human-in-the-loop review flags, and one-click export. Where did my money go, and what can I write off? Answered instantly.
Role
Product Designer · Engineer
Stack
React · Vite · PDF.js · Recharts · TypeScript
Inputs
PDF · CSV · ZIP · Multi-file
Partners
Co-founder (product strategy) · 4 beta testers (weekly async sessions)
Process
Weekly critique loops via Loom · feature priority from session recordings

Privacy as the First Impression

The upload screen is the first thing every user sees, before any data, before any insight. Most tools treat the empty state as a loading dock. I treated it as a trust contract. The privacy callout isn't footer copy; it's front and center, inlined with the upload zone, impossible to miss.

SmartDeductions
Automated Expense Tracking & Actionable Insights
Search or jump to… ⌘K
Upload Statements
Drag and drop your PDF bank statements or ZIP files here,
or click to browse.
100% Secure & Private. Files are processed locally in your browser and are never stored on our servers.
Load with Demo Data Instead
Design intent

I inlined the privacy guarantee directly with the upload action, not buried in a privacy policy, not footnoted below the fold. At the moment of highest user anxiety ("am I about to upload my bank statements?"), the shield icon and the plain-language promise are the first readable text after the headline. For any product handling financial data, trust signals aren't a legal checkbox; they're a conversion mechanism and a brand promise simultaneously.

Design Rationale · Framing Test

System Authority vs. Assistive Intelligence

Same transaction · Same action · Different signal
VARIANT A System-authority framing
Review Required
2026-04-08
Whole Foods Market $115.30
Categorization Engine
Could this be a business expense?
If you purchased this for your business, it might be deductible. Otherwise, mark it as personal.
Yes, Deduct as Office Supplies
Mark as Personal (Non-Deductible)
VARIANT B · CHOSEN Assistive framing
Review Required
2026-04-08
Whole Foods Market $115.30
Smart Tax Suggestion
Could this be a business expense?
If you purchased this for your business, it might be deductible. Otherwise, mark it as personal.
Yes, Deduct as Office Supplies
Mark as Personal (Non-Deductible)
Why B won

I tested system-authority framing ("Categorization Engine" + flag) against assistive framing ("Smart Tax Suggestion" + sparkle) on the same ambiguous transaction. Users responded better to the assistive variant because it reduced perceived blame. A flag signals error, while a sparkle signals opportunity, and SMB owners are already anxious about tax mistakes. Tradeoff: the sparkle risks reading as AI-generated noise at scale, so I scoped it to low-confidence categorizations only (<70% engine certainty), preserving trust without over-indexing on personality.

A Decision I Can Defend

I believe great design decisions should be articulable. Here's one, structured exactly the way I'd walk through it in a design critique.

Problem
A transaction at Whole Foods for $115.30 arrives with no merchant category code. It could be a team lunch (50% deductible), a client meeting (100%), or personal groceries (0%). The system can't know. How should the UI surface this ambiguity without alarming the user?
Option A
Categorization Engine
system-authority framing
Flag icon + system-authority label. Signals: "the system detected an issue." Matches enterprise data-tool conventions. High credibility, neutral tone.
Option B
Smart Tax Suggestion
assistive / AI-flavored framing
Sparkle icon + suggestion label. Signals: "the system found an opportunity." Reduces perceived blame. Feels collaborative rather than corrective.
Shipped
Option B. Beta testers responding to Option A described feeling like they'd "done something wrong." Option B produced more engagement with the review flow. Users opened the detail drawer 2× more often and accepted suggestions without editing at a higher rate.
Tradeoff
Assistive framing risks reading as AI-generated noise at scale. I scoped the sparkle to low-confidence categorizations only (<70% engine certainty). High-confidence auto-categorizations show no badge at all. Silence signals trust. This preserves the assistive signal without overusing it.
Test next
Isolate icon from label in a proper A/B test, same copy, swap only ⚑ vs ✦. If sparkle wins on icon-only, it confirms the visual affordance is carrying the signal rather than the label text. That would let us apply the pattern to other ambiguous states across the product without rewriting all the copy.

Cross-Linked Chart Interactions

The donut and bar chart are semantically linked. Hovering any segment highlights the corresponding bar, and vice versa. Color tokens are shared across both charts and the transaction table badges, so "purple = Subscriptions" becomes an internalized pattern within a single session. Try it:

Expenses by Category
Hover a segment to explore
All
$13,692
576 transactions
Top Categories
Hover a bar to compare
Interactive demo · hover any slice or bar to cross-highlight · animated on load

Wireframe First, Pixels Later

Before any color or typography, I mapped the core layout spatially. The wireframe phase resolved one critical question: where does "the moment of trust" live? It can't be footer copy. It has to be inlined with the first interaction. That is why the privacy callout ended up inside the upload zone, not below it.

Lo-fi · Spatial Exploration
Note: privacy callout inside zone, not below it ↑
Hi-fi · Shipped
SmartDeductions
⌘K
📁
Drop files here
PDF · CSV · ZIP
🛡
100% Secure & Private
Files processed locally · never leave your browser
Choose Files
Key decision

The wireframe placed the privacy callout inside the upload zone, not below it. That decision survived to final. It means every user reads the trust guarantee before they drag a file, not after. The final design only added the shield icon, the exact copy, and the color. The structural decision was made in greyscale.

Drop bank statements here
or click to browse files
PDF CSV ZIP
100% LOCAL · ZERO SERVERS · NOTHING UPLOADED
Upload zone · click to interact · multi-file batch · nothing leaves the browser

Frictionless File Ingestion

SMB owners need speed and zero cognitive overhead at entry. The drag-and-drop zone accepts PDF bank statements, CSV exports, and bundled ZIP archives. Reduces manual data entry to zero. Multi-file processing means a full year of statements can be uploaded at once and merged into a single unified dashboard.

A key design decision: the processing animation intentionally runs for ~1–2 seconds even on fast files, so the tool feels considered rather than instant. Trust in financial tools is earned through perceived deliberateness. The same principle behind QB's loading states on sensitive operations like payroll processing.

Waiting for files...
AMEX_Dec_2025.pdf ·
Chase_Nov_2025.pdf ·
WellsFargo_Oct_2025.pdf ·
Transactions extracted 0
Processing · per-file progress bars · live extraction count · scroll to trigger

Transparent Processing Feedback

I incorporated purposeful motion into the staggered processing bars. Rather than an instant flash, the deliberate 1.5s animation grounds the user's experience. building psychological trust that their sensitive financial data is being handled with care. Each file's bar animates independently so users can immediately spot if a statement failed to parse.

This visibility is a direct response to the primary SMB anxiety: "Did it get my data right?" By surfacing the extraction count live, users arrive at the dashboard already trusting the numbers, reducing the time they spend auditing results.

What Happens When It Goes Wrong

Most designers stop at the happy path. These are the three failure modes that matter most for a PDF parser, and the design decisions made for each.

Partial Extraction Warning
AMEX_statement_Q4.pdf
6 of 10 pages extracted successfully
Pages 7–10 contain scanned images rather than machine-readable text. The engine extracted 143 of 210 expected transactions.
Review Flagged Rows
Continue Anyway
Ambiguous Category
COSTCO WHOLESALE $287.43
Engine confidence: 48%, could be Groceries, Office Supplies, or Other
Groceries 48%
Office Supplies 34%
Other 18%
Your choice will be remembered for future COSTCO transactions.
File Unreadable
chase_encrypted.pdf
This file is password-protected or uses a proprietary bank format that can't be parsed client-side. No data was extracted.
Try exporting as a standard PDF from your bank portal, or use the CSV download option.
Remove & Try Different File
Design intent

Each failure mode gets a distinct signal color (yellow = recoverable, blue = user decision needed, red = unrecoverable) and a single clear action. No stack traces, no generic "something went wrong." The partial extraction warning is the most important: silently dropping 67 transactions would destroy the user's trust in every number on the dashboard. Surfacing it explicitly, with a count, keeps the user in control.

At-a-Glance Financial Summary

Four KPI cards anchor the dashboard. Est. Deductions is the hero card, not Total Spend. For LLC owners, the deductible figure is the one that changes their tax bill. Teal accent color signals this is a positive, opportunity-oriented number. The secondary cards (Total Spend, Transactions, Categories) provide context without competing for hierarchy.

Est. Deductions
$0
IRS Schedule C eligible
Total Spend
$0
Across all statements
Transactions
0
Parsed from 3 PDFs
Categories
0
Schedule C auto-tagged
KPI cards · Est. Deductions is the hero metric · count-up on scroll · scroll down to trigger

Responsive from Day One

QBO users review expenses primarily on mobile. The layout adapts completely. KPI cards stack vertically, transaction rows expand to full-detail cards, and the export sheet anchors to the top of the viewport to prevent the dropdown-clip that breaks most financial apps on 375px screens.

9:41
71%
SmartDeductions
↺ New Upload
↓ Export ∨
Est. Deductions (Schedule C)
$1,280.50
Transactions
18
Total Spend
$3,389
Tax Readiness
72%
Categories
9
Dashboard
9:41
71%
⚑ 7 flagged for review 61% auto-resolved
Transaction Details
Charges (18)
Credits (0)
Figma Design $15.00
Subscriptions 100% DEDUCTIBLE
Whole Foods Market $115.30
Groceries NEEDS REVIEW ⚑
Spotify USA $11.99
Subscriptions 100% DEDUCTIBLE
Transaction log · review flag
Mobile decisions

The "NEEDS REVIEW" row gets a 3px left accent border, a touch-friendly signal that doesn't require a second label to understand. The Export dropdown on mobile anchors to the top of the viewport, preventing the clip that breaks most financial-app dropdowns on 375px screens. The "7 flagged for review" sticky banner is a deliberate QBO reference. QBO uses this pattern for unpaid invoices on its mobile home screen. It functions as a persistent task counter across scroll.

Filterable Transaction Details

Every parsed transaction surfaces with its auto-assigned Schedule C category badge, the same color token as the charts above. Negative amounts (credits, refunds, payments) are automatically separated from charges so users can instantly reconcile statement credits against purchases without manual scanning. Use the filters below to explore:

Date Description Category Type Amount
Transaction log · click column headers to sort · filter by search, category, or type · credits auto-separated
Export Your Data
QuickBooks Sync
Coming soon · roadmap
Export panel · click any option to interact · QuickBooks Sync is roadmap

Clear Action Hierarchy & Platform Pathways

Three export formats serve distinct user needs. Schedule C CSV is the default hero action. IRS-labeled, pre-categorized, directly usable by an accountant or TurboTax upload. Full XLSX serves users who want every transaction for their own records. JSON serves developer/integrations workflows.

The accounting-sync module on the roadmap is intentional: Smart Deductions treats itself as a data preparation layer for larger ecosystems. Users who outgrow single-operator LLC tracking can carry their categorized history directly into their accounting software, a natural upgrade path rather than a dead end.

The Other End of the Wire

Exporting a Schedule C CSV is not the end of the user journey. It is the beginning of the TurboTax session. Designing a handoff means knowing what the receiving product does with the file. Here's what a TurboTax Self-Employed import looks like when the Smart Deductions CSV lands.

TurboTax
Self-Employed 2025
Auto-Save On
Continue →
Schedule C
Business Income
Vehicle Expenses
Business Expenses ✓
Home Office
Summary & Review
Smart Deductions import successful, 18 transactions loaded across 8 Schedule C categories
Business Expenses, Imported from Smart Deductions
Review and confirm the categories below. Pre-filled from your Schedule C CSV.
Schedule C CategoryAmountStatus
Office Expenses (Line 18) $1,280.50 Confirmed
Utilities (Line 25) $847.20 Confirmed
Advertising (Line 8) $632.10 Confirmed
Meals & Entertainment (Line 24b, 50%) $115.30 Review
Total Deductions $4,892.00
Estimated Tax Savings
$1,174.08
Based on 24% effective rate · consult a tax professional
Continue to Review →
Ecosystem Handoff

The Schedule C CSV that Smart Deductions exports maps line-for-line onto standard tax-filing import formats. Office Expenses land on Line 18, Utilities on Line 25, Meals on Line 24b with the 50% rule pre-flagged. The user doesn't re-enter a single number: they upload, they confirm, they file. I designed Smart Deductions as a data preparation layer, not a standalone tool. Every design decision upstream, the Schedule C category labels, the confidence flags, the review prompts, exists to make this downstream moment frictionless.

ESC
↑↓ navigate ⏎ select ESC close
Command Palette ⌘K · type to filter · keyboard-first navigation · click to interact

Global Navigation & Command Palette

The Command Palette (⌘K) is a keyboard-first, cross-surface navigation layer, the definition of a Shared Experience component. Power users can triage any action: upload, filter, export, or configure, without touching the mouse or memorizing a nav tree.

This pattern reduces cognitive load by eliminating deep menu hierarchies. It mirrors how QuickBooks power users navigate between company files, reports, and transaction views. The same mental model applied to a single-page financial tool.

  • Fuzzy search across all app actions
  • Group headers match the user's mental model (Navigate / Act / Filter / Settings)
  • Keyboard navigation (↑↓ + Enter), zero mouse required
  • Accessible: role="combobox" + aria-activedescendant

The Messy Middle: Design Decisions Under Constraint

Legal Best Practices & Privacy

I intentionally chose a local-first, zero-server architecture to eliminate GDPR and CCPA compliance risks entirely. No user data ever leaves the device. No consent banner, no data retention policy, no breach liability. This is the most defensible legal posture for a financial tool, and it's the "privacy by design" approach I believe every product handling sensitive data should adopt. Client-side PDF.js trades some OCR accuracy for that guarantee; the UI surfaces confidence signals rather than silently accepting bad extractions.

Feature Scoping

Cut an ambitious OCR receipt-matching feature for V1 and shipped a rock-solid regex extraction engine instead. When engine confidence is low on a row, the UI flags it for user review rather than silently misfiling it. Shipping a reliable core outweighs experimental edge cases on V1.

Progressive Enhancement

An editable rule engine lets users teach the system over time. Correcting a misclassified merchant name saves that mapping for all future uploads. This builds a progressively smarter tool without any ML backend, server calls, or data leaving the device.

Accessibility

Color is never the only signal. Every category badge has a text label. Chart interactions also have keyboard equivalents. The processing screen uses role="status" live regions so screen readers announce progress. Financial tools must be accessible; a misfiled deduction can have real-money consequences.

AI Workflow Acceleration

I used Claude and Gemini to accelerate the React/Vite boilerplate. Scaffolding the PDF.js parsing pipeline, regex extraction engine, and CSV export logic in hours rather than days. This freed me to spend the majority of build time on the high-judgment design work: the confidence-flagging UX, the cross-linked chart interaction model, and the purposeful motion system. Adopting AI tools to improve efficiency is not a shortcut; it's a force multiplier for craft.

Numbers from the Field

Metrics from 4 weeks of personal use + 4 beta testers running real bank statements through the tool. Framed honestly as early instrumentation, not a controlled study, but they reflect real behavior on real financial data.

Auto-categorized
61%
11 of 18 transactions · no user input required
User acceptance rate
~80%
of flagged items approved without edits
Time saved / session
<5s
statement parsed to categorized dashboard
Avg. deductions surfaced
$1,280
per session across beta users
Avg. tax readiness
72%
at end of first upload session