Operations and control

The block list that costs you sales

A fan types his own surname, and the filter says no. Jersey personalization moderation: what a hard filter quietly costs, and what club shops publish.

Published 9 min read
Diesen Artikel auf Deutsch lesen

On the evening the new home shirt comes out, Leon sits on the sofa and types his surname into the name field. That surname contains a string that is on a block list. The shop returns a red message, and Leon closes the tab.

No ticket, no complaint, no line in any report. One shirt fewer.

Leon is made up. The problem he runs into is real. Of the two possible failures, one ends up in Monday's press and the other nowhere. Leon's evening is the second kind.

A club can say how many incidents it prevented last season. It cannot say what preventing them cost in shirts. The expensive failure is not the hit on the list. It is the uncertain case that nobody decides and nobody writes down.

So what happens to the case the list cannot settle? Today it goes missing in three places: with the vendors, in club terms, and in launch week. The first place is the filter.

The filter knows only yes and no

A hard filter either allows or refuses, even on the uncertain case, immediately and before anyone has looked at it. Leon's surname got the no.

Whoever built it that way did the arithmetic correctly: nothing per case, an answer in milliseconds. The clear-cut case, though, is not the one that costs money.

That a substring catches real names is documented. Kit Builder has published a switch against it since its filter update of September 12, 2024. The page's example is "Gold": tagged, the rule catches the gold watch; untagged, it also catches "golden". The switch exists because the default catches too much.

Two vendors document their content filter in public:

Vendor Page dated Response to a hit
Kit Builder, jerseys and teamwear September 12, 2024 Purpose stated as "detect and block". No order and no quote request goes through.
Zakeke, product personalization at large April 13, 2022 A warning naming the word. Add to cart, save, share and generate PDF all stop.

Both describe the same sequence: the check decides alone, immediately and finally, with no in-between state. That holds for two pages on the day we last read them, not for the products.

For the clear-cut case the sequence fits. But what if the same two characters mean two things?

A person reviews, nobody takes notes

Werder Bremen does not allow 18 or 88 as a custom print. The club's media director, speaking to Deichstube, called them clear codes from the far-right scene. The player shirt carrying 18 stays on sale, because a squad player wears it.

Two characters, two meanings, and the field holds only the characters. The distinction hangs on the origin, not on the string, and a list cannot see origin. The article on the numbers no club will print covers where criminal law ends and club values begin.

A person settles that case, or nobody does, so the clubs have written the person into their terms. Hamburger SV reserves a special review for personalized orders in section 5.2 of its terms and refuses racist, political and discriminatory text. FC St. Pauli's terms carry one line: the club checks every submission.

Three clubs from the English league system, West Ham United, Fulham and Cardiff City, share one template, one URL pattern and nearly the same sentence. Fulham reserves the right to refuse to print shirts it deems "political, religious, offensive or abusive", and an "operator" then contacts the customer.

Our 66-shop audit shows how rarely clubs publish such a rule. Each clause names the review. None names the process behind it: who decides, against what, inside what deadline, and where the result is recorded.

At a club like that, somebody might have called Leon back, but no file would sit behind the call.

While volumes are low, nothing shows. The week it shows is always the same: Leon's week.

Launch week: review without queue or deadline

The two failures do not cost the same. The one that gets through costs a day of crisis communication. The refusal costs a sale and annoys a member, and nobody counts it. A refused supporter does not raise a ticket. They leave, like Leon.

Doing it by hand has a price the shops publish. Eintracht Frankfurt's FAQ states two to four extra working days for player and legend names, and four to six for a freely entered own name. Schalke 04's shop FAQ states up to 21 further working days for a custom-printed shirt.

The gap between player name and custom name has several reasons, and the review is one. It is the only one with no queue, no owner and no deadline in launch week. What else breaks that week is covered in the kit launch article.

So the two familiar answers are clear: refuse on the spot, or call back at some point. There is a third.

Holding instead of refusing

A hard filter merges two things: detection and decision. kit.ink separates them.

