Preserving Search Authority During a High-Stakes Volcanic-to-HubSpot CMS Migration
Sites that leave a specialized ATS CMS like Volcanic for HubSpot risk steep drops in both organic candidate traffic and Google for Jobs visibility. We ran an authority-first SEO migration for an executive search firm: JSON-LD schema generates programmatically via Custom Objects, and a 1:1 redirect map preserved search equity without operational downtime.
Executive Summary
Context
An executive recruitment firm had to move their primary search engine and job board from a legacy SaaS (Volcanic) to HubSpot CMS Hub Enterprise. SEO authority for hundreds of live job listings had to survive in total.
What We Built
A technical migration framework that replicates specialized recruitment SEO logic inside the HubSpot CMS, with automated Google for Jobs structured data injection built in.
Tech Stack
- HubSpot CMS Hub Enterprise
- HubSpot Custom Objects (Jobs)
- Google Search Console
- Pipedream (Redirect Automation)
Not a fit if your job listings have no stable, persistent identifier such as an ATS job ID, since the redirect map and canonical logic here are built on that key to preserve link equity. It also assumes existing Google for Jobs carousel visibility worth protecting; without JobPosting schema already driving traffic, there is no authority to preserve during a migration.
The Challenge
The legacy Volcanic platform enforced a rigid URL structure. HubSpot's URL logic is more flexible but different, and the move threatened to break thousands of indexed links. Volcanic also has native Google for Jobs integration; HubSpot does not. Without a faithful replica of the specific JobPosting schema, the firm's listings would vanish from the specialized search carousels that drive the majority of their executive-level traffic.
Our Approach
We prioritized structural parity with Volcanic before aesthetics. The "Jobs" Custom Object stores the exact data points Google's structured data requires, such as salary, location, and employment type, and a custom HubL template injects a JSON-LD script into every job listing page automatically. The migration itself ran on a rigorous redirection strategy: every legacy category URL mapped to a corresponding dynamic search URL on the new site. So search crawlers were handed off from the old system to the new one without hitting 404 errors or losing link equity.
The CMS move was the visible half. Behind it, the firm's applicant tracking system stayed the source of truth for candidates, clients, jobs and placements, so the build mapped its entities onto HubSpot standard objects (contacts, companies, deals) and custom objects (Jobs, Placements), with a two-way sync that keeps the roughly 14,000 registered job seekers current in both systems. Job syndication to the boards moved to a distribution service mid-project, and because that service accepted postings by email rather than API, the automation had to be redesigned around a send step. When the sync volume outgrew the server first hosting it, the API workflows moved to a dedicated Pipedream workspace before handover.
This engagement is part of our migration work for professional services organisations.
Impact
Zero-Downtime Authority Transfer
The 1:1 redirection map prevented the "migration dip" typical of CMS transitions. Organic candidate traffic and application volumes stayed stable through the launch window. The firm's revenue pipeline held.
Google for Jobs Visibility Kept Through Launch
JobPosting schema injects automatically via Custom Objects, and the firm's listings kept appearing in the Google search carousel with nothing dropping out.
Dynamic Category Authority
The legacy "Job Category" pages were recreated as dynamic Custom Object search results. The firm ranks for broad terms like "CFO Roles Sydney" and can still update listings without manual SEO intervention.
Tech Stack Consolidation
Specialized recruitment features now run on HubSpot. The CMO could sunset an expensive legacy SaaS subscription. The firm's overall tech spend fell without compromising performance.
A script inside the CMS listing template pulls properties directly from the "Jobs" Custom Object, such as job_location, hiring_organization, and date_posted. On every page load, it outputs a valid Google JobPosting schema. Each listing arrives "crawl-ready."
The Bullhorn Job ID served as a persistent key. From it, we generated a 301 redirect map translating Volcanic's nested URL structure into HubSpot's dynamic search paths. External backlinks to specific roles all survived.
Dynamic canonical tag logic prevents "duplicate content" flags on similar job listings: even when one job is listed in multiple categories, search engines still recognize the primary URL, so the authority concentrates on a single record.
Post-launch, we monitored "Crawl Stats" and "Sitemap" health in Google Search Console to confirm the handoff from Volcanic had worked. Minor indexing issues got caught and fixed before they touched lead volume.
Volcanic had native Google for Jobs support and HubSpot doesn't. Without a faithful JobPosting schema, the firm's listings would have dropped out of the search carousels that drive most of its executive-level traffic. Now the "Jobs" Custom Object stores the data points Google requires, such as salary, location and employment type, and a custom HubL template injects JSON-LD into every job listing page. Each legacy category URL maps to a matching search URL on the new site, so crawlers reached it without hitting 404 errors.
FAQ