Define Audit Scope
Loaded sitemap URLs, excluded non-priority content sections, and established the approved form ID used as the compliance target for each rendered page.
Output / Filtered URL inventory
Marketing Ops Tool
Built a rendered HubSpot form-audit crawler that checked 397 pages, resolved active form IDs, classified mismatches, and produced a review-ready CSV instead of source-code guesses.
Pages
397 rendered pages
Statuses
4 form classes
Fields
10 core columns
Browser
Chromium via Playwright
A CRM rebuild starts by identifying the connected failures underneath the visible symptoms.
Root cause / 01
A simple source crawl could not reliably identify the active HubSpot form on every page because forms rendered dynamically and pages also exposed cloned, correlation, instance, or historical IDs. The audit needed browser execution, not string matching against raw HTML.
The website also contained sections that should not participate in the audit. The tool therefore had to filter sitemap scope, load each relevant page in Chromium, extract multiple form signals, separate active IDs from noise, and flag ambiguous pages for manual review.
Audit signals
What the system was telling us.
Three hundred ninety-seven pages required review
Dynamic forms defeated raw source scans
Internal IDs created false positives
Four statuses summarized form compliance
Ambiguous pages required manual review
The work moved from diagnosis to architecture, implementation, and governance—in that order.
Loaded sitemap URLs, excluded non-priority content sections, and established the approved form ID used as the compliance target for each rendered page.
Output / Filtered URL inventory
Used Playwright and Chromium to wait for HubSpot forms, inspect rendered DOM markers, form actions, portal IDs, and active form identifiers.
Output / Rendered form evidence
Separated active IDs from cloned or internal identifiers, then classified each page as correct, different, mixed, or missing.
Output / Form status matrix
Wrote URL, portal, active IDs, target comparison, other forms, internal IDs, status, and manual-review flags into a reusable CSV.
Output / Audit CSV report
Four connected layers turned the portal from a collection of tools into an operating system.
System spine
Target-state sequence
Good automation and reporting sit on top of a governed data and process model—not the other way around.
Layer 01
Sitemap scope and exclusion rules limit the crawl to website sections where the approved HubSpot form is expected to appear.
Layer 02
Chromium renders each page and waits for dynamic HubSpot forms so active IDs can be observed after client-side execution.
Layer 03
Multiple DOM and form-action signals identify active form IDs while filtering cloned, correlation, instance-level, and historical identifiers accurately.
Layer 04
Each URL receives a status, comparison fields, and manual-review flag so remediation can proceed from a structured audit file.
The engagement focused on structural improvement, so the strongest results are clearer operations—not invented vanity percentages.
Manual checks could miss scattered pages
397 pages reviewed systematically
Raw HTML exposed misleading identifiers
Rendered active IDs isolated
Form usage required manual interpretation
Four clear statuses produced
Findings lived in ad hoc notes
Structured CSV enabled remediation
A reusable case study should make the work tangible without exposing confidential client data.
Deliverable 01
Sitemap filtering rules
Deliverable 02
Chromium rendering crawler
Deliverable 03
HubSpot ID extraction
Deliverable 04
False-positive ID filtering
Deliverable 05
Four-state classification logic
Deliverable 06
Review-ready CSV export
The interesting part was proving which form was actually active, not which IDs happened to exist in the markup. Once the crawler rendered pages and treated cloned or internal IDs as noise, a 397-page migration check became a structured dataset instead of a browser-tab endurance event.
Client URLs, portal identifiers, approved form IDs, and private audit output remain confidential.