Kompatibel mit
Notes on the translation pipeline behind Cardmuseum and Shield N Show, and the guards it grew after a marketplace enforcement week
Cardmuseum and Shield N Show sell in nine languages with nobody on payroll who speaks them all. What makes that survivable has almost nothing to do with the model call.
Our cards-and-accessories venture, the one that is supposed to run itself, sells in nine languages: German, French, Dutch, Polish, Swedish, Czech, Danish, Spanish, Italian. Every product description, every marketplace title, every bullet point exists in all of them, and nobody on payroll speaks more than three. Every edit lands in a queue; a worker picks it up and pushes it through an LLM.
That last sentence is the part people find impressive, and it’s the least interesting part of the system. Calling a model is one HTTP request. The system is everything wrapped around it, and most of it exists because of one very bad week.
Earned the hard way
The first version did the obvious thing: take the text, ask the model nicely, write the answer back. It read fine. Then one of our marketplaces delisted a large slice of the catalogue for trademark violations.
The appeal came back in our favour, in visibly machine-translated German. Translated back, with the sender redacted:
The trademark-infringement reports filed against your listings were published in error. […] caused by an automated system that did not correctly recognize the German compatibility phrase.
The copy had been compliant all along, and the listings came back because we pushed. One automated system flagging us, a second clearing us, and the notice itself machine-translated.
Being innocent was luck, not design. A marketplace reads your copy the way a compliance machine does. Reword “compatible with” a little too creatively and a third-party brand name reads as your brand. Translate a set name that was never meant to be translated and the listing no longer matches the catalogue data. Our first version could have produced translations that were fluent, plausible and genuinely non-compliant, and the dashboard would have looked just the same.
The wrong lesson would have been “LLMs can’t translate.” The right lesson was narrower: the model call may be probabilistic, but everything around it must not be. Where a machine is the reader, you want exact strings you can point at, and the shortest possible case in the appeal queue.
Translate the change, not the catalogue
The engine is a pipeline over changed text, not over products. Every source field has a content hash; every stored translation remembers the hash it was made from. For every changed field the worker asks one question: does the stored translation still match its source? Only stale or missing fields go to the model, cross-checked against Shopify’s own “outdated” flag, so the two systems can’t drift apart.
TRANSLATION ENGINE · WAKES EVERY 10 SECONDS · ONE PRODUCT PER TICK
Hashing buys two things for free. Identical source strings are translated once and fanned out: twenty variants sharing a title cost one call. And the whole pipeline is idempotent: run it twice, nothing happens twice. Fields are batched (at most 25 per call, at most 12,000 characters) and the model answers into a strict JSON schema at temperature zero, so “creative formatting” is not available as a failure mode.
Even the source is a lever. Copy exists in English and German, and when the model translates into a third language it gets both versions at once. Two sources triangulate meaning better than one: what is ambiguous in English is usually pinned down by the German, and vice versa. Feeding the second source text is the cheapest quality win in the whole system.
The glossary is a spreadsheet
The entire language policy lives in a Google Sheet, one row per language:
GOOGLE SHEET · “GLOSSAR” · ONE ROW PER LANGUAGE · EDITED IN THE BROWSER
| Lang | Tone instruction | Do not translate (6 of ~78) | Preferred terminology |
|---|---|---|---|
| de | informal, address the customer as “du” | VSTAR · Tera · ACE SPEC · PSA · Booster Box · Toploader … | Sleeves = Kartenhüllen · Binder = Sammelalbum · graded = gegradet … |
| fr | formal, “vous”, never slang or verlan | VSTAR · Tera · ACE SPEC · PSA · Booster Box · Toploader … | Sleeves = pochettes · Binder = classeur · graded = gradée … |
| pl | informal, “Ty” capitalized; avoid overusing “mega” | VSTAR · Tera · ACE SPEC · PSA · Booster Box · Toploader … | Sleeves = koszulki · graded slab = gradowany slab … |
| sv | “du”; avoid overusing “grym” and “sjukt” | VSTAR · Tera · ACE SPEC · PSA · Booster Box · Sleeves … | deck = lek · Binder = kortpärm · graded = graderad … |
| cs | formal written Czech (spisovná čeština, vykání) | VSTAR · Tera · ACE SPEC · PSA · Booster Box · Toploader … | Sleeves = obaly · Binder = album · graded = gradovaný … |
+ four more languages, and a Notes column recording why — e.g. “Sleeves stays English in Swedish: market data.”
This is the load-bearing concept: config the business can edit. Tone is policy: German customers are addressed informally as “du”, French formally as “vous” with slang explicitly banned, Czech in formal written spisovná čeština. The do-not-translate column is brand law, about 78 terms per language: game mechanics (VSTAR, Tera, ACE SPEC), set names, grading companies (PSA, BGS, CGC), category nouns the market expects in English. Preferred terminology is a controlled vocabulary, applied longest-match-first so “Acrylic Display Case” wins over “Display Case”. And the Notes column holds the institutional memory: why Swedish keeps “Sleeves” in English (market data), why a tone change means a forced re-run of old copy.
Changing any of it is editing a cell: no deploy, no prompt archaeology.
Deterministic where compliance lives
Some words are not allowed to be creative. The phrase before a third-party brand, the exact thing a marketplace’s compliance machinery reads, comes from a fixed map: kompatibel mit, compatible avec, kompatybilny z, no synonyms, no variation between fields. And our own brand obeys a position law: if a source title begins with “Shield N Show”, every translation begins with “Shield N Show” — even where the target grammar would rather it didn’t.
ONE TITLE · NINE LANGUAGES · TEN SECONDS BEHIND EVERY EDIT
■ brand: always the first words ·■ compatibility word: fixed lookup, never generated · the third-party brand stays verbatim, in every language
The general concept: partition your output into generated and looked up. Wherever a machine will read the text (a regulator, a marketplace filter, a trademark bot), use a table. Save the model for the parts a human reads.
Never write what you can’t validate
Every model response passes through gates: hard character limits (an marketplace title must fit 75 characters in the target language), a script check (the translation may not introduce any alphabet or emoji the source didn’t contain), and structural checks (rich-text JSON must still parse). A failing field gets a correction round: the model sees its own attempt plus a list of violations, at most twice, with a tighter budget each time.
Then the rule that matters most: a field that still fails is dropped, not written. The previous translation stays live. Stale-but-correct beats fresh-but-broken, every time, and every drop is logged for a human. The same limits are checked a second time, independently, when the marketplace feed is built: the guard we didn’t have that week now exists twice, in two different services.
What still goes wrong
Spot-checks are still human, and native speakers still find copy that is valid, compliant, and slightly off; the glossary grows a row every time. Policy changes don’t heal old text by themselves: flipping French to “vous” meant forcing a re-run over everything French. And Czech periodically needs a bigger model. The product copy engine also has a quieter sibling that carries the shop theme and the transactional emails into the same nine markets: different pipeline, same concepts.
Underneath, this is the same shape as the rest of the company: a probabilistic worker inside a deterministic harness, and a system that would rather do nothing than do the wrong thing.
Cardmuseum is at cardmuseum.shop and Shield N Show at shield-n-show.com, both our own shops, so read every kind word above accordingly.