Skip to content

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.

Partner-VorschauAngemeldet als The Allotment Edit · Provision 8 % auf den Nettopreis, auf jeder Kachel angezeigt Link kopieren: ae-raised-beds
PollenryWonach suchen Sie?Deutschland · DE · €3 · 221,45 €
Garten

148 Artikel · Hochbeete, Gewächshäuser · Preise in Euro inkl. 19 % MwSt.

Sortieren: Beliebt
Sprache gewechselt: English → Deutsch.Ihr Warenkorb mit 3 Artikeln ist noch da, jetzt in Euro.Zum Warenkorb
Bestseller

Hochbeet aus Lärchenholz, 120 × 60 cm

189,00 €

inkl. MwSt., zzgl. Versand

Partner-Provision12,71 €

Balkon-Gewächshaus mit Folienhaube

149,00 €Im Warenkorb

inkl. MwSt., zzgl. Versand

Partner-Provision10,02 €

Terrakotta-Töpfe, 3er-Set

34,90 €

inkl. MwSt., zzgl. Versand

Partner-Provision2,35 €

Gießkanne aus verzinktem Stahl, 10 l

42,50 €Im Warenkorb

inkl. MwSt., zzgl. Versand

Partner-Provision2,86 €

Gartenschere mit Bypass-Klinge

29,95 €Im Warenkorb

inkl. MwSt., zzgl. Versand

Partner-Provision2,01 €
Neu

Tropfbewässerung, Starterset

54,00 €

inkl. MwSt., zzgl. Versand

Partner-Provision3,63 €

Pflanzkübel aus Fiberglas, Ø 50 cm

79,00 €

inkl. MwSt., zzgl. Versand

Partner-Provision5,31 €

Solar-Wegeleuchten, 6er-Set

39,90 €

inkl. MwSt., zzgl. Versand

Partner-Provision2,68 €

The shape of the work

Industry

E-commerce & Retail

Duration

28 weeks

Cooperation model

Dedicated team

Services
Commerce engineeringAffiliate platformLocalisation
Integrations
Payment gatewayCurrency rates feedTransactional emailPush notifications
Technologies
LaravelPHPMySQLBladeFlutterRedis
Team
1 Project lead2 Backend engineers1 Frontend engineer1 Mobile engineer

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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

Introduction

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.

What shipped
  • 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
Earnings

Every figure here is a sum of entries · pounds, with each buyer's own currency beside the sale

Statement, Sep 2026 (PDF)Thu 17 Sep 2026

Owed to you now

£34.66

5 cleared commissions · ready to transfer

Pending clearance

£46.63

6 commissions inside the 30-day return window

Commission paid · six months

£457.14
52.80Apr
71.40May
88.15Jun
64.90Jul
83.57Aug
96.32Sep

Statement · sales since the 1 Sep payout

Buyer's currency · rate stamped at the sale
PlacedOrderBuyer paidRate%CommissionStatus
16 SepSE-044127SEK 2,490.000.07168£11.41Pending
15 SepDE-517902€189.000.84128£10.69Pending
12 SepGB-730566£64.00—6£3.20Pending
9 SepFR-208877€79.000.84098£4.43Pending
2 SepFR-208314€191.500.841210£13.42Reversed
28 AugGB-729981£149.00—10£12.42Pending
21 AugDE-516233€79.000.84378£4.48Pending
17 AugFR-207150€54.000.84418£3.04Cleared
13 AugGB-728804£189.00—8£12.60Cleared
9 AugSE-043790SEK 2,490.000.07128£11.35Cleared
6 AugDE-515410€29.950.84336£1.27Cleared
3 AugGB-728112£96.00—8£6.40Cleared
Commission is on the price net of the market’s VAT, in pounds at the rate stamped on the order

Why owed is £34.66

Entries, not a total
E-31472FR-207150+£3.04
E-31410GB-728804+£12.60
E-31366SE-043790+£11.35
E-31319DE-515410+£1.27
E-31274GB-728112+£6.40
Owed now£34.66

Written, but not owed yet

6 commissions pending clearance+£46.63
E-31655FR-208314+£13.42
E-31802Returned 14 Sep−£13.42

A reversal is its own entry. Both lines stay, so a returned order explains itself instead of quietly vanishing.

On screen

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.

08:12
PollenryFR · €
Panier›Livraison›Paiement

Récapitulatif

Serre de balconAvec housse · 80 × 49 × 160 cm · Qté 1149,00 €
Arrosoir galvanisé, 10 lAcier · Qté 142,50 €

Sous-total191,50 €

