The ZIP Density report answers one practical question: which ZIP codes do your paying customers actually live in? It exists for shops that want to spend direct-mail postcards or local ad dollars where they've already won business, instead of guessing at a radius on a map. Worth setting expectations up front — there's no interactive map here. The page is built deliberately without one (no map vendor dependency, per the code comments), so what you get is a ranked table plus a bar chart. That's still enough to build a mailing list or set a Google/Meta ad radius from.
Finding the report
ZIP Density (the dedicated report at /app/reports/zip-density) isn't one of the cards in the main Reports hub, and it isn't in the sidebar either — it's a standalone page with no card of its own to click through to. (Don't confuse it with the separate "Customer Geography" card, filed under the Retention category in the Reports hub, which has its own much smaller "Top zip codes" table — top 20 ZIPs only, count and revenue but no Avg/customer column, no bar chart, and pulled from a different, less detailed query. If you're browsing categories looking for ZIP data you actually will find something there first — it's just not this report.) The fastest way into ZIP Density specifically is the universal launcher: press Cmd+K (Mac) or Ctrl+K (Windows), then search "zip," "density," or "map." It shows up as "Reports · ZIP density" in the Pages section. Once you've found it once, bookmark it or just remember the URL (/app/reports/zip-density) — there's no other in-app link pointing to it.
Reading the page
Three summary tiles sit at the top: "Customers (in shown ZIPs)," "Lifetime revenue," and "ZIP codes" (subtitled "with at least 1 customer"). Below that is the "Top ZIPs" table, sorted by customer count — not revenue — with columns for ZIP, City (the state, when on file, is appended in the same cell, e.g. "Austin, TX" — there's no separate state column), a customer-count bar with a badge, Revenue, and Avg / customer. The bar length is relative to whichever ZIP has the most customers among the rows shown, so it's a quick visual read of where you're most concentrated. If you haven't collected any customer ZIP codes yet, the table just says "No customer ZIP data yet." instead of erroring out.
Two things about the numbers that aren't obvious
"Lifetime revenue" is exactly that — lifetime. This report ignores the date-range picker on the main Reports page entirely and always pulls all-time data, so don't expect it to move when you switch the Reports hub to "30 Days" or "YTD." It's also net of refunds: it sums completed payments minus anything refunded back, not the original gross charge. A ZIP with several customers but a rough refund history will show a lower number here than what was originally invoiced.
Gotchas before you build a mailing list from it
The table only shows the top 40 ZIPs by customer count — if your customers are spread across more than 40 ZIP codes, the long tail simply isn't in this report. It also only counts customers who have a ZIP code on file; anyone without one is silently excluded from every row rather than bucketed into an "unknown" line, so a shop with spotty ZIP capture at intake will see a thinner, less useful report than its real footprint. And because the underlying query counts customers even when they have no completed payment yet, a ZIP can show a solid customer count with little or no revenue next to it — don't read "most customers" as "best neighborhood" without also checking the Avg / customer column, which will surface smaller, higher-value ZIPs that the bar chart makes look unimportant.
Who can pull it up
Like the rest of the Reports section, this report is gated on the shop-level "View financial reports" permission (shop.viewFinancialReports, listed under the "Financial" permissions group). Owner, Admin, and Manager roles have it on by default; Technician, Front Desk, and Service Writer roles don't, so if a manager wants a front-desk teammate to build the mailing list, that permission needs to be turned on for them first in Settings → Team → Permissions.