Skip to content

Case study / Truvy

One checkout for sixteen markets

A custom storefront and commerce platform with affiliate tools for a direct-sales nutrition brand, built on its ERP and sold in 16 countries until Zinzino acquired the brand. Non-developers edited the site’s content in Prismic, a headless CMS.

Next.jsHeadless CMSPaymentsMulti-market
Services
Design, Engineering, Integrations
Stack
Next.js, Express, SQL Server, Redis, Exigo, Prismic
Reach
16 countries, 2 languages

At a glance

Problem
Truvy needed a custom storefront, component library and ERP integrations that serve the business, its associates and its customers alike.
What we built
A Next.js storefront and Express API that read fresh data where it mattered, set the price tier on the server and placed each card order in one Exigo transaction.
Result
An intuitive, responsive storefront that handled thousands of orders a month for the business, its customers and its associates.
Markets on one codebase
16
Yearly active users
100K+
Faster time to interactive than the Nuxt site, in Lighthouse
10×

The challenge

A new ERP whose database can run five minutes behind its API

Truvy moved from DirectScale to Exigo’s ERP, so its storefront was rebuilt to read from Exigo’s replicated database and to price each order by who is buying.

Truvy sold nutrition products through independent associates in 16 countries. Its previous storefront was a Nuxt app built for DirectScale, a direct-sales platform. When Exigo acquired DirectScale, Truvy had to move to Exigo’s ERP, and in June 2023 rebuilding the storefront became part of that cutover. Little of the old integration carried over: customers, referrals, regions, pricing and kits were all modeled differently in Exigo.

Customers, orders, subscriptions, commissions and inventory lived in Exigo. Integrations were expected to read from a replica of its SQL Server database rather than its API, and that replica could take up to five minutes to show a change made through the API. Read naively, a customer who had just signed up wouldn’t exist yet at checkout.

Prices also depended on who was buying: retail customers, subscribers and associates each paid a different price. Every new customer had to be enrolled under the associate who referred them, because that is how associates are paid.

One order summary, priced for a retail customer, a subscriber and an associate.

Our approach

A new storefront and API, with fresh reads where they matter

Rather than port the Nuxt site, we rebuilt the storefront in Next.js and wrote a new Express API between it and Exigo.

Catalog and order history came from the replica; anything a customer had just changed, such as a new account or a newly saved card, was read from the API instead. The API set the price tier on the server, so adding a subscription to the bag moved the whole order to subscriber pricing.

Checkout was a single page, and Exigo calculated tax, shipping and totals. The Nuxt site created up to three separate records for one bag, so a declined card could leave an order or subscription behind. Here a card order, its payment, a new subscription and a saved card were submitted as one Exigo transaction that succeeded or failed as a whole.

Card numbers went straight into a TokenEx iframe, and PayPal ran through Braintree. Content that changed often lived in Prismic, so Truvy’s staff could edit it without a developer.

Adding a subscription moves the whole bag to subscriber pricing.
One-page checkout: a coupon moves the order to subscriber pricing and every total is recalculated.
The card number is typed into a TokenEx iframe; the API receives only a token.

The outcome

Self-serve for customers, associates and new markets

Adding or retiring a country was configuration and content, not a fork of the checkout: Japan and Thailand launched in 2024, and three Latin American markets were added and later retired.

Customers cancelled their own subscriptions instead of calling support or filing a ticket, and every cancellation recorded a reason. Sessions on the Nuxt site ended after an hour because nothing read its refresh token; the new API refreshed them in the background. Suspended, terminated and void accounts were refused at sign-in, signed out the next time the site loaded and stopped at checkout, a compliance requirement in direct sales.

With quick cart, associates built a cart for a new customer and sent it as a short link. It opened with the cart, country, language and sponsor already set, so the customer signed up under the associate who sent it.

After Zinzino acquired Truvy in September 2025, we ran the site’s phased decommissioning to meet stakeholder and Zinzino requirements: open signups stopped and then reopened to associates’ referrals only, markets were retired, and phone and chat support came off the site.

One product page in the US, Mexico (Spanish), Japan, Germany, the UK and Australia.
A quick cart link opens with the cart, country, language and sponsor already set.
“You are THE MAN! This quick cart functionality is awesome! [Our customers] are going to love it!”
D. R./Executive Director of IT

Have a project in mind?

Tell us what you’re working on, and we’ll follow up to find a time to talk.