LivraisonOfferte

Total TTC191,50 €

dont TVA (20 %)31,92 €

Recommandé parThe Allotment EditLien conservé depuis votre arrivée, rattaché à cette commande
Carte bancaire •••• 4291Paiement débité en euros

Livraison estimée : lun. 7 sept.

Paiement sécuriséTVA incluse

Payer 191,50 €
On screen

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.

What shipped
  • Referral captured on the session, resolved at order placement
  • The commission entry is created with the sale
  • Nothing left to reconcile at month end
Catalogue copy · Garden, autumn range

Written in each market's own language, graded against English, the base language

All four languagesThu 17 Sep 2026
GB

English base

12 live

DE

Deutsch

8 live2 draft1 EN1 gap

FR

Français

9 live1 draft1 EN1 gap

SE

Svenska

7 live1 draft2 EN2 gap

Product × language

12 products
Productendefrsv
Larch raised bed, 120 × 60 cmGD-1204
Balcony greenhouse with coverGD-1318Draft
Terracotta pots, set of 3GD-0877EN
Galvanised watering can, 10 lGD-0912
Bypass secateursGD-0450EN
Drip irrigation starter kitGD-1422DraftGap
Fibreglass planter, 50 cmGD-1106
Acacia herb shelfGD-1450GapEN
Solar path lights, set of 6GD-1461DraftGap
Kneeling pad and tool rollGD-0733EN
Compost bin, 300 lGD-1389Gap
Seed tray set with lidsGD-1475Draft
Approved live in that languageDraft awaiting approvalEN text shown in EnglishGap no title: off sale there

DE Balkon-Gewächshaus · Deutsch

GD-1318 · draft
Written by Anna Vogt, DE market team · English shown in Germany until approved

Titel36 / 80

Balkon-Gewächshaus mit Folienhaube

KurztextKachel und Suche

Drei Etagen für Anzucht und Kräuter, passend für jeden Balkon ab 80 cm Breite.

Beschreibung

Das Gestell aus pulverbeschichtetem Stahl trägt drei Gitterböden mit je bis zu 8 kg. Die UV-beständige Folienhaube lässt sich vorne aufrollen und mit Klettbändern fixieren, damit an warmen Tagen Luft an die Pflanzen kommt. Aufbau ohne Werkzeug in etwa 15 Minuten.

Maße

80 × 49 × 160 cm

Pflege

Haube im Winter trocken lagern
English, for reference only. “A three-shelf growhouse for seedlings and herbs that fits a balcony from 80 cm wide.” Written fresh in German, not translated from it.
Approve for GermanySend back to AnnaSaved 09:02

Per-language admin

On screen

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.

What shipped
  • 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
Partners › The Allotment Edit

Credit is decided when the order is placed · amounts in the buyer's currency, then pounds at the stamped rate

Nothing to reconcileThu 17 Sep 2026

Links and the rates that price them

4 links · 12 orders since 3 Aug
LinkLands onRateClicksOrdersCommission keptReversed
allotment-editHome8% of net1,2845£29.76—
ae-raised-bedsGarden › Raised beds8% of net6423£34.64—
ae-greenhousesGarden › Greenhouses10% of net9182£12.42−£13.42
ae-toolsGarden › Tools6% of net3772£4.47—

Orders credited at placement

Rate stamped on each order
PlacedOrderLinkBuyer paidRateNet £Comm.Status
16 Sep 22:40SE-044127allotment-editSEK 2,490.000.0716142.6311.41Pending
15 Sep 19:05DE-517902ae-raised-beds€189.000.8412133.6010.69Pending
12 Sep 08:47GB-730566ae-tools£64.00base53.333.20Pending
9 Sep 21:31FR-208877allotment-edit€79.000.840955.364.43Pending
2 Sep 08:12FR-208314ae-greenhouses€191.500.8412134.2413.42Reversed
28 Aug 13:40GB-729981ae-greenhouses£149.00base124.1712.42Pending
21 Aug 20:14DE-516233allotment-edit€79.000.843756.014.48Pending
17 Aug 07:55FR-207150allotment-edit€54.000.844137.983.04Cleared
13 Aug 18:26GB-728804ae-raised-beds£189.00base157.5012.60Cleared
9 Aug 12:02SE-043790ae-raised-bedsSEK 2,490.000.0712141.8311.35Cleared
6 Aug 09:38DE-515410ae-tools€29.950.843321.231.27Cleared
3 Aug 16:10GB-728112allotment-edit£96.00base80.006.40Cleared

Trail · FR-208314

