02
Custom Plugin · Web Scraping · Content Migration

HubSpot to WordPress migration
plugin — 500 posts in one day

When no existing tool could reliably migrate blog content from HubSpot to WordPress, I built one from scratch — and completed a migration that would have taken the team a week.

500+
blog posts migrated
in a single day
~1 week
saved for a team
of 4 developers
1 day
to build & ship
the plugin
0
existing plugins
that could do this
The Problem

No tool existed for this.
So I built one.

When Vensure acquires a division partner with an existing website, the development team migrates that site to WordPress. Many of these sites were originally built on HubSpot — a platform with its own blog infrastructure, image hosting, categorization, and tagging system.

The problem: no reliable plugin existed to migrate HubSpot blog content to WordPress while preserving images, categories, tags, and post structure. Every migration meant manually copying and pasting — post by post — across potentially hundreds of articles.

One particular migration involved over 500 blog posts. At the team's pace, that was an estimated full week of repetitive work split across four developers.

"Give me one day. If by tomorrow I don't have something working, we start the manual migration. But I think I can solve this."

— Mica, pitching the idea to her team lead
The Solution

A custom WordPress plugin
built in a day

Using PHP and a Composer scraping library, I built a plugin that automated the entire migration pipeline — from URL input to imported, structured WordPress content.

📋
Batch URL input from sitemap
The plugin's admin panel accepted a list of blog post URLs — easily obtained from the source site's sitemap — eliminating the need to find content manually.
Real-time AJAX import status
As the import ran, the admin panel displayed a live progress feed via AJAX — showing each post's status as it was scraped and created in WordPress.
🎯
Precision scraping — no junk content
Rather than dumping raw HTML, the scraper was configured to target specific tags and CSS classes per site — importing only the actual content: title, body, images, categories, and tags. Sites with different structures got different selectors.
🖼️
Full content fidelity
Each imported post preserved its images (downloaded and re-hosted in WordPress), categories, tags, and post structure — ready to publish with no cleanup needed.
🔧
Site-specific configuration
HubSpot sites aren't all structured the same way. The plugin was designed to be adjusted per migration — different HTML selectors, different content areas — so every import was precise rather than a generic scrape that pulled in navigation, footers, or boilerplate. This meant zero wasted imports and no manual post-cleanup required.
The Execution

Built, tested, and shipped
in under 24 hours

The pitch
One day or we do it manually
The team lead wasn't convinced building a tool was worth the time. I negotiated a single day to prove the concept — with a clear fallback plan if it didn't work out.
The build
Plugin architecture, scraping library, admin UI
PHP plugin built with Composer, targeting the site's specific HTML structure. Admin panel with URL batch input and live AJAX status feedback wired up and tested.
The migration
500+ posts imported, reviewed, done
The plugin ran against the full post list. Every article — with images, categories, and tags intact — landed in WordPress clean and ready. The migration the team estimated would take a week was finished the same day.
On hyperfocus as a superpower

"I make hyperfocus on certain things — when I get enthusiastic about finding a solution to something, there's no stopping me." This project is a clear example: the combination of a real technical challenge, a tight self-imposed deadline, and the conviction that the solution existed somewhere pushed the work forward fast. The best engineering decisions aren't always the ones that follow the safe path.

The Impact

A week of work became
one afternoon

The plugin turned one of the most time-consuming parts of the migration workflow into a near-automated process. Beyond the immediate time savings, it became a reusable tool — available for future HubSpot migrations across the network.

500+
blog posts migrated with full fidelity — images, categories, tags
~20h
developer hours saved on a single migration (4 devs × ~5 days)
reusable for every future HubSpot migration in the network
Plugin Extension

Also used for SEO metadata migration

The plugin was later adapted beyond blog content to solve another common migration problem: preserving SEO data.

When migrating a HubSpot site, losing the meta titles, meta descriptions, and Open Graph tags built up over years of SEO work can tank a site's search rankings overnight. The plugin was extended to scrape that metadata from the source site and import it directly into WordPress via Rank Math — one of the leading WordPress SEO plugins.

🏷️
What got migrated
Meta titles, meta descriptions, Open Graph tags, canonical URLs — all scraped from the source and mapped to the correct Rank Math fields in WordPress.
📈
Why it matters
SEO metadata represents years of accumulated optimization. Losing it during a migration means starting from zero in search rankings. Preserving it means the client's site keeps its positioning from day one on WordPress.

A migration that preserves content, structure, and SEO is a complete migration. Most devs stop at the content.

Tech Stack

Built with

PHP WordPress Plugin API Composer Web Scraping Library AJAX WP HTTP API WP Media Library CSS Selector Targeting XML Sitemap Parsing Rank Math API Open Graph / Meta Tags

Have a complex WordPress project?

Tell me about it — I'll respond with a personalised Loom within 48 hours.

Start a project →