a Sagan program · currently in private beta

Indeed Applicant and Spend Export Agent

The candidate_profiles table holds deduplicated Indeed applicants with inferred trade certifications and member attribution, and the member_spend table logs daily Indeed ad spend by company, replacing Recruit CRM CSV exports and manual spend uploads.
before

Candidates are manually exported from Recruit CRM as CSVs and uploaded into Supabase. Repeat applicants are lost because there is no deduplication. Ad spend is exported daily from Indeed and uploaded into a separate homegrown tool. Member attribution is unreliable, and there is no single source of truth for recruiting performance or pipeline health.

after

The agent pulls candidates and spend from Indeed daily and lands them in Supabase automatically. Repeat applicants are deduplicated and tracked as a single person. Every candidate and every dollar is attributed to the correct member company. The team uses Supabase as the single source of truth for recruiting, with a lightweight UI for linking jobs to members and clearing exceptions. Future screening agents and the recruiter portal have a clean, unified data foundation to build on.

skilled trades / HVAC / plumbing / electrical / home services / recruitment / staffing / data enrichment / lead intake / operations / reporting / Indeed /  skilled trades / HVAC / plumbing / electrical / home services / recruitment / staffing / data enrichment / lead intake / operations / reporting / Indeed / 
the problem

Manual candidate uploads and split spend tracking across systems

Strongpoint Talent recruits skilled trades workers for 16 member companies across New Hampshire, New Jersey, and Southern Maine.

01
Repeat applicants lost

Same candidate applies across different member companies or at different times, but the manual process doesn't deduplicate or track them as a single person.

02
Member attribution breaks

Candidates and dollars aren't reliably tied to the right member company, making it impossible to measure recruiting ROI per brand.

03
No foundation for automation

Without a clean, unified candidate and spend database, future screening agents and the recruiter portal can't be built.

the math, if you want to look

One source of truth for candidates and spend across all member companies

proof 01
Automated daily sync

Candidates and spend flow in unattended on a schedule, with a manual trigger available when needed. No more CSV exports or uploads.

proof 02
Deduplication by stable identifier

Repeat applicants are recognized as the same person across multiple applications and member companies, preserving their full history.

proof 03
Member attribution from job title

The member company name in each job posting is automatically matched to the candidate, with a queue for unmatched postings so no applicant is lost.

proof 04
Trade attributes inferred from answers

Primary trade, secondary trades, specializations, experience years, certifications, and state licenses are populated from Indeed application answers, with LLM inference as fallback.

proof 05
Foundation for future tools

The unified Supabase warehouse enables screening agents, analytics, and the recruiter portal that depend on clean, member-attributed data.

The agent pulls Indeed applications and daily ad spend automatically, deduplicates candidates by stable identifiers, infers trade certifications and licenses from application answers, and attributes every candidate and every dollar to the correct member company. Strongpoint Talent gets a clean Supabase warehouse that replaces Recruit CRM and the manual spend-upload loop, giving recruiters and member companies a single member-attributed view of their pipeline.

how it works

How the candidate and spend pipeline works

The agent runs on a daily schedule, pulling new candidates and spend from Indeed, cleaning and enriching the data, and loading it into Supabase. A lightweight UI handles the few manual steps: linking new jobs to members and clearing flagged records.

step 01
Pull candidates and spend from Indeed

The agent extracts new applicants from Indeed and the daily Detailed spend report, landing raw data in a staging table.

step 02
Clean, deduplicate, and enrich

Repeat applicants are matched by stable identifiers. Trade attributes (primary trade, specializations, experience, certifications, state licenses) are populated from application answers, with LLM inference for missing fields.

step 03
Attribute to member and flag exceptions

Each candidate is matched to a member company by the member name in the job posting title. Records missing a member or critical fields (contact name, email, phone, location) are flagged for manual review.

step 04
Load clean records and log spend

Unflagged candidates flow into the candidate_profiles table. Daily spend is attributed per member and logged as reporting rows, replacing the manual CSV upload.

step 05
Manual linking and exception clearing

The team links new jobs to members in the UI and resolves flagged records. Retroactive linking automatically flows held applicants into the database.

ai agent · estimator console inputs transform outputs public preview
inputs
Indeed applicant profiles +

New candidates from Indeed, including application answers, contact details, and resume text.

Indeed daily spend report +

Detailed report export with columns: Campaign, Impressions, Clicks, Apply starts, Applies, Spend, CPC, CPAS, CPA.

Existing Supabase schema +

The candidate_profiles table (43 columns, currently empty), members table (16 rows), and roles table (72 rows).

Job posting titles with member names +

Member company name in parentheses in each job title, e.g. 'HVAC Service Technician (Mountainside Air)'.

transformation
Extract from Indeed +

Pull new applicants and daily spend report from Indeed using authenticated session access.

Land in staging table +

Write raw Indeed data to a staging table without modifying or filtering.

Deduplicate by stable identifier +

Match repeat applicants across applications and time using email, phone, or name, preserving each application as a lead.

Infer trade attributes +

Populate primary_trade, secondary_trades, specializations, experience_years, certifications, and state_licenses from Indeed answers, with LLM inference for missing fields.

Match to member by job title +

Extract member company name from job posting title and match to the members table. Hold unmatched applicants in a queue.

Flag exceptions +

Mark records missing a member or critical fields (contact name, email, phone, location) for manual review.

Load clean records +

Write unflagged candidates to candidate_profiles and log daily spend per member in member_spend table.

outputs
Candidate profiles in Supabase +

