Packwall sells packaging and shipping supplies (stretch film, bubble wrap, corrugated boxes, packing tape, strapping and kraft paper) to businesses in Guadalajara and Mexico City. We rebuilt its old Wix site around one simple promise: prices are visible up front, so a buyer can order without asking for a quote.
The storefront runs on Next.js 16 (App Router), React 19 and Tailwind CSS v4, deployed to Cloudflare Workers with OpenNext. The catalog is organized in twelve product families, with a cart and Stripe checkout where business customers can request their Mexican electronic invoice (CFDI). Guadalajara and Mexico City each have their own page with local business structured data.
The blog is where Sanity comes in. All the websites in our group share one Sanity dataset: every document carries a site field, and each frontend only queries its own content. Editors write in a custom editing app built on top of that dataset, and every site renders Portable Text with the same shared renderer package.
We moved about 70 posts over from Wix. The original HTML was converted to Portable Text with @sanity/block-tools (images and tables are split out first and handled on their own), the images were uploaded to the Sanity asset pipeline, and every old /post/ URL permanently redirects to its new /blog/ address, so existing links and search results keep working.
Two lessons. First, filter by site from the very first query: that is what makes a shared dataset safe. Second, check what you actually serve. Before each deploy a script verifies that every blog query keeps the same filters, and after the deploy another one compares the live sitemap against the posts published in Sanity, so a missing post is caught the same day instead of weeks later.