We worked with our client to move around almost 500 pieces of content (posts, events, PDFs) from an Umbraco site into a new Content Management System.
We built a migration tool using Claude Cowork that was able to inspect the source site in Chrome to determine the HTML structure.
The tool then wrote Python scripts to scrape the content and upload it into WordPress via the REST API.
The workflow
The process for each content type followed the same pattern:
Point Claude at a sample page
Claude opened the sample page in Chrome, inspected the DOM, and identified the right selectors for titles, dates, content, metadata, images, etc.
Use Claude to build a scraper
Claude built a Python script that visits every page, extracts the structured data, and saves it to a JSON file.
Where the listing page used JavaScript pagination (load-more buttons), Claude automated Chrome to click through and grab all the URLs first.
Use Claude to build an importer
Claude built a second script that was able to read the JSON, upload images to the WP media library, map fields to ACF, and create posts via the REST API.
Feed back any errors
We reviewed the output and where errors were returned (wrong field names, ACF validation errors), we’d paste the traceback, and Claude would fix the script. This feedback loop is a similar pattern we use across our AI workflow consultancy engagements.
Most issues were resolved in one round.
Post-import fixes
After the bulk import, we ran other scripts to clean up formatting (strip bold from headings, remove inline styles, convert tables to paragraphs) and add data that came later (author attribution mapped from a WordPress XML export of the team CPT).
What you’d need for a similar migration
Access
- Public URL for the old site.
- WordPress admin with an Application Password on the new site.
- ACF field groups with “Show in REST API” enabled.
What to give Claude
- A sample page URL from the source.
- The ACF field export (JSON) from the destination so it knows the field names and types.
- Any WordPress XML exports if you need to cross-reference data (e.g. mapping authors to team members) – we used this so Claude knew which team members had been added to the team post type when linking authors.
There will likely be a few iterations per content type as you hit edge cases (content that doesn’t match the expected structure, ACF validation quirks, JS-rendered pages that need browser automation).
If you’re considering a similar CMS migration, get in touch with our AI services team who can scope and run the process for you.
