zelts

7 min read

AI-written casino pages in every language, without breaking compliance

AI writes casino pages fast, but each market's ad rules differ and change. Keep rules as rules, check every campaign twice, and let one person approve.

A marketing team writes one push notification for a weekend slot promotion: "Last chance! FREE £50 bonus on Temple of Fortune." In the UK, two phrases in that line break the rules. Ontario does not allow a bonus ad anywhere outside the operator's own site. In Brazil, it fails again, for different reasons.

AI can write that notification in seven languages. That part is solved. The hard part is that every market has its own advertising rulebook, and the rulebooks change.

Here is the takeaway. Keep each market's rules as rules, not as a prompt. Check every campaign before it goes out, and again whenever a rule changes. Let one person approve. That is how we built the AI layer in SpinStack, our casino platform.

Why it is hard

Three things make casino content harder than most.

Volume. A casino needs a page for every game, category, and league. Each one needs a title, meta, structured data, and internal links. Then each one needs every locale, with local URLs, currencies, and number formats.

The rules differ by market. In our demo, the UK, Ontario, and Brazil disagree on basic things:

  • United Kingdom: "free" has to mean free. If a player must deposit or wager, the ad cannot say free. Key terms go in the ad, not behind a link. Every ad carries 18+ and a safer-gambling message.
  • Ontario: no bonus ads outside your own site. No athletes or celebrities. The age mark is 19+, not 18+.
  • Brazil: betting is never extra income or an investment. No deposit bonuses. No promise of success or status.

The rules change. A campaign that passed last month can break a rule today. Nobody re-reads every live banner when a regulator updates a standard.

A model with a long prompt that says "be compliant in the UK" handles none of this well. You cannot point to the rule it applied. You cannot see which version of the rule it used. And when the rule changes, nothing tells you which campaigns to look at again.

How we built it

One pipeline, six stations

Every page in SpinStack goes through the same six stations:

  1. Write. The AI drafts a page from catalog data the core already holds. A new league, such as Serie A, arrives with its sport, country, and fixtures. A new slot arrives with its reels, lines, and features.
  2. Optimise. Title, meta, structured data, and internal links.
  3. Translate. Every locale gets its own URL, currency, and formats. The demo shows seven: English, German, French, Spanish, Portuguese, Italian, and Japanese.
  4. Compliance. The AI checks the page against each market's advertising rules. A flagged page goes back to the writer.
  5. Editor review. One person approves, or edits a line.
  6. Publish. The page goes live in every market at once.
SpinStack: the content pipeline From SpinStack's content pipeline. One new page at a time, through all six stations, then live in every market.
Temple of Fortune New game /slots/temple-of-fortune
  1. 01 / 06 Write

    A page drafted from new catalog data.

    0 words 3 sources
Live The first page goes live in a few seconds…

The compliance station catches things the writer missed. In the demo, the Temple of Fortune page goes through with "free spins" changed to "bonus spins". The Speed roulette page loses a "win big". The Jackpot slots page gains its 18+ line.

Rules as rules

The AI reads each market's advertising regulation once and turns it into a list of named rules. In the demo, the UK document is 48 pages and becomes 126 rules. Ontario's is 36 pages and 94 rules. Brazil's is 31 pages and 88 rules.

Each rule is a short, plain statement with an ID: "Free means free", "No athletes or celebrities", "Not income, not an investment". That list, not a prompt, is what the check runs against.

Nothing the AI extracts goes live on its own. The operator's compliance team reviews the rules and signs them off first, so the check only ever runs against a list they approved.

Every flag names its rule

When the check finds a problem, it does not return "this ad is non-compliant". It returns a flag of one of three kinds:

  • Don't say. Remove a phrase. "And you're guaranteed to win big" goes, because the UK rules never let an ad suggest that winning is likely.
  • Change. Reword a phrase. "FREE £50 bonus" becomes "£50 deposit bonus", because the player has to deposit.
  • Must say. Add a line the market requires. "18+ · Take time to think." in the UK. "19+ · Know your limits. Help is available." in Ontario. "18+ · Jogue com responsabilidade." in Brazil.
