Deductify
Deductify: AI Tax Deduction Scanner
Upload expenses, scan in seconds, and get estimated deductions and tax savings.
Workflow
- Upload expense files (CSV, PDF, or receipts)
- AI scans expenses
- Finds deductions
- Shows tax savings
Potential deductions found
38
Estimated tax savings
$4,200
Free for now - no login required.
CSV format:
date,description,amount. Example categories detected:
software, office, travel, internet, phone, ads, meals.
Upload a CSV file to begin.
Example input & output
Realistic CSV and the kind of results you get.
date,description,amount 2024-01-15,Adobe Creative Cloud subscription,54.99 2024-01-18,WeWork monthly desk,320.00 2024-01-22,Uber to client meeting,24.50 2024-01-25,Office supplies Staples,89.00 2024-02-01,Google Workspace Business,12.00 2024-02-05,Delta flight SFO-JFK,412.00 2024-02-10,Hotel Marriott NYC,189.00 2024-02-14,Meal with client - downtown,78.00 2024-02-20,Internet Comcast Business,99.00 2024-02-28,Facebook Ads campaign,250.00
| Date | Description | Amount | Deduction |
|---|---|---|---|
| 2024-01-15 | Adobe Creative Cloud subscription | $54.99 | Potential |
| 2024-01-18 | WeWork monthly desk | $320.00 | Potential |
| 2024-01-22 | Uber to client meeting | $24.50 | Potential |
| 2024-02-05 | Delta flight SFO-JFK | $412.00 | Potential |
| ... | ... | ... | ... |
How it works (code)
Scan logic and AI integration — the parts that make it work.
function parseCSV(text) { const lines = text.split(/\r?\n/).filter(Boolean); return lines.slice(1).map(line => { const [date, description, amount] = line.split(","); return { date, description, amount: parseFloat(amount) }; }).filter(r => r.description && !isNaN(r.amount)); } function isDeductible(description) { const low = description.toLowerCase(); return DEDUCTIBLE_KEYWORDS.some(k => low.includes(k)); }
const res = await fetch( `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=${apiKey}`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ contents: [{ parts: [{ text: prompt }] }] }) } ); const text = data?.candidates?.[0]?.content?.parts?.[0]?.text;