Skip to main content

Vidal & Vidal: from an exported consumer theme to a Shopify Plus wholesale store

https://www.vidal-vidal.com/
Vidal & Vidal B2B

Vidal & Vidal is a jewelry house from Menorca, Spain. Its Shopify Plus wholesale store started as an export of the consumer store's Sleek theme with no B2B logic in it: first 29 orphaned templates were removed, 75% of the templates folder, and then Émolo's order table was ported to the theme.

Project facts

Client
Vidal & Vidal
Sector
Jewelry
Country
Spain (Menorca)
Year
2026
Shopify plan
Shopify Plus
Base theme
Sleek, exported from the consumer store
My role
Through an agency
Duration
4 weeks
Team
Me alone, on front-end

Where did Vidal & Vidal’s wholesale store start?

Vidal & Vidal’s B2B theme started as a straight export of the consumer store’s Sleek theme, with no wholesale logic in it. The export brought 29 orphaned templates the wholesale store did not use. Seven of them referenced videos that only exist on the consumer store, and that broke shopify theme dev: nobody could work on the theme locally until it was cleaned up.

How did the consumer theme become a wholesale store?

The theme was cleaned up first, and then it got the wholesale ordering logic, reusing the order table built for Émolo.

Cleaning up the exported theme

Removing the 29 orphaned templates cut the B2B theme’s templates folder by 75% and gave shopify theme dev a theme that starts without errors. That step is what made local work on the rest of the project possible.

Émolo’s order table, ported to Sleek

Vidal & Vidal’s order table is Émolo’s ported to a different theme: same logic, with an adapter layer that swaps Prestige’s cart events for Sleek’s pub/sub and section bundling. It also keeps the same network contract as Sleek’s native quick order list, so the cart drawer and header update with no extra code.

Wholesale price next to the retail price

Each row shows stock, the wholesale price and, next to it, the retail price from a variant-level money metafield. Each row’s colour swatch is resolved from a metaobject.

Only changed rows are sent

Only the rows that changed are sent to /cart/update.js, as absolute quantities, in a request flagged as XHR so Shopify validates inventory. The running total is formatted from a Liquid money sample, so it matches the session currency in every market.

Checkout closed to non-wholesale customers

Purchase is closed to anyone who is not a Vidal & Vidal wholesale customer.

What is it built with?

  • Shopify Plus and Shopify B2B
  • Liquid on the Sleek theme
  • JavaScript: Sleek's pub/sub and section bundling
  • Ajax Cart API (/cart/update.js)
  • Money metafields and metaobjects
  • Shopify CLI (shopify theme dev)

Screenshots

Product page on Vidal & Vidal's consumer store, the source of the B2B theme, with photo gallery, expandable purchase benefits and a Get the look module
Product page on Vidal & Vidal's consumer store, the source of the B2B theme, with photo gallery, expandable purchase benefits and a Get the look module
Best Sellers collection on Vidal & Vidal's consumer store with filters, sorting, Top seller badges and wishlist buttons
Best Sellers collection on Vidal & Vidal's consumer store with filters, sorting, Top seller badges and wishlist buttons

What were the results?

  • 29 orphaned templates removed: the B2B theme templates folder shrank by 75%.
  • shopify theme dev ran again on the B2B theme once the seven templates pointing at consumer-store videos were gone.

This project is part of my work as a Shopify B2B developer.

Need a wholesale portal like this?

Get in touch