Deductify

Deductify: AI Tax Deduction Scanner

Upload expenses, scan in seconds, and get estimated deductions and tax savings.

Workflow

  1. Upload expense files (CSV, PDF, or receipts)
  2. AI scans expenses
  3. Finds deductions
  4. 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.

Sample CSV (date, description, amount)
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
Scan result (excerpt)
DateDescriptionAmountDeduction
2024-01-15Adobe Creative Cloud subscription$54.99Potential
2024-01-18WeWork monthly desk$320.00Potential
2024-01-22Uber to client meeting$24.50Potential
2024-02-05Delta flight SFO-JFK$412.00Potential
............

How it works (code)

Scan logic and AI integration — the parts that make it work.

parseCSV & deduction check
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));
}
Gemini 2.5 — AI feedback
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;