Examples
See practical automations in action
Run each demo with sample data directly in your browser. Everything stays local—no upload required.
Clean messy duplicate contacts (25k+ rows)#
Merge contacts from multiple CSVs, normalize emails and names, and safely dedupe 25k–50k rows with a review report.
Steps
- Load 2–3 CSV exports (CRM, newsletter, spreadsheets)
- Validate and normalize columns (emails, names, phones)
- Lowercase + trim emails, strip whitespace & weird characters
- Standardize name casing (e.g. "joHN" → "John")
- Detect exact duplicates by email + phone
- Generate a review table with "keep/merge/drop" decisions
- Write out a cleaned, deduped master file and an audit log
See code excerpt
// Normalize name + email then dedupe
const { emailCol, fullNameCol, firstNameCol, lastNameCol } = resolveColumns(rows);
const seen = new Set<string>();
const out: Row[] = [];
for (const r of rows) {
const email = (r[emailCol] || "").trim().toLowerCase();
const name = fullNameCol && r[fullNameCol]
? r[fullNameCol]
: `${firstNameCol ? r[firstNameCol] : ""} ${lastNameCol ? r[lastNameCol] : ""}`.trim();
const cleanName = name.replace(/\s+/g," ").replace(/\b\w/g,m=>m.toUpperCase());
const normalized = { ...r, email, name: cleanName };
if (!email || !seen.has(email)) {
if (email) seen.add(email);
out.push(normalized);
}
}Try it with sample data
Runs in your browser. No upload required.
CSV → Branded PDF invoices (multi-client batch)#
Turn a raw CSV of 500–2,000 line items into grouped, branded invoices with taxes, subtotals, and ready-to-send PDFs.
Steps
- Import CSV with raw line items (client, project, hours, rate)
- Validate required columns and flag malformed rows
- Group line items by client + invoice # or billing period
- Calculate subtotals, taxes, and final balances
- Inject data into a branded invoice template (logo, colors)
- Export one PDF per client + an all-in-one archive
- Optionally generate a CSV of invoice metadata for your system
See code excerpt
// Normalize customer + amount from flexible CSV
const cols = Object.keys(rows[0]);
const customerCol = findCol(['customer','client']);
const amountCol = findCol(['amount','total']);
const hoursCol = findCol(['hours','qty']);
const rateCol = findCol(['rate','price']);
const normalized = rows.map(r => ({
...r,
customer: r[customerCol],
amount: amountCol ? r[amountCol] : (parseFloat(r[hoursCol]) || 0) * (parseFloat(r[rateCol]) || 0),
}));Try it with sample data
Runs in your browser. No upload required.
Rename, classify & sort 1,000+ receipts#
Rename mixed JPG/PDF receipts using dates, vendors, and amounts, then sort into job and month folders with an audit log.
Steps
- Scan a folder with hundreds of receipts (JPG, PNG, PDF)
- Extract dates from filenames and text (multiple formats)
- Parse vendors & amounts where possible; flag ambiguous files
- Generate standardized filenames: YYYY-MM-DD_Vendor_Amount.ext
- Map receipts to client/job folders based on naming rules
- Move files into Year/Month/Client folders
- Output a summary CSV of all renamed and moved receipts
See code excerpt
// Extract date from messy filename
const date =
receipt.date ||
extractDateFromFilename(receipt.name) ||
"2024-01-01";
const newName = `${date}_receipt_${cleanBase}.${ext}`;Try it with sample data
Runs in your browser. No upload required.
Analyze 10k–50k Orders — Instant Pivot & Chart#
Turn a massive multi-channel orders CSV into weekly revenue, AOV, and top-product insights with interactive pivot charts.
Steps
- Load a large orders CSV (10k–50k rows)
- Normalize dates, channels, and product/category names
- Handle refunds, discounts, and canceled orders
- Group by week, channel, and product category
- Calculate revenue, order count, and average order value (AOV)
- Generate pivot-ready data for charts and summaries
- Render interactive charts (by week, channel, and category)
See code excerpt
// Compute total if missing, parse mixed dates
const orders = rawOrders.map(o => ({
...o,
total: o.total || (o.subtotal - o.discount + o.shipping + o.tax)
}));
const d = parseDateFlexible(o.order_date); // supports 2025-01-02, 03/01/2025, etc.Try it with sample data
Runs in your browser. No upload required.
Mail-merge → PDFs & Draft Emails (segmented)#
Take a messy contacts/export CSV, validate it, dedupe it, and generate segmented PDF letters plus email drafts in one run.
Steps
- Load or validate CSV (names, addresses, emails, segments)
- Check for missing fields and flag invalid rows
- Optionally dedupe by email or household
- Stamp data into a branded letter/email template
- Generate one PDF per row + an indexed ZIP archive
- Create ready-to-send email drafts or an email-tool import file
- Output a run log with counts, skips, and errors
See code excerpt
// Flexible mail-merge mapping
const customerIdx = findIdx(['customer','client']);
const amountIdx = findIdx(['amount','total']);
const hoursIdx = findIdx(['hours','qty']);
const rateIdx = findIdx(['rate','price']);
const rows = lines.map(vals => ({
customer: vals[customerIdx],
amount: amountIdx >= 0 ? vals[amountIdx] : (parseFloat(vals[hoursIdx]) || 0) * (parseFloat(vals[rateIdx]) || 0),
date: vals[dateIdx],
invoice: vals[invoiceIdx],
}));Try it with sample data
Runs in your browser. No upload required.
Smarter deduping with typos, nicknames & formats#
Catch near-duplicates across multiple exports using fuzzy matching on names, emails, and phone numbers — even with typos.
Steps
- Parse multi-source contact CSVs (CRM, email tool, spreadsheets)
- Normalize phones (strip symbols, country codes, extensions)
- Normalize names (split first/last, handle nicknames)
- Compute similarity scores on name + email + phone
- Cluster likely duplicates with confidence scores
- Surface "canonical" record suggestions per cluster
- Export a cleaned master list and a review CSV of all clusters
See code excerpt
// Normalize columns then fuzzy match (capped to 2k contacts)
const contacts = parseCsv(text);
const result = findFuzzyDuplicates(contacts);Try it with sample data
Runs in your browser. No upload required.