Skip to main content
OctabizOctabiz
Start free
Product updates7 min read
store migration
Firecrawl
WooCommerce
AI extraction
case study

How Octabiz Moves a Small Business's Whole Website Into a New Store With Firecrawl

Pages, policies, the blog, the brand and the menus come through Firecrawl, and products come from the store platform's API. Here is how we moved Sophia's Rugs in one run, and what went wrong first.

Octa, the Octabiz mascot, wearing a beanie and holding a notebook and pencil

By Product & Notes, Octabiz

The blue Octabiz octopus mascot carrying a moving box of web pages and product tags toward a small storefront.

Octabiz uses Firecrawl to move a small business's website into a new Octabiz store. Pages, policies, the blog, the brand and the menus come through Firecrawl, and the product catalog comes from the store platform's own API wherever it has one.

In short

Key takeaways

  • Products come from the store platform's API (Shopify, WooCommerce, Squarespace); everything else comes from Firecrawl.

  • Reading the whole Sophia's Rugs site took under eight minutes and used 111 Firecrawl credits.

  • Every extraction field can be null, and values are checked against the page text, so the model can't invent a phone number.

  • Each job has a credit cap, 800 by default, and the admin sees an estimate before it starts.

Every new customer arrives with a website they've spent years on. Firecrawl lets us bring all of it across in one run, so they start on Octabiz with the store they already had.

Matthew Truth · Co-Founder, Octabiz

Why is moving a small business's website so hard?

Sophia's Rugs in Louisville, Kentucky, shows what a typical small-business site holds. Founder Sophia Shahab sells handpicked rugs and runs a rug cleaning and repair service. Her site has a WooCommerce shop with more than 1,400 products, plus service pages, an FAQ, a shipping policy, a blog and years of photos.

WooCommerce can export the products. The service pages, FAQ answers, menus, colors and fonts have no export button, so an owner who wants to move rebuilds them by hand over several weeks. In our experience, that work is what keeps owners on a platform they've outgrown.

Moving by hand

  • Export the products from WooCommerce

  • Rebuild service pages, FAQ answers and menus by hand

  • Match the colors and fonts by eye

  • Several weeks of work

Octabiz store migration

  • Paste the old site's address

  • Review what was found

  • Publish

  • One run

Octabiz's store migration does the move in one run: paste the old site's address, review what was found, and publish.

How does Octabiz split the work between store APIs and Firecrawl?

The first version of our migrator read everything with AI extraction, products included. On one Squarespace store it spent 1,117 credits reading 120 of roughly 3,600 event pages, and all 11 products it extracted were wrong somewhere. A gift certificate sold in 7 amounts, from $10 to $200, came through as a single $10 item.

1,117
credits spent by the first version on one Squarespace store
120 of ~3,600
event pages it managed to read
11 of 11
products it extracted that were wrong somewhere

Now each source does the part it's best at.

Who reads what

  1. 1

    Detect the platform

    Octabiz looks for Shopify, WooCommerce, Wix and Squarespace markers and checks whether the store's product API is open. If a bot wall blocks the plain request, it retries through Firecrawl with proxy: 'auto'.

  2. 2

    Products from the platform API

    Shopify's /products.json, the WooCommerce Store API and Squarespace's JSON views return exact prices, variants and SKUs.

  3. 3

    Everything else from Firecrawl

    /map returns every URL on the site, a homepage /scrape with the branding format captures the look, and /batch/scrape with a JSON schema reads each page the API doesn't cover.

When two sources disagree, the platform API wins, then Apify, then Firecrawl. Each field records which reader filled it and how confident that reader was.

Firecrawl's docs

The three calls are documented here: /map, /scrape and batch scrape. We wrote about joining the Firecrawl and Apify startup programs earlier this month.

What does a real migration look like?

This is the Sophia's Rugs migration, taken from the run log:

StepWhat happenedTime
DetectWooCommerce, prices in USD0:00
Store API1,400 products read0:25
Firecrawl /map3,187 links found and sorted into 16 pages, 2 policies and the blog0:37
Firecrawl homepage scrapeLogo, 5 colors, Poppins and Inter fonts, 6 header and 6 footer menu items0:52
Firecrawl /batch/scrape16 pages, 4 blog posts, 16 FAQ answers and 1 product the API didn't list2:13
Ready for reviewReviews read separately with Apify7:33
Under 8 min
to read the whole site
111
Firecrawl credits used
41 min
to import the store
37
redirects that keep the old links working

The review screen showed 780 products with no photos, so we held those back and imported the other 621. The import took 41 minutes and created the store with 621 products and their photos, 10 collections, 16 pages, 4 blog posts and 37 redirects that keep the old links working. The store went live the next morning.

Chart

What happened to the 1,401 products

Point at any part of the chart, or tap it on a phone, to see the exact number.
  • Imported with photos621 products44%
  • Held back, no photos780 products56%

Source: Sophia's Rugs migration run log

The check after every import

After every import, Octabiz checks each item against the old site. On this run the check found 620 imported products without their SKUs. The data we read had the SKUs; our own import step dropped them, and the check caught it before Sophia's customers did.

How does Firecrawl turn a homepage into a store design?

The homepage scrape is the most useful single call in the migration. One request returns what we need to rebuild the shop's look and its business details:

await fc('/scrape', {
  url: origin,
  formats: ['markdown', 'branding', 'links', 'rawHtml',
    { type: 'json', schema: BUSINESS_SCHEMA, prompt: 'Copy values exactly as printed; null when not present.' }],
  onlyMainContent: false,
  proxy: 'auto',
});

We map the logo, colors and fonts from the branding format onto an Octabiz theme. The header and footer menus come from links, and rawHtml shows how the header is laid out, so the new store's header can match it. The JSON schema reads the business name, email, phone and address.

What did Octabiz learn about AI extraction?

Our first owner lookup on Sophia's site came back with a phone number starting with 555 and an address on "123 Rug Street". Neither appears anywhere on her site. The cause was our schema: every field was a plain string, which pushes the model to fill in a value even when the page has none.

Three changes fixed most of our extraction problems:

Three fixes for invented values

  1. 1

    Every field can be null

    Our schemas use type: ['string', 'null'], and each field description says "exactly as printed, or null".

  2. 2

    Values are checked against the page text

    An email, phone or street only counts if it appears in the scraped markdown.

  3. 3

    The page beats the model's rewrite

    The page's own heading wins over a reworded title, a price of 0 counts as missing, and duplicate variants are merged.

Tip

Firecrawl returns markdown alongside JSON in the same call, so the second check costs nothing extra: the text to check against is already there.

How does Octabiz keep Firecrawl costs predictable?

Before a migration starts, the admin sees an estimate based on the page count: six credits for the map and the homepage scrape, plus five for each page read with JSON. Each job has a credit cap, 800 by default. When the cap gets close, product pages are read first and blog posts and events last.

Firecrawl credits for Sophia's Rugs

  • Map and homepage scrape

    flat

    6 credits

  • 21 pages read with JSON

    5 each: 16 pages, 4 blog posts, 1 product

    105 credits

Adds up to

111 credits

Reads use maxAge, so a page Firecrawl read in the last two days comes from cache. proxy: 'auto' starts with the basic proxy and moves to the enhanced one only for pages that block it. If the old site changes after the import, a single item can be re-read with maxAge: 0.

Moving from WooCommerce?

See what each one includes side by side, and what moving over to Octabiz involves.

Common questions

Bring your shop across in one run

Where this came from

The research, methods, and photos behind this article.

ON

Written by

Octa Notes

Product & Notes, Octabiz

Where the Octabiz team writes about what we're shipping and why. Not a press release. Just the team explaining our own work.