
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.
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
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
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
Everything else from Firecrawl
/mapreturns every URL on the site, a homepage/scrapewith the branding format captures the look, and/batch/scrapewith 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:
| Step | What happened | Time |
|---|---|---|
| Detect | WooCommerce, prices in USD | 0:00 |
| Store API | 1,400 products read | 0:25 |
Firecrawl /map | 3,187 links found and sorted into 16 pages, 2 policies and the blog | 0:37 |
| Firecrawl homepage scrape | Logo, 5 colors, Poppins and Inter fonts, 6 header and 6 footer menu items | 0:52 |
Firecrawl /batch/scrape | 16 pages, 4 blog posts, 16 FAQ answers and 1 product the API didn't list | 2:13 |
| Ready for review | Reviews read separately with Apify | 7: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
- 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
Every field can be null
Our schemas use
type: ['string', 'null'], and each field description says "exactly as printed, or null". - 2
Values are checked against the page text
An email, phone or street only counts if it appears in the scraped markdown.
- 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.
