A storefront in four languages, and the people who sell it for you
A storefront selling across languages and currencies, with an affiliate program where balances, transfers and payouts live inside the platform instead of a spreadsheet beside it.
The shape of the work
E-commerce & Retail
28 weeks
Dedicated team
Client name withheld under NDA. Engagement details are shown to the extent our agreement permits.
The hard problem
An affiliate program run on a spreadsheet stops scaling at about thirty affiliates, and the failure is always the same: nobody can tell an affiliate what they're owed today. Add several languages and currencies and the catalog admin becomes a second job.
Balances were a stored total someone recalculated periodically, so a disputed figure had no entries behind it to point at. The answer to "why is this number" was, in practice, "because the spreadsheet says so." Attribution happened at month end, which meant an affiliate who drove a sale on the third had no way to see it until the following month.
Affiliates as first-class accounts with a balance, transactions against that balance, and transfers out of it. Plus per-language admin, so a market's catalog is edited in its own language instead of through translation keys.
How the pieces fit
- 01
Modeled affiliate balance and balance transfers as ledger entries, never a computed total
Balance is the sum of its transactions, never a stored total, so every figure traces to the entries behind it and a dispute is answered by showing them.
- 02
Attributed each sale to its affiliate at the point of sale, with nothing left to reconcile later
Moving attribution to the sale meant back-filling six months of commissions so affiliates' balances didn't appear to reset on the day of the switch.
- 03
Built per-language admin so catalog copy is written in the language it ships in
Per-language admin was settled after the first market's copy came back from a translation vendor describing the wrong products.
- 04
Kept currency at the presentation edge with a single base currency underneath
One base currency sits underneath with presentation applied at the edge and the rate stamped on the order, so historic reporting stays comparable.
- 05
Gave affiliates their own surface so 'what am I owed' is self-serve
Affiliates see owed, pending and paid separately and request a transfer themselves, against a balance snapshot recorded with the request.
The system we were asked to build
The retailer sells into several markets and grows through affiliates instead of paid media. We built the storefront, the localization, and the affiliate ledger that makes the growth model actually payable.
A retailer selling into four markets and growing through affiliates instead of paid media. The affiliate program ran on a spreadsheet, which had worked at thirty affiliates and was failing at three hundred. The engagement was commissioned in a month when the person who maintained that spreadsheet was on leave and nobody could answer a single payout question.
Platform & Commerce Engineering
A balance you can explain
Affiliate balances are built from transactions, so every figure traces back to the entries behind it.
An affiliate balance is the sum of its transactions, never a stored number that gets adjusted. Every figure traces back to the entries behind it, and a disputed amount is answered by showing the ledger instead of opening an investigation. Commissions, adjustments, reversals and payouts are all entries of the same kind, which means nothing can change a balance without leaving a record of why.
- Balance derived from transactions, never a stored figure
- Commissions, reversals and payouts are all ledger entries
- A disputed amount is answered by showing the entries
A partner's own earnings screen: six months of commission paid, owed and pending kept apart, and a statement showing each sale in the currency the buyer actually paid in, with the rate stamped on the order and the entries that make up what is owed.
Paying in French, in euros, with the market's 20% VAT shown inside the total and the referring partner still attached to the order.
Attribution at the sale
A referral is credited when the order is placed, so there's nothing to reconcile at month end.
Attribution is resolved and written at the moment the order is placed, with the referral captured on the session and carried through checkout, so the commission entry exists before anyone asks about it. Month-end reconciliation was where the old arguments happened; there's nothing to reconcile when the credit is part of the sale.
- Referral captured on the session, resolved at order placement
- The commission entry is created with the sale
- Nothing left to reconcile at month end
Per-language admin
Catalog copy graded market by market across English, German, French and Swedish, with the German draft open for approval beside the grid and the gaps keeping products off sale in plain sight.
Catalog copy is written in the language it ships in, and a gap is visible to whoever can fill it.
Catalog copy is authored per language in the admin, so a market's own team writes its own product descriptions in its own words instead of translating someone else's. Missing translations show up as gaps against the source, and the site falls back to the base language instead of rendering a key.
- Per-language authoring, not keys handed to translators
- Missing copy visible as a gap to whoever can fill it
- Falls back to the base language, never renders a key
Where credit is decided: the partner's links and the rates that price them, the orders they earned in each buyer's currency with the exchange rate stamped at placement, and one order's trail, reversed after the buyer sent the goods back.
Currency at the edge
One base currency underneath, presentation currency on top, so reporting stays comparable.
One base currency underneath everything, with presentation currency applied at the edge and the rate stamped onto the order at the moment it was placed. Reporting stays comparable across markets without anyone reconverting historic figures, and a rate move doesn't retroactively change last quarter's numbers.
- One base currency; presentation applied at the edge
- The rate stamped on the order at placement
- Historic reporting unaffected by later rate moves
Self-serve payouts
Affiliates see what they're owed and request a transfer without messaging anyone.
Affiliates see what they're owed, what's still pending clearance and what has already been paid, and request a transfer themselves. Requests carry the balance snapshot they were made against, so a payout approved on Tuesday against Monday's balance can't quietly include Wednesday's reversals.
- Owed, pending and paid shown separately
- Transfers requested self-serve, with no message to anyone
- Requests carry the balance snapshot they were made against
Taking the balance out: the amount, the account, the day it lands and the snapshot it is made against, beside six past transfers including the one that bounced back.
Phase by phase
Phase 1: The Ledger
A Balance Made Of Entries
Built affiliate balances from transactions instead of a stored total, so every figure can be explained by the entries that produced it.
- Affiliate Accounts
- Balance Transactions
- Transfer Out
Phase 2: Attribution
Credited At The Sale
Attributed sales to affiliates when the order is placed instead of reconciling afterward, which is where spreadsheet programs lose money and trust.
- Referral Capture
- Sale Attribution
- Commission Rules
Phase 3: Localisation
Edited In The Language It Ships In
Built per-language admin so a market's catalog copy is written directly, with no key file in between, and a missing translation is visible to the person who can fix it.
- Per-Language Admin
- Catalogue Translation
- Currency Presentation
Phase 4: The Affiliate's Surface
Self-Serve Balances
Gave affiliates their own view of earnings, pending balance and transfers, which removed the single most common support message.
- Affiliate Dashboard
- Payout Requests
- Statement View
The four markets, live one at a time, each with its own language, currency and VAT, and one product shown at all four edges with the same pounds underneath.
What it carries now
−91%
Affiliate balance disputes
4
Markets served
0
Spreadsheets in the payout path
100%
Payout requests self-serve
Balance disputes compares the affiliate support inbox's own tagged volume before and after. Markets served is a count. Spreadsheets in the payout path is zero. Payout requests self-serve is the share of transfers the affiliate started themselves, without a message to the team.
Client name withheld under NDA. Figures are approximate, drawn from the engagement’s own reporting.
What the architecture settled
- 01
A stored balance you can't explain from entries is a dispute waiting for a busy month.
A stored balance has no answer to why, and the month you most need one is the month the person who maintains it is unavailable.
- 02
Attribution at the point of sale is the difference between an affiliate program and an accounting exercise.
Attribution at the sale removes the reconciliation entirely. Attribution at month end is an accounting exercise that affiliates experience as a delay and a doubt.
- 03
Translation keys push catalogue copy to the person least able to judge it.
Translation keys hand catalog copy to whoever is cheapest instead of whoever knows the product, and the first market's returned copy described the wrong items.
- 04
The most common affiliate support message is 'what am I owed', and it is entirely self-servable.
"What am I owed" is the most common affiliate message and is entirely self-servable, which makes it the cheapest support reduction available in this model.
How the work was run
We rebuilt the affiliate balance as a ledger of entries before touching the storefront, because that was the part actively costing money and trust. The localization work followed, and the mobile client came last, once the commercial model was provably correct.
A dedicated team for twenty-eight weeks, with the ledger built before the storefront because everything about the affiliate relationship depends on it. The four markets went live one at a time, so a currency or tax assumption that only holds in one place surfaced against one market's traffic instead of all four at once.
One referred order, click to payout
A balance is only its entries, so a partner can always see why.
Follow a French order from the partner’s link through a language switch, a payment in euros and a return, to the partner taking out what she is owed. Each step shows the balance as the ledger held it then. Choose a step, use the arrow keys once a step is focused, or play the order through.
The referral is captured on the session, not on the page or the language. The buyer switches to English and back; the prices stay in euros because the market is France, and the referral is still attached.
- Partner
- The Allotment Edit
- Link rate
- 10% of the net price
- Session
- s_4vd17
- Market
- France · euros
- Then
- fr → en at 08:03, back to fr at 08:06
In the ledger: No entry. A click isn't money, so the balance doesn't move.
The Allotment Edit’s balance at that moment
Owed
£0.00
Pending
£51.56
- E-31604GB-729981 · 10% via ae-greenhouses+£12.42
- E-31538DE-516233 · 8% via allotment-edit+£4.48
- E-31472FR-207150 · 8% via allotment-edit+£3.04
- E-31410GB-728804 · 8% via ae-raised-beds+£12.60
- E-31366SE-043790 · 8% via ae-raised-beds+£11.35
- E-31319DE-515410 · 6% via ae-tools+£1.27
- + 1 earlier entry, each with its own order+£6.40
7 entries sum to £51.56= owed £0.00 + pending £51.56
Why there is nothing to dispute: every line on the balance is an entry with an order or a transfer behind it, and the balance is only ever their sum. Asked why the greenhouse sale is not in her transfer, the partner already has the answer on screen: +£13.42, −£13.42, and the return between them. Play timing is illustrative.
From a click in any language to a balance made of entries
The ledger was built before the storefront, because everything about the affiliate relationship depends on it. Credit is written with the sale, and the language and currency a shopper sees never reach the numbers underneath.
- 01 · TriggerPartner link, captured on the sessionThe referral rides on the shopper's session and is carried through checkout, whatever language they switch to on the way.
- 02 · At the saleOrder placementAttribution is resolved when the order is placed, and the exchange rate is stamped on the order at that moment.
- 03 · EngineAffiliate ledger (Laravel)Commissions, adjustments, reversals and payouts are entries of one kind, so nothing changes a balance without a record of why.
- 04 · StateEntries in MySQL, one base currencyA balance is the sum of its transactions, never a stored figure, and every amount underneath is in the single base currency.
- 05 · EdgeStorefront and partner surfaceLanguage and currency are applied at the edge, copy falls back to the base language (never a raw key), and payouts carry their balance snapshot.
Paying partners right
Payout accuracy & attribution across markets
A language switch can't drop the referral
The referral is captured on the session and resolved when the order is placed, so the commission entry exists before anyone asks. Currency is presentation at the edge, and the order keeps the rate it was placed at.
A payout pays what it was requested against
Each transfer request carries the balance snapshot it was made against, so a payout approved on Tuesday against Monday's balance can't quietly include Wednesday's reversals.
Every figure has entries behind it
A balance is the sum of its transactions. Commissions, adjustments, reversals and payouts are all entries, so a disputed amount is answered by showing the ledger instead of opening an investigation.
Selling in several languages and paying partners out of a spreadsheet? Scope your build in 3 minutes.
Scope your buildNearby engagements
Data & AnalyticsA checkout that stopped losing sales to a 6-second load
Profiling found the real bottleneck behind a slow checkout (an N+1 query and an oversized bundle) and tuned both, with before-and-after metrics locked in as a baseline against future regressions.
E-commerce & Retail · 5 weeks
Web PlatformsA reader people finish, and a library that remembers where they stopped
A reading platform for a comics catalog: a browse surface people can actually navigate, a reader that gets out of the way, and a history that puts everyone back on the page they left.
E-commerce & Retail · 18 weeks
Web PlatformsOne number, a whole handset, and a database that keeps up with 125 brands
A metered IMEI lookup service that turns fifteen digits into a device, its specifications and its status. It's sold three ways to three audiences and backed by a device database that maintains itself.
Consumer Electronics · 22 weeks
Let's talk
Running a large platform, shaping a first MVP, or getting a product ready for a funding round? Tell us where you are. We'll shape the process around it, and stay with you after launch.














