Skip to main content
Payments platform · Pay-by-Link · 2020 → todayIn continuous production since 2021

From a tool
to infrastructure.

Five years evolving a payments platform that today moves millions of euros.
Case published with the client's consent. Company names and implementation details omitted by agreement.
5
product versions
thousands
transactions a day
€3M+
collected in one month by the largest client
2
regulated sectors
since 2021
continuous production, no downtime
—The product

A complete platform for remote collections.

Born during the Covid emergency as a solution for digital payments, SinerPay is today a complete platform for remote collections.

The flow is essential by design: a campaign, a list of contacts, a personal, expiring payment link delivered on the chosen channel. Whoever receives it pays in seconds, from any device — no counters, no queues, no sign-ups.

The flow
1
Campaign
The collection initiative, configured by the client
2
List
The contacts to reach, organized
3
Link
Personal and expiring, delivered on the chosen channel
4
Payment
In seconds, from any device
NO COUNTERS · NO QUEUES · NO SIGN-UPS
01The starting problem

In 2020 their customers
could no longer pay.

Counters were closed, physical collection points out of reach. Bills went unpaid not for lack of will, but for sheer impossibility.

On one side, people who wanted to settle up and couldn't; on the other, companies with cash flow at a standstill.

The product's first version was born to solve exactly this. No platform ambitions: a single flow, stripped to the bone. The company uploads the contact list, the system sends each person a personal link, the recipient opens it and pays.

The interface was minimal because the problem was clear — and nothing else was needed.

It worked.

Product note
When the same problem shows up in two markets that have nothing in common, you're no longer solving one client's case: you're looking at a product. That's the moment this project changed nature — and where the real work began.
02The scale test

Same problem,
a completely different scale.

Then a large financial operator arrived. The product was no longer a tool on the side of the process: it entered the critical flow of a regulated organization, with volumes an order of magnitude higher and a margin for error close to zero.

The context was high-pressure: deadlines set long before, a client who had already announced a date to their own organization, a calendar that left no room.

In those conditions the temptation is always the same: cut reviews, skip tests, claw back days. We did the opposite. Test cycles kept, reviews kept, discipline kept — precisely while everything pushed the other way.

Peak month · single client
€3M+
The product went into production and never left it.
Studio principle
Under pressure, quality isn't a luxury to postpone: it's what lets you stay fast the following week too. Every shortcut taken in a hard week comes back, multiplied, in all the ones after.
03From bespoke solution to platform

Generalization is the phase
where products lose their way.

The risk isn't technical: it's one of judgment. When every client asks for something and every request seems reasonable, you end up building features no one will really use — code written, tested, documented and maintained for years, for nothing.
The API
The heart of the system.
The control panel
Where the client configures and governs their own work.
The payment app
What the person opens when they receive the link.
From there the product began to grow: client after client, version after version.
On technical debt

A product that grows in a volatile context accumulates choices made in a hurry. It's natural, and pretending otherwise is dishonest.

The difference between debt suffered and debt managed is awareness. Every time a priority put an area of the product on hold, it was a decision made, noted and planned — not an oversight discovered two years later.

04Five years of listening in the field

A log of what hurt the people who used the product.

Every installation at a new client, every report, every malfunction came through us — with no intermediaries. At first it was a cost. Then it became the project's most valuable asset.

We started keeping a log. Not of bugs — those get fixed and forgotten — but of which operation took three steps instead of one. Where people got stuck. What they asked for on the phone in a tone that betrayed their frustration.

After years, that log had become something no product management meeting could ever produce: the exact, verified list of the points where the product let its users down. Three themes came back more than all the others.

01
User management
The daily friction — logins, permissions, password resets. None of these is a feature for a demo, but together they generated more support requests than any other area of the product.
02
Installation
Bringing the product to a new client was a long, manual operation, repeated identically every time.
03
The campaign model
The deepest theme. You created an "SMS campaign" or an "email campaign": the communication channel and the initiative were the same thing. A modeling error, not a bug — and its consequences propagated everywhere.
The point
When the same change has to be made in three places, the problem isn't in the three places: it's in the model. v5 wasn't born from a desire to rewrite. It was born from recognizing that the domain was modeled badly, and that every new feature would pay that price forever.
05Version 5

Designed for a year,
before a single line of code.

