Somage Fine Foods · Tea & fine foods · B2B + DTC · Shopify Plus · Custom commerce build

Enterprise B2B on Shopify Plus — custom multi-user auth, dynamic pricing, and payment method rules built server-side.

Somage Fine Foods needed enterprise B2B workflows that Shopify Plus doesn't ship natively — hierarchical sub-users with role-based access, customer-specific tiered pricing enforced server-side, and payment method rules by customer segment. We built it on Shopify Functions, Multipass, and AWS — while keeping full compatibility with Shopify's native checkout.

Custom
Pricing engine on Shopify Functions
Multipass
Multi-user SSO with RBAC
AWS
DynamoDB auth backend

What we shipped.

Cart Transform
Server-side dynamic pricing on every line item
RBAC
Role-based access for sub-users on one Shopify customer
Payment Fns
Bank Deposit gated by customer tag at checkout
Somage Manager
Custom admin portal for tiered pricing rules

In their words.

[Add pull-quote from Somage — something on how the platform now handles their B2B workflow end-to-end without compromising Shopify's native checkout.]

The problem

Somage Fine Foods sells tea and specialty food both direct-to-consumer and to a wholesale B2B account base. On the wholesale side, they needed workflows that Shopify Plus — for all its strengths — doesn't ship natively.

Three specific gaps:

  • Hierarchical accounts. A single wholesale customer needed multiple sub-users — a buyer, a finance person, an operations manager — each with different permissions. Shopify's customer object is flat: one email, one login, one identity.
  • Customer-specific tiered pricing. Every wholesale account has its own price list, plus quantity breaks that Shopify doesn't natively support. Third-party pricing apps don't survive at scale and fight with Shopify's discount stack.
  • Payment methods by segment. Approved terms customers can pay by bank deposit / invoice; everyone else has to check out with card or PayPal. Native Shopify has no way to gate a payment method by customer tag.

Why we didn't reach for apps

The Shopify App Store has apps that gesture at each of these problems. In our experience, at enterprise B2B scale, they fail the same way every time: they store logic client-side, they break during Shopify updates, they conflict with each other, and — the killer — they can't enforce pricing at checkout because they don't live in the cart execution pipeline.

Shopify shipped Shopify Functions specifically for problems like this. Cart Transform, Payment Customization, and Multipass are all first-party extensibility points that live at the server level, run in Shopify's own runtime, and survive theme and platform updates. That was the right foundation.

How we built it

1. Custom multi-user authentication with Multipass + AWS.

Both primary and secondary user credentials live in a custom authentication service backed by AWS and DynamoDB, with credentials encrypted at rest. When any of Somage's sub-users signs in, our service authenticates against DynamoDB, then generates a Shopify Multipass token to SSO them into Shopify without exposing Shopify credentials.

All sub-users map to a single Shopify customer record (so the wholesale account has one order history, one credit line, one address book), but authorization inside the storefront and admin portal is handled entirely by our RBAC layer. Granular permissions cover Order Management, User Administration, Locations, Financials, General Settings, and Reports.

2. Dynamic multi-tier pricing engine on Cart Transform Functions.

Pricing rules — customer-tag based lists, quantity breaks, custom overrides — are managed in a custom admin portal we built for Somage (Somage Manager). When a product is added to cart, the correct customer-specific price is injected as a cart line property (_price). A Shopify Cart Transform Function then intercepts the cart execution pipeline and rewrites line item pricing before checkout rendering.

Because it runs server-side inside Shopify's own function runtime, the price is consistent across cart, checkout, and the resulting order. No client-side JS, no rendering hacks, no fighting the discount stack. And it survives every Shopify platform update because it uses Shopify's own extensibility API.

3. Payment method customization on Payment Customization Functions.

At checkout, a Payment Customization Function evaluates the customer's tags. If the customer has the terms tag, Bank Deposit shows up as a payment option; if not, it's hidden. Card and PayPal remain available to everyone. Server-side enforcement means it's not something a buyer can defeat by fiddling with a browser tool — the rule lives inside Shopify Checkout itself.

4. Somage Manager — pricing admin portal.

Business users needed a way to maintain pricing tiers, configure quantity break rules, bulk import/export price lists, and manage per-customer pricing matrices without Shopify Admin access and without a developer in the loop. We built Somage Manager as a separate admin platform that syncs pricing rules to the Cart Transform Function's data source. Non-technical operators run the entire pricing program from it.

The technical stack

Shopify Plus · Shopify Functions (Cart Transform, Payment Customization) · Shopify Multipass · Shopify Admin API · Customer Tags · Cart Line Properties · AWS · DynamoDB · Custom authentication service · Encrypted credential storage · RBAC.

What it means for the business

Somage runs their wholesale program end-to-end on Shopify Plus — with the customer experience, pricing control, and access model of a purpose-built B2B platform, but on the same platform as their DTC storefront and with all the checkout, tax, shipping, and payment integrations that come with it. When Shopify ships new checkout features, they get them for free. When their wholesale program grows, the architecture grows with it.

What we learned

The big lesson from this build: when you're extending Shopify Plus for a real B2B use case, the difference between an app-based solution and a Shopify Functions solution isn't a preference — it's the difference between something that works for a year before it breaks and something that works forever. If it needs to run at checkout, it needs to be a Function.

The smaller lesson: hierarchical accounts on top of Shopify's flat customer model is a solved problem once you separate authentication (custom, in our AWS service) from authorization (RBAC in the application) from identity (a single Shopify customer via Multipass). Merchants keep trying to hack this at the Shopify layer; the clean architecture is to keep Shopify as the identity anchor and do the multi-user work outside it.

Wrapping up.

[Add a closing quote from Somage — something on the business impact of running the full B2B program on Shopify Plus, or advice they'd give another merchant considering the same custom-Functions approach.]

Ready to ship Shopify work faster?

No pitch. A senior Carti dev reviews your store live and sends a 1-page report.