A wholesale brand on Plus needed to build a bridge between Subscriptions and B2B Companies. The pattern: map each buyer company to a subscription plan, store location-level pricing rules in metadata, intercept each renewal to recalculate SKU pricing per buyer contract, and route the order to an invoicing workflow instead of a payment processor. The result was recurring wholesale contracts at negotiated rates, with net terms intact.
A mid-market wholesale brand on Shopify Plus needed to enable recurring reorders for professional buyers—salons, clinics, and stockists—each operating under their own negotiated contract pricing. Native Subscriptions lack B2B company catalog support and site-level company pricing; native B2B has company pricing and net terms but no subscription functionality. The two Shopify features operate independently, leaving no path for recurring orders at company-location pricing with net-30 or net-60 invoicing workflows instead of card charges.
Four pieces
data model
Company-Linked Subscription Plans
Create a subscription plan per buyer company (or per contract tier) rather than per product. Store the buyer's company ID, location, and contract terms in Subscriptions metafield. Link each plan to a specific B2B company or location so renewals know which pricing rules to apply.
Shopify Subscriptions, B2B Companies, Metafields API
Store company and location references as metafield values. These link back to B2B company records and enable pricing lookups at renewal.
webhook handler
Renewal Price Recalculation Hook
On each subscription renewal (billing_attempt.challenged or processing), read the order's metafield company ID and location ID. Query B2B Companies pricing rules for that company-location pair. Rewrite the renewal order line items to reflect contract pricing before it's finalized.
Fetch B2B pricing on renewal. Map variant IDs to contract prices. Use this to rewrite line items before order finalization.
order post-processing
Net-30 Invoicing Redirect
After a subscription renewal creates an order, check the contract metafield for invoicing terms (net_30, net_60, etc.). If present, mark the order as pending invoice (using a custom metafield status), hold it from payment processing, and route it to an invoicing app (Vin, Zoho, or a custom invoice service) instead of charging a payment method.
Order API, Webhooks, Invoicing integration
Order webhook handler or workflow automationjavascript
Set custom order status and metafield to signal invoicing workflow. Do not run payment charge; instead trigger external invoicing system via webhook.
storefront UI
Company Portal Subscription Management
Build a B2B company portal screen (or extend existing account dashboard) to show active subscription contracts. Display renewal dates, contract pricing, and linked SKUs. Allow location managers to adjust quantities before renewal or update invoicing contact details without changing the underlying subscription contract.
Query subscription contracts filtered by company ID metafield. Display terms, SKUs, and quantities. Offer quick adjustments before renewal; amendments save to the contract.
Got a similar problem?
Sketch your build in 30 seconds — voice, type, or attach a screenshot.