It's not an update: it's the product rebuilt from scratch — same language, a few key technologies in common, everything else new. And it doesn't come from a feature list: it's the sum of the solutions to the pain points gathered over five years of direct contact with the people who actually use the product.
The new model
v5 · a hierarchy that mirrors the real work
List
the contacts, organized
Campaign
the initiative
Launch
the concrete execution inside the campaign
Consequences
The channel is a choice of the individual launch
The same campaign goes out by SMS today and email next week
No duplication, no call to support
It looks like a detail. It's the difference between a product the client uses on their own and a product the client has to call support for.
What the client does on their own
Templates with dynamic variables
The client builds their own messages, with their own variable fields, and reuses them. No release, no technical intervention, no waiting. Every time a client edits a message on their own, the product has done its job.
Multiple, scheduled launches
Several executions within the same campaign, each with its own configuration and its own scheduling.
Webhooks and automations
The system notifies the client's other tools based on payment outcomes and specific events. The platform stops being an island and becomes part of the existing workflow.
Per-contact reporting
Payment history and amounts, average amount, number of attempts needed, most frequently used channel. All segmentable by amount bands, with metrics recomputed for each band.
For whoever manages collections the value is this: you stop knowing only who paid and start understanding how people pay. Which channel they respond on, after how many reminders, at what amounts. This is the information you set the next campaign with, instead of repeating the last one.
A limit chosen, not suffered

With this data we could have pushed much further: device, client, browsing behavior. Technically it was within reach. We stopped.

What to collect is defined together with the client, based on their privacy requirements and policies. In a regulated sector, collecting less than you could isn't a product limitation: it's part of what makes it installable.

The same goes for discarded ideas. We explored emotion analysis during payment and abandoned it: asking for an invasive permission to get a datum that two direct questions give better isn't innovation — it's friction.

06Technical deep-dive

The three decisions
that hold up v5.

This section is for those evaluating the project on the engineering side. If that's not you, skip to chapter 07.
From fragmented to consolidated
One tree, one release

In earlier versions each component lived in a separate repository: the API on one side, the panel on another, the apps elsewhere. On paper, modularity. In practice, no: whoever installs the API necessarily installs the panel too.

They were parts of a single product, kept artificially separate. The result: versions to align by hand, changes crossing several repositories, technical onboarding slower than necessary.

With v5 · monorepo
01
API
02
Control panel
03
Payment app
04
Shared libraries
Consistency between components guaranteed by construction — not by attention.
From synchronous to asynchronous
Heavy work no longer happens while someone waits

Uploading a contact list was processed during the request itself, contact by contact. With a few dozen recipients it worked.

With a few hundred, the user was stuck in front of a frozen screen — exactly when they needed to do something else.

In v5 · decoupled operation
1
Accept
The file upload is accepted and recorded, not executed.
2
Return
Control returns to the user immediately, who carries on with their work.
3
Execute
A background process picks up the queued work and runs the sends on the configured schedule.
The release strategy
The most demanding part on the engineering side — and the one you see least.

Rewriting a product in production at clients in regulated sectors can't be a single event, with everyone migrating the same day. No client accepts that risk, and they're right.

The v5 architectural patterns were back-ported to the existing installations, incrementally, starting from the areas of greatest pain.

Incremental back-port
The asynchronous send model reached clients still on earlier versions — benefit without migration.
Full v5
In production at the first client, in validation.
The other clients
They'll follow on their own timeline — not ours.
Stack
TypeScript end-to-end · Next.js · React · Turborepo · MySQL
07Where we are today

Five versions.
The product keeps evolving.

A product born to solve one company's problem during an emergency, today installed at operators in two regulated sectors, with thousands of transactions handled every day. v5 is in production.

In five years it's not just the code that changed. What changed is how you decide what to build: no longer from a request that arrived by email, but from what we saw happen in the field — installation after installation, call after call.

Sectors
two, regulated
Transactions
thousands / day
v5
in production
Product direction
in-studio
SinerPay · control panel v5
Control panel · v5
SinerPay · per-contact report
Per-contact report
SinerPay · payment app
Payment app
—How we work

This project tells
the studio's method well.

We stay close to the people using the product
The best decisions of these five years didn't come out of a meeting: they came out of an installation gone wrong and the phone call of a frustrated user.
We treat technical debt as a decision
Some things wait. But they wait because it was decided — and it's written down somewhere.
We prefer removing to adding
A product that does well what's needed is worth more than a product that does everything mediocrely.
We build for whoever comes next
Typed, documented code, structured so another team can open it without calling us.
Do you have a product to build — or one that grew faster than its architecture?
Book a call
Next case →
Crosslink
A companion app that turns a platform's scattered, one-at-a-time features into single cross-cutting workflows.
Read the case
Get in touch

Gotathingyouneedshipped?

SinerPay — Studio Seahorse