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.
⏰
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.
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:
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.
Hover or tap a county on the map to see its permit lead metrics. Data accumulates as the automation runs daily.
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.
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.
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.