My AI Agent Workflow โ€” From 65,000 Targets to a Working Prospect Intelligence System

What it takes to turn public data into something you can sell and govern with

As a Sales Professional, know who your Ideal Customer Profile, and where to find those prospects and their data is essential when prospecting for clients that you can help. See, as a Seller, I see my efforts as an opportunity to help solve people's problems. One of the biggest perks of being in IT Solution Sales is the fact that you get insights into so many Verticals and Industries. As someone who tends to get bored doing the same thing repeatedly, exposure to so many different businesses is the best part of what I do.

Australia has many public registers of professions. Anyone can download it. Almost nobody does anything useful with it, because a spreadsheet with hundreds to thousands of rows is not information, it is raw material.

This is the story of turning that raw material into a system I actually use.

What the system holds today

The current database is PostgreSQL, running in Docker. As of writing it contains:

Table Records What it holds
prospects 65,153 Registered target companies
members 114,396 Responsible people/stakeholders extracted
enrichment_data 5,901 Revenue, funding sources, budget signals
prospect_tags / tags 1,880 Qualification categories
research_notes 0 Collaborative notes during research
scrape_progress 0 Checkpointing so collection can resume

Seven tables. Two of them carry the weight. Everything else exists to make the first two usable.

The architecture

Database schema showing the prospects, board_members, enrichment_data, prospect_tags, tags, research_notes and scrape_progress tables and their relationships

The application around the data is a conventional stack, chosen because it is boring and works and after all, my AI Agent chose it, not me, but I knew enough to say go for it:

  • Backend: Node.js with Express and TypeScript
  • Frontend: React with Vite and TypeScript
  • Database: PostgreSQL in Docker
  • Orchestration: Docker Compose for local development
  • Collection: a set of Node scrapers, checkpointed so a run can resume where it stopped

The scraping layer is the part that required the most care, and not for technical reasons.

The part nobody writes about: collecting data respectfully

It is trivially easy to write a scraper that hammers a public register at full speed. It is also the wrong thing to do, and it gets you blocked within the hour.

The rules I settled on:

  1. Rate limit deliberately. The scraper runs every 10 minutes on a schedule and collects a bounded batch, rather than trying to pull everything in one aggressive pass.
  2. Checkpoint everything. A scrape_progress table means an interrupted run resumes instead of restarting. This also means you never re-request data you already have.
  3. Only collect what is already public and already published for this purpose. Responsible-person records are published by the regulator specifically so the public can see who governs a charity.
  4. Back up before every enrichment pass. A nightly backup runs at 11pm. Data you cannot restore is data you will eventually lose.
  5. Report on the collection, not just the data. Status reports run twice daily so I know whether the pipeline is healthy without going and looking.

The technical challenge in data collection is throughput. The actual challenge is restraint.

Where AI made the difference

Three places, specifically.

Structure extraction

Public registers are built for human reading, not machine consumption. Names, roles and organisation relationships arrive in inconsistent shapes. Getting from a rendered page to clean, normalised rows is the sort of fiddly transformation work that AI is genuinely good at and humans genuinely hate.

Qualification logic

Having 65,000 organisations is not useful. Knowing which 300 of them look like real prospects is. The tagging system encodes qualification rules: organisation size, board composition, funding signals, the presence of governance needs that map to what I would actually be selling. That logic was built and refined conversationally, which is much faster than specifying it up front.

Automation of the boring loop

Scrape, enrich, report, back up, repeat. None of that needs me. All of it needed to be built once and then left alone.

Telegram cronjob status report showing the ACNC scraper ran successfully with three new prospects and zero errors

What I got wrong

I over-engineered the first version of the proposal layer. When I showed early output, the honest feedback was that it was over the top for what the situation needed. That was correct. A deliverable should be proportionate to the decision it supports, and an agent that can produce forty pages will happily produce forty pages if you do not tell it not to.

The second mistake was assuming the data was the product. It is not. The data is the input. The product is the answer to a specific question: which organisations have the governance characteristics that make them worth a conversation, and who is on their board.

The transferable lesson

Every industry has a public dataset like this sitting in plain sight. Registers, filings, licences, planning approvals, procurement notices. Most of them are ignored because the gap between 'downloadable' and 'usable' is large enough to stop people.

That gap is exactly what AI tooling closes now, and it closes it for individuals, not just for organisations with a data team. The hard part was never getting the data. The hard part is deciding what question you are trying to answer with it, and then having the discipline to only build what answers that question.