Internal tools · built in-house

The automation ledger

Repetitive work we've built custom automation solutions to solve. Each entry below replaced a task someone was doing manually. These are examples intended to illustrate some examples of repetitive or impractical tasks that can be automated. Rather than spending time collecting data, that time can be used to analyze and act.

700+ hrs

Hours quantifiably automated

8+

Departments currently served

3+

Separate Business-units

01

Daily LTO sales report

Python / Playwright

MTOH's analytics system doesn't offer daily LTO reporting as a standard report, and Intelligent Edge [their more modern UI] can only display sales from one unit at a time. So a script logs in every morning, runs every search for every store, and the summary is in everyone's inbox at 6am. It has run unattended since June 2025. It takes ~15 minutes to update the report when a new LTO is added.

Outlook email titled Daily LTO Summary showing a table of LTO orders and ticket totals per store, with a CSV attachment
Nobody generates this. The report the platform doesn't offer, delivered daily before anyone's awake. When promos change, the item list updates in one config block.

Before

  1. Log in to Intelligent Edge
  2. Select 1 of 13 units
  3. Search one LTO keyword, count the tickets
  4. Repeat for all tracked items
  5. Switch units. Do it 12 more times
  6. >100 searches, counted or noted manually
  7. ~1 hour, minimum. Every. Single. Day.

After

  1. Wake up
  2. Open the 6am email
  3. Per-store and per-item totals, CSV attached
  4. ~5 minutes every few months to update with new LTOs

~365 hrs/yr

Time recovered

117

Searches automated daily presently

13+ mo.

Running automatically

02

Research and search audit

Python / Playwright

For DefensiveDriving.com, the agency who oversees defensive driving courses displays a provider search on their website showing a "random" set of approved courses. We suspected some providers were registering the same course under dozens of license numbers to dominate the rotation. A script sampled the page 1,500 times, logged 30,000 result rows, and turned suspicion into numbers now in active discussion with the agency.

TDLR report dashboard showing 1,500 search refreshes, 30,000 rows observed, 345 unique license numbers resolving to 143 actual providers, with a ranked table of providers by appearances
Suspicion, quantified. If the rotation were fair, appearance counts would be roughly equal. The top entry appeared 6,215 times — nearly 10× the honest baseline — by holding 71 registrations.

Before

  1. A hunch that results aren't distributing fairly
  2. No way to prove it: verifying randomness means thousands of samples
  3. Nobody refreshes a page 1,500 times and tallies 30,000 rows
  4. The question simply goes unanswered

After

  1. Script samples the live page 1,000× per run, desktop and mobile
  2. Every result row logged with timestamp
  3. Report deduplicates by phone number: 345 listed "providers" are really 143
  4. Uncovered two courses who have 60+ cloned courses to abuse the system
  5. Re-runs weekly until the issue is resolved

30,000+

Rows sampled and counting

1 click

Operation Method

Weekly

Frequency

03

Food Delivery App Weekly ad performance report

Excel / VBA

Weekly ad spend, sales, and ROAS across all 13 Whataburger units, combining raw UberEats, DoorDash, & GrubHub exports with automatic prior-week comparison.

Excel summary sheet showing ad spend, ad sales, ROAS, and week-over-week change for 13 store units plus totals
This table builds itself. Three raw exports in, one summary out: per-store ROAS, prior-week memory, and percent changes, with live formulas you can audit.

Before

  1. Download 3 CSVs from 2 ad platforms
  2. Paste each into the workbook by hand
  3. Match every row to the right store
  4. Calculate ROAS and week-over-week changes
  5. Double-check the totals
  6. ~45 minutes, Monday, every week

After

  1. Click one button
  2. Pick the 3 files
  3. Done — prior week comparison included
  4. ~2 minutes

52 hrs/yr

Time recovered

Weekly

Frequency

1 afternoon

Build time

04

Infrastructure uptime monitor

Google Apps Script

Pings every production site on a 15-minute cycle, logs latency history, and sends automatic escalation emails if an outage persists. Anyone can check the dashboard; nobody has to.

Infrastructure health dashboard showing uptime percentage, status, response code, and 7-day average latency for six sites
Live and self-updating. The bottom-right card is a frozen benchmark from the old host, kept as a permanent before/after: the migrated site now responds 4× faster.

Before

  1. Nobody watching the sites full-time
  2. Outages discovered by customers, or by luck
  3. No latency history to spot slow decay
  4. No record of how long anything was down
  5. Detection time: whenever someone noticed

After

  1. 5 sites checked around the clock
  2. 2 failed checks → email, 4 → text message
  3. One-click acknowledge to mute a known issue
  4. Self-serve dashboard with 7-day uptime and latency
  5. Detection time: under 30 minutes, always

480

Checks per day

5 sites

3 hosts covered

$0.00

Monthly cost

05

Live conversion stats dashboard

Python / Flask

A web page showing DefensiveDriving.com conversion data pulled live from the payment processor. Accessible and updated 24/7, it gives a real-time view into conversions, product mix, and more.

Live conversion stats dashboard for DefensiveDriving.com
Always current. Pulled live from the payment processor every time the page loads — nobody generates it, so it's never stale.

Before

  1. Export from Paytrace
  2. Sort and filter the data
  3. Request from someone else, if you lack access
  4. Repeat next time you have a question
  5. Wait for the response

After

  1. Open the page
  2. Numbers are live from the source
  3. Seconds, any time, no asking

Live

Data freshness

0

Requests to wait on

Self-serve

Access model

06

AI-routed contact forms

Make.com + Claude API

Every inbound website contact form is read by an AI model, classified by intent, and routed to the right person's inbox in seconds. Running in production for two companies.

No human in the loop, unless they need to be. The message lands with the right team in about five seconds, at 2am or 2pm. Anything that fits no category is logged and discarded, so spam never reaches an inbox.

Before

  1. All submissions land in one shared inbox
  2. Someone reads each message
  3. Decides who it belongs to
  4. Forwards it, hopefully to the right person
  5. Minutes per message, delays of hours

After

  1. Form submits
  2. AI classifies the intent
  3. Message lands in the right inbox
  4. Seconds, around the clock

24/7

Coverage

~5 sec

Routing time

~$0.25

Monthly cost

07

Synthetic data generator

Single-file web app

Most of our data can't be pasted into an AI tool: it holds customer names, emails, payment details. This builds a spreadsheet with the same columns and formatting as a real export, filled with convincing fake records, so we can hand an AI the shape of the data without ever exposing the real thing.

Same shape, different people. Column names, order, and formats are preserved; every value is invented. Within a row the fake name, email, and address belong to the same fake person, so the sheet still reads like a real one.

Before

  1. Need AI help with a billing or ad export
  2. Can't share it: real customer data inside
  3. Rebuild a fake version by hand, cell by cell
  4. Or give up and go without the help
  5. Long enough that you usually don't bother

After

  1. Define the columns and formats once
  2. Set a row count, click generate
  3. Download XLSX, CSV, or copy to paste
  4. Seconds, with zero real data exposed

0

Real records exposed

18

Column types

Local

Runs in the browser

Feeling inspired, or see something that matches your team?

Please send me the steps as you'd explain them to a new hire — where the data comes from, what you do to it, where it ends up. Some of these are afternoon projects. Let's see what we can do.

Describe your task →