Most website builders don't really let you leave. Wix's help centre says blog posts "can't be exported to other platforms". Squarespace exports one blog as a WordPress file, with images left as links that, in its own words, "stop working after you cancel". GoDaddy's builder backups exclude blogs and images. Jimdo says there's "no option for creating a backup of your website yourself".
We build Decamp, a tool that exports those sites, so we spend our days reading what these platforms publish. Here's what we learned, including two bugs that would have silently lost our users' content.
Read the data the platform already serves
Scraping rendered HTML gets you layout soup. Each builder serves something better:
-
Wix: the public site issues a visitor token (
/_api/v1/access-tokens) that the Wix Blog API accepts. Posts come as "Ricos", a structured rich-content JSON (paragraphs, lists, galleries, tables, embeds), which converts cleanly to HTML. Static pages render server-side if you ask with?forceSsr=true. -
Squarespace: append
?format=jsonto any collection or item URL and you get the item body plus metadata. -
GoDaddy Website Builder: blog posts are embedded in the page as Draft.js JSON (
window._BLOG_DATA). -
Jimdo Creator: pages are server-rendered stacks of
j-moduleblocks, one class per module type. -
Weebly: classic sites are server-rendered too (
#wsite-content,.blog-post), approved comments included, and uploads live under/uploads/on the site's own host with open CORS.
Gotcha 1: WordPress silently skips images that share a title
We generate a standard WXR file and let WordPress's own importer pull the images. In a real import, Jimdo sites lost 37 images and GoDaddy sites 20, with no error. The importer treats any item whose title (plus date, when there is one) matches an existing post as "already exists" and skips it. Every Jimdo image is called image.jpg; pages have no date; and a cover image's alt text often equals the post title. Skipped attachments mean the post keeps hot-linking the old site, which breaks the day the subscription ends.
Fix: unique titles for every attachment across the file, and distinct timestamps for undated items. Same content, zero skips.
Gotcha 2: Squarespace "website component" blocks
Newer Squarespace sites wrap blocks like this:
<div class="sqs-block website-component-block sqs-block-website-component sqs-block-markdown">
If you take the first sqs-block-* class as the type, every block becomes "website-component". On one podcast site that dropped entire episode transcripts (350 words exported instead of 7,633), dropped the audio players, and let "related posts" grids slip in as content. Take the first class that isn't website-component.
Smaller lessons
- Images: export files, not links. And PNG photos from Wix at 2048px weigh 4 to 6 MB; WebP copies keep transparency at a third of the size.
- Big WordPress imports time out on shared hosting. Splitting the WXR into 100-item files (with shared titles and dates so a re-import still dedupes) fixes it.
- Comments are reachable: Wix through its comments service (keyed by the blog's internal post id), Squarespace through a public endpoint. Sanitize them: visitor HTML goes straight into WordPress, and the importer doesn't filter it.
- Redirects: generate them for every host (Redirection plugin CSV, .htaccess, Nginx, Netlify
_redirects, Vercel, Ghost YAML, Webflow, Squarespace URL mappings), then check them after DNS moves. We built a free checker for that: decamp.app/tools/redirect-checker
If you're moving a site off one of these builders, Decamp (decamp.app) does all of the above; the inventory and preview are free. Happy to answer questions about any of the internals in the comments.












