The Problem: Two Stores, Two Currencies, One Brand
Displace Agency built KURA, a multi-store Shopify aggregator that unifies two distinct Shopify stores into a single customer experience. Forma Strata sells luxury rugs and furniture in USD, while Parure sells curated jewelry in GBP. KURA connects both stores through the Shopify Storefront API, presenting unified product browsing, cart management, and checkout across different currencies and catalogs.
This is not something Shopify handles natively. Shopify Markets can manage multiple currencies within a single store, but it cannot aggregate independent stores with separate inventories, separate fulfillment pipelines, and separate product catalogs into a unified frontend. We needed to build that layer ourselves.
Shopify has no native solution for aggregating independent stores into a unified shopping experience. We had to architect that layer from scratch.
By the numbers
2
Independent stores
USD + GBP
Currencies
99%+
Email delivery
1
Unified cart UX
Architecture: Next.js as the Aggregation Layer
We built KURA on Next.js with TypeScript, using the Shopify Storefront API to pull product data from both stores simultaneously. The frontend is a single application, but behind every product card is a query that knows which store to hit and which currency to display.
The Storefront API was the right choice over the Admin API because it is designed for customer-facing reads: products, collections, pricing, and availability. We created a unified product type that normalizes the differences between the two stores, so the frontend components do not need to know or care which store a product comes from.
Each store maintains its own checkout flow. When a customer adds a Forma Strata rug and a Parure necklace to their cart, the system manages two separate Shopify carts behind the scenes. The user sees a single cart interface with clear currency labels. At checkout, they are routed to the appropriate Shopify checkout for each store's items.
- Storefront API queries to both stores in parallel
- Unified product type normalizes cross-store differences
- Separate cart management per store with unified UI
- Currency-aware pricing displayed contextually
- Collection pages that blend products from both catalogs
Currency Handling: More Than a Symbol Swap
Handling multiple currencies is deceptively complex. It is not just about showing a $ or a £ symbol. Customers need to understand what they are paying, in what currency, and whether there are any cross-border implications. Mixing this up erodes trust instantly.
We implemented currency handling at the data layer, not the presentation layer. Every product carries its native currency as part of the normalized type. The cart calculates subtotals per currency and displays them separately. There is no fake currency conversion , a GBP product stays in GBP, a USD product stays in USD. This is honest commerce, not a cosmetic trick.
The product cards show the currency code alongside the price, and filtering allows customers to browse by store or see everything together. Collection pages that blend both stores always maintain clear currency attribution so there is never ambiguity about what a price means.
Supabase: The Data Layer Behind the Storefront
While Shopify handles products and checkout, Supabase powers everything else. User profiles, wishlists, browsing preferences, and the invitation system all live in a PostgreSQL database managed through Supabase. Row-level security policies ensure users only access their own data.
We chose Supabase over building a custom backend for three reasons: real-time subscriptions for live inventory indicators, built-in authentication that could support the invitation flow, and a management API that let us iterate on the data model without writing migration scripts by hand.
The Supabase instance also serves as the bridge between the two Shopify stores and the KURA platform. Product metadata that does not live in Shopify , like cross-store recommendations, curated collection groupings, and editorial content , is stored and served from Supabase.
The Invitation System: Controlled Access with Resend
KURA is not a public-facing marketplace. Access is controlled through an invitation system. Existing members can invite new users, and each invitation is tracked, validated, and expires after a set period. This creates exclusivity, which aligns with the luxury positioning of both Forma Strata and Parure.
The invitation pipeline works like this: a member generates an invite through their dashboard. Supabase creates an invitation record with a unique token and expiration timestamp. Resend sends a branded email with the invitation link. When the recipient clicks through, the token is validated against Supabase, and if valid, they are guided through account creation.
We chose Resend over alternatives because it handles transactional email reliably without the configuration overhead of services like SendGrid. The invitation emails are HTML templates that match KURA's visual identity, sent from a custom domain. Delivery rates sit above 99%, and we track open and click events to help the client understand invitation conversion.
The invitation system is not just access control. It is a growth mechanism. Each existing member becomes a distribution channel for new customer acquisition.
- Unique token generation with configurable expiration
- Branded email templates via Resend with custom domain
- 99%+ delivery rate with open and click tracking
- Automatic token invalidation after use or expiry
- Member dashboard showing invitation status and conversions
Figma as the Single Source of Truth
The design for KURA lived in a single Figma file that served as the source of truth for the entire project. Every component, every state, every responsive breakpoint was specced in Figma before we wrote a line of code. This is not how we work on every project, but for KURA's complexity, it was essential.
Having a comprehensive Figma file meant we could validate the multi-store UX patterns before building them. How does the cart look with items from two currencies? What happens when one store is out of stock but the other is not? How does the invitation flow feel from email to account creation? We answered all of these questions in design before committing to code.
Results and Lessons
KURA launched as a functional multi-store aggregator with invitation-based access, unified browsing across USD and GBP catalogs, and a backend that handles the complexity without exposing it to the customer.
The biggest lesson: do not underestimate the complexity of multi-currency commerce. What sounds simple , show products from two stores , touches checkout flows, cart management, pricing display, inventory sync, and customer expectations in ways that compound quickly. Starting with a clear data architecture in Supabase and Figma-driven design saved us from refactoring work that would have doubled the timeline.
- Two Shopify stores aggregated into a single frontend
- USD and GBP products displayed with native currency accuracy
- Invitation system processing member referrals via Resend
- Supabase backend handling profiles, wishlists, and cross-store data
- Architecture designed for additional store integrations