The check reads every field that carries text. Names, numbers and free entries run against word rules, number rules, rules for signs such as runes or emoji, and rules for name-and-number combinations. A combination rule fires only when a name part and a number part match together, so free text alone never triggers one.

If somebody disguises a word, it is still recognized: digits in place of letters, dots between them, lookalike characters from other alphabets. A list of allowed values clears ordinary surnames that happen to contain a blocked word. The check classifies. It does not block.

The order control does the holding. An uncertain name or number is held for a human decision instead of being refused outright, and kit.ink hands nothing over meanwhile. The barrier sits on that handover; data a shop exported earlier lies outside it.

A production system may retrieve a personalization only once its state allows it. Every attempt is recorded, the allowed one and the refused one alike. Leon's surname no longer drops out silently.

The limit belongs here. The check covers text: names, numbers, free entries. Images, printed shapes and sponsor rules are another problem, and a separate article covers where a text check ends.

Who gets Leon's case then, and what survives of the decision?

The callback gets a queue

Club terms promise the callback. They do not say where the case sits until then.

At kit.ink it sits in a queue. The reviewer sees the value, the rule, its severity, the channel, the waiting time, and whether a colleague has it open. Every decision needs a reason picked from a fixed set, not typed freely.

One timeline per personalization then shows every state change, every refused attempt, every system that read it or was denied, and who acted. The permanent record never holds the name from the jersey, and the supporter never sees this timeline. That is data hygiene, not a statement about data protection law.

The conversation nobody writes down becomes a record with a date and a reason.

That closes two of the three gaps from launch week: the queue and the owner. The deadline gets a notification: a waiting case tells the team by itself, first a notice and then an escalation, outside quiet hours. A missed target still releases nothing, and nobody measures compliance.

That leaves the list itself. On the day somebody writes it, a block list is rarely wrong.

New rules run quietly first

A block list goes wrong while it sits there. Three years ago a word was a code; today it is a surname in the squad. An exception written for one case now opens ten others.

So at kit.ink every rule has its own life: draft, a quiet run, live, retired. In the quiet run kit.ink counts what the rule would have flagged, and a person switches it on with that number. Going straight from draft to live is impossible by design.

Once a rule is live its meaning is frozen. It accepts no further edit, rather than quietly shifting the meaning of past decisions. Nothing deletes a retired rule either.

For the other direction there is the look back. Before kit.ink lets a word through, it replays it against past decisions and shows which holds it would have suppressed. The look back covers 30 days by default and one year at most, and says nothing about wordings that never occurred.

Rule curation sits with kit.ink, not the club, so this is not self-service. Every imported entry starts as a draft that a person moves into the quiet run and then switches on, alone or several at once. The word lists cover eighteen languages, and a rule's stored reason exists in German, English and French.

That leaves the number the club actually cares about.

Every rule counts how often it was wrong

Every rule keeps its own account: how often it fired, how often it held an order, and how often a person overturned it. The third number is the one a hard block cannot produce at all. Refuse immediately and you never learn how often you were wrong. Leon never shows up in any count.

The count covers at most one year. A rule with no decided cases shows zero, which is no measurement rather than a perfect score.

When a refused wording reappears for the same club, kit.ink puts it up at once with the earlier decision attached. A remembered approval is only recorded and releases nothing by itself. The old case's text is never shown and is not stored in readable form for this. It stays in the decision record, so a decision can be explained later.

Those decisions also produce rule proposals. Nothing enters a live list automatically, and a person always confirms.

So a person still makes the decision. What changes, then?

Leon's name waits for a decision

A hard filter answers the uncertain case with "refuse". The clubs that publish their rule answer it with "a person will call". Neither writes anything down. The whole difference sits there: the same person, the same decision, but with a reason, a visible waiting time and a memory.

Leon's surname then does not fail at the keyboard. It is accepted, and only afterwards does the order control hold the case. Somebody who has seen it handles the rest. No red message, no closed tab.

The block list that costs you sales is the one nobody can overrule.


If you want an outside look at how your own process handles the uncertain case: a short conversation about your setup.

All cited pages were accessed on August 5 and September 22, 2026.