← All tools
App · Next.js + DataForSEO · 2026 · Internal

Local SEO Map Pack Scanner

A geo-grid rank tracker for the Google Maps local pack. It checks rankings at every point on a grid around a business and maps the result.

Kind
App
Built with
Next.js, React, SQLite (Prisma), DataForSEO, Google Maps
Status
Internal
Year
2026
What it does

Pick a business, add keywords and set a grid. The scanner checks the Google Maps results at every point and plots the business's rank as coloured pins over a heat layer, so you see the whole service area instead of one search from one spot.

  • Square or circle grids, with points over water dropped automatically
  • A competitor table that ranks every business across the grid
  • A timelapse of every scan for the same keyword
  • Weak zones, review velocity and category gaps against competitors
  • Alerts by Slack, email or desktop notification when visibility drops
Why I built it

Map-pack rankings change from one street to the next, and the local businesses I work with care about specific towns. Paid geo-grid trackers do this job. I wanted the scan history on my own machine, alerts I control, and data Claude could query directly.

How it works
  • DataForSEO's live Google Maps endpoint returns the results for each grid point.
  • Points run 10 at a time under a shared request cap. Before that, a 150-point scan took 15 to 25 minutes.
  • Scans are stored in SQLite through Prisma, and every rescan adds to the trend history.
  • A built-in scheduler runs saved scans, and an interrupted scan resumes where it stopped.
  • An MCP server gives Claude 10 tools, including keyword trends, competitors and weak zones.
  • A nightly routine researches and builds one improvement at a time. Its deploy script waits for running scans before it restarts anything.
What I learned

Knowing which result is the client is harder than reading the rank. The business search can return one Google place ID while the keyword results list the same business under another, so fuzzy name matching gave false 'your business' badges. The fix was a strict name match once, then reusing that place ID. I also found that the category Google Maps shows in results is the one relevant to the search, not the business's primary category. The primary category only comes from a separate profile lookup.

Want this kind of thinking on your site?

I build tools like this to do SEO work faster and more carefully. The same approach goes into client work.