Case Study · E-Commerce Migration

Replatforming a cigar retailer, solo

Moving Bonita Smoke Shop from BigCommerce to WordPress and WooCommerce — the catalog, the customers, three years of order history, and the entire information architecture — without the store ever going dark.

Role
Everything. Planning, build, migration, content.
Timeline
Ongoing · 62 tracked tasks
Stack
WordPress · WooCommerce · Elementor · Python
Team size
One

The problem

A working store you cannot turn off

Bonita Smoke Shop had years of business running on BigCommerce — thousands of SKUs across premium, machine-made, flavored and bundled cigars, plus humidors and accessories. It worked. It was also expensive, rigid, and hard to extend in exactly the directions the business wanted to grow.

Moving to WooCommerce meant rebuilding all of it: every product and variation, every customer account, every shipping zone, every order going back three years. And doing it against a live storefront that was still taking orders the whole time.

Migrating a store is mostly not code. It is knowing what has to land before what else.

By the numbers

Where it stands

Every piece of this ran through a Notion board with status, priority levels, and weekly stakeholder review.

62tasks tracked
end to end
48shipped
so far
3years of order
history imported
1person on
the project

How I ran it

Sequencing was the whole job

The technical work was the easy part. The hard part was ordering it so nothing broke in production and nobody downstream got surprised.

Get the data across first

Products, variations and pricing, synced brand by brand and category by category. Then customer records and user accounts. Then shipping zones — because orders cannot import correctly until the zones they reference exist. Then three separate bulk order imports for 2024, 2025 and 2026.

Rebuild the way people find things

A catalog this size lives or dies on navigation. I built a mega menu that cuts the same products by brand, category, strength, origin and shape, with responsive aside menus for the long lists — then walked every link in it by hand to make sure the mobile menu matched the desktop one exactly.

Satisfy the parts nobody sees

Cookie-backed age verification on entry. An accessibility widget. A hardened login URL and a review of DDoS exposure. And QuickBooks Enterprise integration verified in person with the shop accounting support team — before anyone went near a DNS record.

Wire up everything that talks to it

USPS and UPS shipping APIs, Omnisend for email, Google Analytics, and a customer account portal showing orders, invoices and wishlist. Plus a password-reset campaign staged for cutover day, so every migrated customer can actually get back into the account they already had.

Fill it with content

Storefront video shot and cut in CapCut, category imagery, gift-certificate and seasonal landing pages, and banners on a rolling schedule.

Scope

What was actually in it

Data

  • Catalog & variations
  • Pricing
  • Customer records
  • User accounts
  • 2024–2026 orders
  • Shipping zones

Build

  • Mega-menu IA
  • Responsive side menus
  • Customer account portal
  • Wishlist
  • Category archives
  • Landing page templates

Compliance & security

  • Age verification
  • Accessibility widget
  • Hardened login URL
  • DDoS review
  • Shipping policy by location

Integrations

  • QuickBooks Enterprise
  • USPS & UPS APIs
  • Omnisend
  • Google Analytics
  • Python price monitor

The build

What it looks like

A few pieces of the WooCommerce storefront. The mega menu is the one I would point at — that structure is the difference between a catalog this size being shoppable and being a search box.

The WooCommerce mega menu, showing products organised by department, brand, strength, origin and shape.
The mega menu — the same catalog sliced by department, brand, strength, origin and shape.
The rebuilt WooCommerce homepage with promotional carousel and category side menu.
The rebuilt homepage, with the category side menu and promotional carousel.
A WooCommerce category archive with subcategory filtering and sale badges.
A category archive with subcategory filtering, sale badges and wishlist.
A WooCommerce product page with the full breadcrumb chain migrated from BigCommerce.
A product page — note the full breadcrumb chain carried over from BigCommerce.
The migrated customer account area: orders, invoices, downloads, addresses and payment methods.
The customer account portal: orders, invoices, downloads, addresses, payment methods.

The side quest

The price monitor

Partway through, a related problem surfaced: nobody actually knew, day to day, where our pricing sat against the competition. So I built a small Flask app that scrapes three retailers on demand — Bonita Smoke Shop, Neptune Cigar and Cigars International — and lines their prices up side by side behind an authenticated login.

It is deliberately small: no scheduler, no price history, just a fast answer when a buyer is deciding what to charge. SQLAlchemy models and Alembic migrations sit behind it, and the scrapers each handle a different site structure — product IDs, full URLs or plain product names.

The Flask price comparison app showing live scraped prices for the same cigar across three retailers side by side.
A live lookup across all three retailers. Cigars International blocks automated requests from some networks, which is why that column can come back empty.
PythonFlaskBeautifulSoupSQLAlchemyAlembic

What I would take from it

The part that transfers

I came into this having overseen e-commerce migrations for agency clients at Coalition Technologies — watching other people replatform, well or badly. Running one myself, on a business I am accountable to every day, was a different education entirely.

The lesson that stuck: the failure modes in a migration are almost never technical. They are a shipping zone that was not there when the orders imported, an accounting system nobody checked, a thousand customers who cannot log in on launch morning. Tracking the work honestly — including the parts that are not done — is what keeps those from happening.

WordPressWooCommerceBigCommerceData MigrationProject ManagementElementorAdobe Premiere

Want the short version? ✨

Or come see the rest of what I have been building.

Get in touch← All projects