2 Sep 2026
Link ae-greenhouses clicked07:58Referral captured on session s_4vd17 · market France, euros
Language switched fr → en08:03Referral stays on the session; prices stay in euros
Language switched en → fr08:06Referral still attached
Order placed · €191.5008:12Rate 0.8412 stamped · net £134.24 · E-31655 +£13.42
Goods returned14 SepE-31802 −£13.42 · both entries kept
Net effect on the balance£0.00
On screen

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.

What shipped
  • 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.

What shipped
  • Owed, pending and paid shown separately
  • Transfers requested self-serve, with no message to anyone
  • Requests carry the balance snapshot they were made against
Transfers

Take out what you're owed · no message to anyone, every transfer requested here

Thu 17 Sep 2026

Request a transfer

Paid in pounds

Amount

£34.66All of what you’re owed

To

Starling ···· 7730Sort code ··-··-41Change

Lands

Mon 21 Sep 2026

Made against

BS-7Q4K snapshot, 09:14

Request £34.66A reversal after this request comes out of a later balance, never this transfer.

Owed, pending and paid, kept apart

Owed now5 cleared entries · this is the transfer above£34.66
Pending clearance6 entries · the last clears 16 Oct 2026£46.63
Paid, six monthsTransfers that landed, Apr to Sep£457.14

Each figure opens to the entries that make it up.

Past transfers

The six before today · all requested by you
TransferRequestedToRequested byAmountLandedStatus
TR-11881 Sep 2026Starling ···· 7730You, self-serve£96.323 Sep 2026Paid
TR-10413 Aug 2026Starling ···· 7730You, self-serve£83.575 Aug 2026Paid
TR-09178 Jul 2026Starling ···· 7730 · Re-sent to the updated accountYou, self-serve£64.9010 Jul 2026Paid
TR-09021 Jul 2026Monzo ···· 2186You, self-serve£64.90Returned 3 JulBounced
The bank returned it: account closed. £64.90 went back on the balance as entry E-30417.
TR-07792 Jun 2026Monzo ···· 2186You, self-serve£88.154 Jun 2026Paid
TR-06551 May 2026Monzo ···· 2186You, self-serve£71.405 May 2026Paid
Pending entries are never in a transfer: they join the owed balance on the day their return window closes.
On screen

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.

Process

Phase by phase

  1. 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
  2. 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
  3. 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
  4. 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
Markets

Four markets, live one at a time · language and currency at the edge, pounds underneath

Thu 17 Sep 2026
GBLive

United Kingdom

Went live first · 12 Jan 2026

LanguageEnglish

CurrencyGBP · base

VAT in prices20%

Garden copy12 of 12 approved

DELive

Germany

Went live second · 9 Feb 2026

LanguageDeutsch

CurrencyEUR

VAT in prices19%

Garden copy8 of 12 approved

FRLive

France

Went live third · 16 Mar 2026

LanguageFrançais

CurrencyEUR

VAT in prices20%

Garden copy9 of 12 approved

SELive

Sweden

Went live fourth · 20 Apr 2026

LanguageSvenska

CurrencySEK

VAT in prices25%

Garden copy7 of 12 approved

One product at four edges · Larch raised bed

Base amounts at today's rates
MarketWhat the shopper seesVATRateNet in £
GBUnited Kingdom£189.00 inc. VAT20%base£157.50
DEGermany189,00 € inkl. MwSt.19%0.8412£133.60
FRFrance189,00 € TTC20%0.8412£132.49
SESweden2 490 kr inkl. moms25%0.0716£142.63

An order keeps the rate it was placed at, so last quarter’s reports never move with today’s rate.

What every market shares

One base currencyPounds underneath every price, balance and report
Falls back to EnglishMissing copy shows the base language, never a key
Copy written per languageEach market's team writes and approves its own
One partner ledgerA partner earns in any market into one balance
30-day return windowCommission clears once goods can't come back
On screen

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 it settled

What the architecture settled

  1. 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.

  2. 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.

  3. 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.

  4. 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.

Ways of working

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.

A reader clicks ae-greenhousesWed 2 Sep 2026, 07:58
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.

Architecture

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.

  1. 01 · Trigger
    Partner 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.
  2. 02 · At the sale
    Order placementAttribution is resolved when the order is placed, and the exchange rate is stamped on the order at that moment.
  3. 03 · Engine
    Affiliate ledger (Laravel)Commissions, adjustments, reversals and payouts are entries of one kind, so nothing changes a balance without a record of why.
  4. 04 · State
    Entries 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.
  5. 05 · Edge
    Storefront 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 build
Have a project?

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.