B2The Before
My client ran a small property management company managing about 14 residential units for out-of-state owners. Every Monday, their office manager (let's call her the same person doing bookkeeping, tenant calls, and maintenance dispatch, because of course it was) spent her morning doing the same painful ritual:
- Log into their property management software (AppFolio) and export the weekly rent roll as a CSV.
- Log into the bank portal separately and export deposit records for the same week.
- Open both files in Excel, and manually match tenant payments to bank deposits line by line, because AppFolio's export didn't always match deposit dates or batch groupings.
- Flag any discrepancies (late payments, partial payments, NSF fees) by hand, highlighting cells yellow.
- Copy the reconciled numbers into a "master" owner report spreadsheet, one tab per property owner.
- Manually export each owner's tab to PDF and email it to them individually: 6 separate owners, 6 separate emails.
This took 5-6 hours a week, almost entirely on Monday, which meant nothing else got done that day. Worse, because it was manual copy-paste across three tools, mistakes crept in constantly: a transposed digit here, a missed late fee there. One owner caught a $340 discrepancy that took another hour to track down and turned into an awkward "sorry, let me recheck that" email. Trust with owners was quietly eroding.
B3The After
I mapped the whole thing into an automated pipeline using n8n as the orchestration layer, with Airtable as the source of truth and Google Sheets for the owner-facing reports.
Here's the flow:
- 1 Trigger. Every morning at 6am, n8n pulls the latest rent roll data from AppFolio via their reporting export (scheduled email-to-webhook, since AppFolio doesn't have a full public API on their plan).
-
2
Ingest. That data lands in Airtable, structured into a
Paymentstable linked to aUnitsandOwnerstable, so every payment record is already tied to the right property and owner. - 3 Reconcile. An n8n workflow cross-references incoming bank deposit data (pulled via Plaid's API, since the bank itself doesn't expose exports easily) against the Airtable payment records, auto-flagging anything that doesn't match within a day and a few cents.
- 4 Report generation. Google Sheets (via Apps Script, using the Airtable API) auto-populates a per-owner report tab, pulling only that owner's units and payments. No more manual copy-paste across tabs.
- 5 Delivery. A scheduled Apps Script trigger converts each owner's tab to PDF and emails it automatically, with a Slack notification to the office manager summarizing any flagged discrepancies that need a human look.
The only manual step left is a 10-minute Tuesday morning review of flagged discrepancies, which now surface automatically instead of being found by squinting at two spreadsheets side by side.
B4The Numbers
- ✓Time saved: ~5.5 hours/week down to about 20 minutes/week of review time. That's roughly 260+ hours/year back.
- ✓Error reduction: Discrepancies caught by owners dropped to zero in the 4 months since launch (previously happening roughly once a month).
- ✓Cost impact: At a conservative $25/hour value on that reclaimed time, this is worth about $6,700/year in labor, not counting the trust rebuilt with owners who now get consistent, on-time, accurate reports every single week.
- ✓Turnaround: Owner reports now go out by 7am Monday instead of sometime Monday afternoon (or Tuesday, on bad weeks).
B5Tools Used
Got a weekly ritual like this one?
If your team is burning hours on copy-paste work between tools, that's exactly the kind of thing I automate.
Get in touchericnguyennn@gmail.com