Cornerstone Septic
Live Automation

Permit Lead Automation

New septic permit applications across 7 Central Texas counties are automatically scraped, enriched with contact data, and pushed into GoHighLevel every morning.

7
Counties Monitored
~80%
Enrichment Rate
6:15 AM
Daily Run (CST)
Auto
Deduplication
📊

System Overview

How permit data flows from public records to your CRM. Click any box to open that service.

MGO Connect TX Permit Portal ↗ CSV BatchData Skip-Trace API ↗ Enriched GoHighLevel CRM Contact ↗ Opportunity Sales Pipeline ↗ Scrapes new permits from 7 TX counties Finds owner name, phone & email Creates or updates CRM contact record Adds to "New Permit Leads" pipeline ⏰ Runs daily at 6:15 AM CST

Automated Daily Schedule

Runs every day at 6:15 AM CST via GitHub Actions. No manual intervention needed — new permits are captured and pushed to GHL before the workday begins.

⚙️

Pipeline Steps

Click each step to see exactly what happens. Links at the bottom of each step let you open the relevant service directly.

🏛️

Step 1 — Scrape Permit Applications

Source: MGO Connect (Texas OSSF Portal)

The pipeline begins by visiting MGO Connect, the Texas Commission on Environmental Quality's (TCEQ) online portal for On-Site Sewage Facility (OSSF) permit applications.

Our scraper checks for new permit applications across 7 Central Texas counties:

Counties
Travis, Williamson, Hays, Bastrop, Caldwell, Burnet, Blanco
Data Captured
Application #, property address, city, county, permit date
Baseline Diff
Enabled Only processes new permits
Output
CSV file with one row per new permit

A baseline comparison ensures only permits that haven't been seen before are processed. This prevents duplicate contacts and wasted API calls.

🔍

Step 2 — Enrich with Contact Data

Service: BatchData Skip-Trace API

Each new permit's property address is sent to the BatchData Skip-Trace API, which searches public records and data sources to find the property owner's contact information.

What gets enriched:

  • Owner Name — first and last name of the property owner
  • Phone Numbers — up to 3 phone numbers (mobile prioritized)
  • Email Addresses — up to 3 email addresses
  • Mailing Address — owner's mailing address (often different from property)
Enrichment Rate
~80%
Unenriched Handling
Tagged for Retry

About ~20% of permits can't be enriched — typically new construction on vacant land with no prior owner records. These contacts are still created and tagged Unenriched - Needs Retry for later processing.

📇

Step 3 — Create CRM Contact

Destination: GoHighLevel CRM

Enriched lead data is pushed into GoHighLevel (your CRM) as a new contact, including all available data from enrichment.

Contact record includes:

  • Name — owner's full name (or permit placeholder if unenriched)
  • Phone & Email — primary contact methods from BatchData
  • Address — owner's mailing address
  • TagsOSSF Permit Lead + county-specific tag
  • SourceMGO OSSF Permit Scraper
Duplicate Check
Auto-deduplicated
Existing Contacts
Backfill missing data
Naming
Unenriched → "Permit APP#### Address"
Tags Applied
OSSF Lead + County + Pipeline Tag

If a contact already exists (matched by phone or email), the system backfills missing fields rather than creating a duplicate.

💰

Step 4 — Create Sales Opportunity

GoHighLevel Pipeline: New Permit Leads

For every new contact, a sales opportunity is created in your GoHighLevel pipeline so the team can track leads through the sales process.

Opportunity details:

  • Name — includes the permit application number and address
  • Pipeline — placed in the "New Permit Leads" pipeline
  • Stage — starts in the first stage, ready for outreach
  • Property Address — stored on the opportunity for quick reference

The sales team can open GHL each morning and immediately see new leads in the pipeline, ready for a call or text.

🗺️

County Coverage

Hover or tap a county on the map to see its permit lead metrics. Data accumulates as the automation runs daily.

Burnet Williamson Blanco Travis Bastrop Hays Caldwell
Monitored counties

Select a County

Hover or tap a county on the map to view its permit lead metrics.

📊 All Counties

Total Permits Tracked
Enriched Contacts
Conversion RateComing soon
Tracking SinceFeb 24, 2026

Frequently Asked Questions

Where does the data come from?
The leads come from MGO Connect, the official Texas portal managed by TCEQ (Texas Commission on Environmental Quality) where septic permit applications are filed. When someone applies for a new septic system permit in one of the 7 monitored counties, our scraper picks it up. The property address is then sent to BatchData to find the owner's contact details.
When does the automation run?
The pipeline runs every day at 6:15 AM CST automatically via GitHub Actions. No one needs to press a button — it scrapes, enriches, and pushes to GHL before the work day starts. If needed, it can also be triggered manually at any time.
Will it create duplicate contacts?
No. The system has two layers of deduplication. First, a baseline comparison only processes permits that are genuinely new since the last run. Second, GHL's upsert API matches on phone or email — if a contact already exists, the system backfills any missing fields rather than creating duplicates.
Why are some contacts showing "Permit APP####" as their name?
About ~20% of permits can't be enriched through BatchData — typically because the property is vacant land or new construction with no prior owner records. These contacts receive a descriptive placeholder name like "Permit APP4116 834 Oaks Vista Dr" and are tagged Unenriched - Needs Retry. When the data becomes available (e.g., after closing), a backfill run can automatically update them.
What should the team do with these leads?
Each morning, check the "New Permit Leads" pipeline in GoHighLevel. New opportunities will be sitting in the first stage. These are property owners who just filed for a septic permit — they'll need a septic system installed. Reach out by phone or text with a quote. The earlier you contact them, the better the chance of closing the deal before competitors.
What are the "OSSF Permit Lead" and county tags for?
Every contact created by this automation is tagged with "OSSF Permit Lead" so you can easily filter and identify them in GHL. They also get a county-specific tag (e.g., "Travis County") so you can segment leads by area and assign them to the right crew or salesperson.
🔧

Technical Details

For the technically curious — here's what's under the hood.

Infrastructure & Scheduling
The entire pipeline is written in Python and runs on GitHub Actions with a cron schedule (15 12 * * * UTC = 6:15 AM CST). The workflow can also be triggered manually via workflow_dispatch with options for run mode (normal / backfill). All secrets (API keys) are stored in GitHub Secrets — never in code.
APIs Used
BatchData v1 Skip-Trace — property address lookup to find owner name, phone, and email. Each permit address is sent as a skip-trace request.

GoHighLevel API — contacts are created/updated via the /contacts/upsert endpoint, and opportunities are created via /opportunities. Tags, custom fields (including property address on opportunities), and pipeline assignment are all managed through the API.
Error Handling & Resilience
The pipeline handles errors gracefully: duplicate contacts are detected and backfilled instead of erroring out. BatchData no-matches (vacant land, new construction) create placeholder contacts tagged for retry. Each run produces a JSON summary with counts of scraped, enriched, created, backfilled, and errored records, written to a state/ directory for auditing. View run history on GitHub Actions.