Deduplicated, member-attributed, enriched candidate records in the candidate_profiles table with trade attributes, contact details, and member linkage.

Member spend table +

Per-day, per-member rows logging Indeed ad spend (impressions, clicks, applies, spend, cost metrics) attributed to each member company.

Flagged exceptions queue +

Records missing a member or critical fields, surfaced in the UI for manual resolution.

Unmatched applicants hold queue +

Applicants from jobs not yet linked to a member, held until retroactive linking flows them into candidate_profiles.

draft ready for estimator review _
tech used
Indeed employer account extractionSupabase Postgres databaseRailway hosting and cron schedulingLightweight LLM tier for attribute inferenceChrome extension for authenticated session access
tool alternatives
Alternative ATS platforms with API access could replace Recruit CRM, though Indeed extraction remains the binding constraint without an official self-serve API
honest qualification

Is this for you?

built for you if
  • + Multi-member recruiting operations - Strongpoint Talent and similar staffing platforms that recruit for multiple brands or franchisees and need to attribute every candidate and dollar per member.
  • + Skilled trades and field services - HVAC, plumbing, electrical, and other trades where certifications, licenses, and specializations are core to candidate fit and need to be tracked systematically.
  • + Teams using Indeed as the primary job board - Organizations that post most roles on Indeed and need to automate the daily candidate and spend export loop.
  • + Supabase-first data operations - Teams that have already built their recruiting schema in Supabase and want to populate it with automated pipelines rather than manual uploads.
not for you if
  • - Single-brand recruiting - If you recruit for one company only, the member-attribution logic adds unnecessary complexity. A simpler candidate-only pipeline is more appropriate.
  • - Job boards with native APIs - If your primary job board offers a self-serve API for applicants and spend (e.g., LinkedIn Recruiter), an API-based integration is more reliable than authenticated scraping.
  • - Fully manual, low-volume recruiting - If you hire a few people per year and don't need systematic tracking, the overhead of a data warehouse is not justified.
pricing

Pricing and engagement model

to build

This build is structured as an hourly enablement sprint on a weekly cadence, soft-capped at approximately 10 hours per week. The goal is to stand up a clean internal data foundation in Supabase that future agents, tools, and the recruiter portal will sit on top of. The working demo uses realistic trades data to show the full pipeline (deduplication, member attribution, trade-attribute inference, exception flagging, and spend logging) before connecting to your live Indeed account and Supabase project.

then
  • Scoped build: the working demo and live integration of the candidate and spend pipeline, with a lightweight UI for job-to-member linking and exception clearing.
  • Hourly engagement: weekly sprints at approximately 10 hours per week, allowing scope refinement and de-risking of the Indeed extraction layer before committing to larger timelines.
  • Future phases deferred: the full recruiter portal, automated phone screening, downstream analytics, and candidate search-back are explicitly out of scope and will be built on top of this data foundation.
FAQ
How does the agent handle candidates who apply multiple times across different member companies?

The agent deduplicates repeat applicants by matching on stable identifiers like email, phone, or name. Each application is preserved as a separate lead, but the same person is recognized across multiple applications and member companies. This gives you a complete history of each candidate without losing any leads.

What happens if a job posting doesn't have a member company assigned yet?

Applicants from jobs not yet linked to a member are held in a queue and never dropped. Once you link the job to a member in the UI, those held applicants automatically flow into the candidate_profiles table. This ensures no applicant is ever lost during the attribution process.

Which candidate information is pulled directly from Indeed versus inferred by the agent?

The agent prioritizes direct answers from Indeed application questions for fields like trade, certifications, experience, and licenses. When those answers are missing, the agent uses LLM inference from the resume or profile text as a fallback. This approach keeps the system flexible as you add new screening questions over time.

How is Indeed ad spend attributed to each member company?

The agent pulls your daily Indeed Detailed report and automatically attributes spend to each member company by matching the member name in the campaign or job title. When a campaign can't be matched automatically, the team assigns it manually in the UI. Spend is logged as per-day rows so you can track trends and daily totals per member without losing historical data.

What fields are required before a candidate enters the candidate_profiles table?

Four critical fields must be present: member company, contact name, email, and phone. Location is also required. If any of these are missing, the record is flagged for manual review. All other fields can be populated over time as the candidate moves through your screening process.

Does the agent run automatically or do we need to trigger it manually?

The agent runs automatically on a daily schedule, so candidates and spend flow in unattended. You also have a manual sync button available whenever you need to pull data on demand. This gives you both hands-off operation and the flexibility to sync immediately when needed.

Can we use this with job boards other than Indeed?

This build is purpose-built for Indeed because it handles the authenticated extraction and spend-report export that Indeed requires. If your primary job board offers a self-serve API for applicants and spend data, an API-based integration would be more reliable than authenticated scraping. For single-board operations, Indeed is the right fit.

What happens after the agent loads candidates into Supabase? Can we build screening agents or other tools on top?

Yes. The unified, member-attributed Supabase warehouse is the foundation for future tools. Once candidates and spend are clean and centralized, you can build automated phone screening, recruiter portals, analytics dashboards, and candidate search-back features on top of this data. This sprint establishes that foundation so downstream tools have reliable, deduplicated data to work with.

next step

Ready to replace Recruit CRM and manual spend uploads with a unified Supabase warehouse?

The working demo shows the core pipeline logic with realistic trades data. Once you approve the approach, we connect to your Indeed account and Supabase project to start pulling real candidates and spend daily. The lightweight UI handles job-to-member linking and exception clearing, and the unattended pipeline runs on a daily schedule with a manual sync option.