Skip to the content
Krizaka Blog
All posts

PaymentsBuilding Krizaka · part 1 of 1

Taking a payment: the question I keep asking, and what a "high-risk industry" means

Before the first invoice, you need to know who will agree to move the money. What Stripe, PayPal and Square refuse, what the card networks require, and how it changes the code of our products.

A flat blue illustration: a card payment terminal and a ledger on a pale blue background, joined by thin network lines

On 15 October I reread the payments code of Orochia, our creator video platform. I landed on a sixty-line function that did everything at once: validate, lock, apply the rules, move the credits, write the ledger. It worked. It still scared me, and I opened an issue to rewrite it.

Reading that code, I realised the real question wasn't in it. The code already talks to four payment gateways. None of them has agreed to work with us yet. And for some of our products, that is not a given.

A flat blue illustration: a card payment terminal and a ledger on a pale blue background, joined by thin network lines
An illustration made for this post with Orazaka (Stable Diffusion 3.5 Large, hosted). Not a real terminal, no real brand.
How this was made
Model
Stable Diffusion 3.5 Large · Stability AI Community Licence
Engine
hosted: DigitalOcean serverless inference (steps and guidance not exposed)
Machine
hosted by the provider (not our machine)
Through
Orazaka Studio run on dev.orazaka.com
Studio
image-generation
Prompt
Minimalist flat vector illustration, editorial style: a single card payment terminal standing on a plain deep navy background, beside it a closed ledger notebook, a few thin cobalt-blue lines with small round nodes connect them like a network diagram. Clean geometric shapes, two-tone navy and cobalt blue with soft white highlights, lots of empty space, centered composition, matte, calm. No people, no hands, no text, no letters, no numbers, no logos.
Seed
721081288
Size
1024×1024
Time
7.5 s, as recorded by the run
Cost
US$0.08 (the provider's price)
Orazaka run
87694bea-beb7-48c4-8baf-979f7d01422a
Note
The cover of this post; a first run of the same Studio (0fdc980b-1ba6-4ff8-8a8e-b9093b465030, 512×512, a busier prompt) was not kept.

The question

When you build software that takes money, you think about the checkout screen first. The button, the amount, the receipt. The first question is somewhere else: which company will agree to move this money for you?

A payment processor is a bit like a landlord renting out a shop. They don't rent to just anyone. They look at what you do, they ask themselves what it will cost them if things go wrong, and they set their terms. Some businesses they turn down. Others they accept with a big deposit.

That's what people call "high-risk industries".

What the big three say

I read the lists of the three names everyone knows. They are public, and I'd advise you to read them before you write a line of code.

Stripe's list of restricted businesses prohibits pornography and other mature audience content, including when an AI generated it. It also prohibits games of chance, and that line covers contests and fantasy sports.

PayPal's acceptable use policy prohibits "certain sexually oriented materials or services". For gambling, sports betting and fantasy sports, it asks for pre-approval.

Square's Canadian page lists adult entertainment "in any medium" and betting among its unsupported industries.

These aren't moral judgements. They are risk sums. When a customer disputes a payment with their bank, that's a chargeback: the money goes back, and fees come on top. In some categories, disputes happen more often. The processor protects itself.

The ones who say yes, and at what price

Specialist processors exist. CCBill, for example, presents itself as payments "for mainstream and adult content platforms". I don't know their rates yet: there is no public price list, it's negotiated case by case. So I won't invent a number here.

What I do know is the mechanism that comes up everywhere: the reserve. The processor keeps part of every payment for a while, in case disputes come in. Stripe explains it itself: usually 5 to 15% of each transaction, held over a rolling period, for example 180 days. And it's often required of businesses with no history. A new company in a watched category is exactly us.

In practice, if you take $1,000 on a Monday with a 10% reserve, $100 stays locked for six months. For a small company that's not a detail. It's cash that sleeps.

Above the processors, the card networks

The processor doesn't have the last word. Above it sit Visa and Mastercard.

In April 2021, Mastercard tightened its rules for adult content sites. The banks that connect those sites to its network must certify that they have controls to monitor, block and take down illegal content. They also need documented age and identity verification for the people who appear and for those who upload, and clear, documented consent.

A few months later, in August 2021, OnlyFans announced a ban on sexually explicit content, citing pressure from its banking partners, then reversed it within a week after getting "assurances" from those same partners. I keep one thing from that story: even a huge platform depends on the goodwill of a few banks.

What it changes in our code

Orochia is a creator video platform, and part of what it will allow is for adults only. So it sits in that zone, and I knew it from day one. The merchant accounts issue says it plainly: adult content excludes Stripe. So the code talks to CCBill, Segpay, a crypto gateway, and to Stripe only for tests and deployments without adult content (orochia#7).

That changed the design in a few ways.

Auctions are paid in held credits. When you bid, your credits are set aside. If someone outbids you, they come back. If you win, they are spent. The auctions documentation sums it up in one line: the winner has always already paid, with no chargeback race at the end.

Money moves once. Every movement carries a unique reference, and a payment settles only when the gateway's signed message arrives. If the message arrives twice, the second one does nothing.

Chargebacks must reach the balance. An audit found a hole (orochia#167): a creator's balance didn't subtract disputed payments. Someone could ask for a payout before the dispute arrived, and the platform would have paid twice. It's not fixed yet, and it has to be before the first real dollar. The payout rules, like the minimum amount, are also leaving the code to become versioned data that can be adjusted without a redeploy (orochia#205).

And age and identity checks aren't an option we'll add later. Under Mastercard's rules, they are a condition for existing at all.

For Kachizaka, our predictions game between friends, I made the opposite call: points, never money. The moment you add a stake and a prize, you enter Stripe's "games of chance" line and PayPal's "pre-approval" box. I'd rather that product never goes there.

What isn't decided

A lot, and I'd rather say so.

No merchant account is open. To apply for one, the company first needs its registration numbers and a bank account, and that's still in progress. I don't know which processor will say yes, with what reserve, or at what rate.

I also don't know how long proofs of age and identity must be kept, or in what form. Those are legal questions. I'll ask a lawyer before launching anything, and this post isn't legal advice: it's me thinking out loud.

What you can take from it

If your product comes anywhere near one of these categories, read the processors' lists before you write the payments code. Plan for money staying locked for months. Make sure no payout leaves before disputes have had time to arrive. And keep your money rules in data, because you will change them.

This post opens a new series, "Building Krizaka", about what surrounds the code, money and law first. The technical posts about the engine go on in "Building Orazaka".

Keep it, pass it on

Related posts

AI · 6 min read

Models that refuse, models that refuse nothing: what exists, why, and what Orazaka does

Why a hosted model says no, what "uncensored" models are, what the law and the card networks ask of whoever runs them, and how Orazaka's content policy decides.

The basics

AI · 8 min read

Understanding AI before you start: the words, without the jargon

Token, context window, quantization, RAG, MCP, agent, diffusion. The words I use without explaining them, taken one by one with a simple picture and what really runs on our side.

The basics

AI · 7 min read

The anatomy of an AI prompt: what each added line really changes

A six-word prompt, then three layers of detail, on my Mac with the same seed. What gets better, what gets worse, what a negative prompt can do, and what I didn't prove.

Measured