This article was written under the guidance of Michael,
our Senior DevOps Engineer with 10+ years of experience in this domain.
We would especially like to remind you that this article is a continuation and conclusion of the material What to Choose for FinTech and iGaming: Laravel, Symfony, PHP, or NestJS. Part 1, and if you have not read that text, the continuation will not be of practical use to you. We also emphasize that all articles belong to the cycle on the features of development in the areas of FinTech and iGambling from the BeFund blog and the practical experience of our developers. The full list of articles is below:
Now that you’re up to speed, let’s continue discussing when it makes sense to choose PHP, Laravel, Symfony, or NestJS for FinTech and iGaming IT projects.
Fraud/Risk can consist of two parts:
The first case uses:
allow; | request_kyc; |
deny; | block_withdrawal; |
manual_review; | increase_risk_score. |
hold; |
|
Reliability and control are critical here.
Best choice: Symfony or Laravel;
Also possible: Async Risk Analytics — this isn’t a separate technology but rather an approach to data processing and cybersecurity in which risk scoring, detection, and analysis happen asynchronously (in the background), without blocking the system’s core operational processes.
The second case uses:
Kafka; | NestJS consumers; |
ClickHouse; | Rules engine; |
Python ML; | Batch jobs. |
Core rules API → Symfony / Laravel;
Event processing → NestJS / Python / Kafka consumers;
Analytics → ClickHouse.
Fraud/Risk isn’t just a set of if/else statements creating logical conditions to maintain security. It’s a separate domain that can have a synchronous decision layer and an asynchronous analytics layer. That’s why it deserves dedicated attention and development.
ClickHouse doesn’t replace a transactional database. Its role is analytics, reporting, segmentation, and aggregated read models. It’s a good fit for:
payment analytics; | user activity; | risk analytics; |
bet analytics; | funnels; | bonus usage reports; |
settlement reports; | segmentation; | affiliate reports. |
wallet transaction reports; | multi-brand reporting; |
|
Let’s take a look at the diagram:
There’s no single best technology for this. You can use NestJS, Laravel queue workers, Symfony Messenger, Go, Python, or Kafka Connect.
The one thing to always remember: ClickHouse is a read/analytics layer. It should never be the source of financial truth. Otherwise, you won’t avoid data-mismatch problems — and, by extension, the risk of losing money.
An API Gateway or BFF is needed when you have web, mobile, backoffice, and many internal services. It’s responsible for:
brands; | risk thresholds; |
countries; | payment providers; |
currencies; | bonus rules; |
payment providers; | KYC rules; |
limits; | maintenance modes; |
This service can be built equally effectively with Symfony, Laravel, or NestJS, so the choice depends on you and your team.
Symfony → if the config has a complex domain model and needs auditing;
Laravel → if you need a quick admin panel and CRUD;
NestJS → if the config is used heavily by the frontend/mobile/gateway.
With Config / Feature Flags, functionality matters more than technology. You can choose anything, but you must ensure:
versioning; | feature rollout; |
audit; | permission control; |
rollback; | API for services; |
per-brand config; | cache; |
per-country config; | high availability. |
The Credentials Service, or secrets layer, is responsible for securely obtaining access to external systems. It needs to work with:
Vault; | Google Secret Manager; | Keeper Secrets Manager; |
AWS Secrets Manager; | Azure Key Vault; | 1Password Secrets Automation. |
The tasks this microservice handles include:
In other words, the Credentials Service can also be written in Symfony, Laravel, or NestJS, but it must be minimalistic, well isolated, have strong auditing, minimal dependencies, clear access control, and integration with a secret manager.
Symfony → if it’s a critical enterprise service;
NestJS → if it’s part of the gateway/platform layer;
Laravel → if you need an admin panel for management, but secrets must still live in Vault/Secret Manager.
The main thing to remember from our previous articles, and which we’ll repeat here: credentials must never live in code, containers, or a shared .env file. Access to secrets should be granted to services, not people.
For FinTech and iGaming, working with brands is a narrower and more critical concept than in other businesses. It’s not just about “adding a brand_id column to a table” and expecting everything to sort itself out. Precision and alignment with the key differences between brands matter here. These include:
payment routing; | currencies; | CRM; |
provider credentials; | countries; | reporting; |
bonus rules; | themes; | permissions; |
risk rules; | domains; | feature flags; |
KYC requirements; | segmentation; | limits. |
That’s why the technology stack needs to support a number of key capabilities:
Let’s look at an example:
For instance, Kafka events must also carry brand context:
{
“event_id”: “evt-123”,
“event_type”: “payment.deposit.succeeded”,
“brand_id”: “brand_a”,
“user_id”: 501,
“amount”: 100,
“currency”: “EUR”,
“provider”: “provider_x”
}
As we can see, multi-brand support is a serious, important element that should be part of the domain model, not a set of if/else statements in the code. It should be designed and deployed separately at the microservice level for the best integration into the overall project architecture.
Let’s start summing up both articles. As we’ve seen, there’s no single perfect technology for a serious FinTech or iGaming project. That’s why the BeFund team recommends a hybrid architecture, where different technology stacks are used to most effectively accomplish the tasks at hand. It looks like this:
But what if you need to choose just a single stack? That’s a perfectly realistic scenario too, given differing budgets, capabilities, and circumstances. Or a less strict version of the same question: you need to pick a primary stack — which is often more realistic for a FinTech or iGaming project. BeFund’s specialists have an opinion on this as well.
Laravel + PostgreSQL/MySQL + Redis + RabbitMQ/Kafka
Here’s why:
Symfony + PostgreSQL/MySQL + Kafka + Redis + ClickHouse
Here’s why:
NestJS + PostgreSQL + Kafka + Redis + ClickHouse
But with the following requirements:
Finally, let’s briefly cover approaches that are dangerous for FinTech and iGaming projects. They exist, and they come up far more often than you might expect — mostly due to low awareness and a lack of experience running large projects. At BeFund, we know these pitfalls well, so we’re telling you upfront what you should absolutely never do:
The main risk isn’t an unsuitable technology. The most dangerous thing for a FinTech or iGaming project is a poorly designed architecture — and that’s true regardless of the technology stack.
In short:
Symfony — for money.
Laravel — for fast business development.
NestJS — for real-time, gateway, and event-driven layers.
ClickHouse — for analytics.
Kafka — for events.
Redis — for fast temporary states.
SQL database — for financial truth.
In FinTech and iGaming, there’s no universal answer among Laravel, Symfony, or NestJS.
The right answer depends on the domain.
Wallet, settlement, payments, withdrawals, and ledger need a maximally controlled, transactional, audit-friendly architecture. Symfony, or a very disciplined Laravel, fits best here.
Backoffice, CRM, partner cabinet, bonus management, and internal tools need fast business development. Laravel is often the most practical choice here.
API Gateway, BFF, WebSocket, notifications, and the event-driven integration layer fit NestJS well.
Analytics, segmentation, reporting, and fraud analysis are best moved into ClickHouse, with event exchange between services built on Kafka.
What matters most isn’t the framework itself, but the architectural principles:
Idempotency; | CQRS; | Multi-brand context; |
Ledger; | Reconciliation; | Observability; |
Transactional outbox; | Feature flags; | Contract testing; |
Audit log; | Credentials isolation; | Strict service boundaries. |