SpinStack: the compliance check From SpinStack's compliance layer. One campaign per market. Every flag names the rule it breaks.
5 issues before it can ship en-GB
Push notification now

Last chance! FREE £50 bonus on Temple of Fortune

Deposit £10 and spin the reels, and you’re guaranteed to win big.

Missing: Key terms in the ad Missing: 18+ and a safer-gambling message

What to change

  • Change No pressure to play now

    Last chance! → This weekend:

  • Change Free means free

    FREE £50 bonus → £50 deposit bonus

  • Don’t say No promise of winning

    , and you’re guaranteed to win big → Remove it

  • Must say Key terms in the ad

    → 10x wagering, max bonus £50. Full T&Cs apply.

  • Must say 18+ and a safer-gambling message

    → 18+ · Take time to think.

Each flag carries the rule it breaks, the reason in plain words, the original text, and a suggested fix. Here is that shape in TypeScript, and in Rust, where the compiler makes sure every kind of flag is handled:

type IssueKind = 'avoid' | 'reword' | 'add';

type Issue = {
    kind: IssueKind; // don't say, change, or must say
    rule: string; // the market rule it breaks, e.g. 'free'
    reason: string; // why, in plain words
    original: string; // the flagged phrase
    suggestion: string; // the fix, or '' to remove it
};

The rule field is the important one. A compliance lead can read the flag, open the rule, and see where it came from. The decision is traceable, so you can defend it.

Every flag names its rule.

Checked twice

Every campaign is checked twice. Once before it goes out. Again when a market's rules change, for every campaign already live.

The second check is the one most teams skip. It is also the reason to keep rules as rules. Because each rule has an ID, a change to one rule tells you exactly which checks to run again. With a prompt, you would have to re-read everything, or guess.

Rule changes usually start outside the operator. When the relevant body, such as a national gambling regulator, publishes an update, SpinStack reads the new version and extracts the rules again. Compliance signs off the changes, and every live campaign is checked against the new list. If an update needs to go in early, or one is missed, compliance can start the same reread by hand.

Responsible gambling stays in the core

The AI personalises each campaign to how a player plays: what they like, when they play, and their language. Every version still passes two checks before it goes out: the market's rules, and the player's own limits.

Player limits live in the core, not in the marketing tool. Deposit, loss, and time limits, self-exclusion, and the audit trail apply to every brand. A player on a cooling-off break gets no campaigns until the break ends. No campaign setting can override that.

One person approves

The AI writes, optimises, translates, and checks. A person approves. That person is not producing pages. They are reviewing pages that arrive already checked, with every flag explained.

One page. Seven markets. One approval.

Trade-offs

Reading the regulation once costs time up front. Turning a 48-page document into 126 rules is real work, and compliance has to review and sign off the result. But the check then runs against a fixed list, so the same campaign gets the same answer every time.

Rules are simplified statements. A rule like "Free means free" is shorter than the clause behind it. That is useful for checking and for explaining a flag. So each rule must keep its link to the source clause. A reviewer can then always read the original.

The check suggests; it does not decide. A flag comes with a suggested fix, but the editor can change it. We kept a person at the end of the pipeline because the stakes call for one.

We would version the rules from day one. Every flag should name not only its rule, but the version of the rule it was checked against. Then, when a regulator rewrites a clause, a reviewer can see which campaigns passed under the old wording and which under the new.

The takeaway

AI writes casino pages fast. Speed is not the problem. The problem is proving that every page, in every market, follows rules that keep changing.

So keep each market's rules as rules. Check every campaign before it goes out, and again when a rule changes. Make every flag name its rule. Let one person approve.

You can open the SpinStack demo and run the compliance check on all three markets yourself.

Stuck at compliance? Tell us what you're building and where it's stuck.