Specific bottleneck?
Let us talk for 30 minutes about your use case.
No obligation, no cost, with concrete next steps at the end.
Book a 30-minute callYacht crews, port guests, and berth tenants at the port of Monaco book their WiFi access directly in the browser, pay by card via Ingenico β and receive credentials plus a PDF invoice by email, all in minutes and without a concierge desk.
THE STARTING POINT
Yachts of various sizes lie at the port of Monaco year-round. With seasonality β from Grand Prix weekend to summer peak β WiFi demand swings between "quiet" and "massive". What shouldn't swing: the guest experience. Anyone wanting to buy a WiFi ticket wants to do it in the browser. Not at the harbour master's desk. Not tomorrow morning. Now, in their own language.
Before this, allocation was manual. Which didn't scale β especially during seasonal peaks, when the harbour master's desk has plenty to do anyway. It also didn't produce clean self-service data for accounting, tax, and customer-specific repeat purchases.
A standard captive portal solution with "free WiFi" isn't an option here β port WiFi is a paid service, with tariff tiers and VAT obligations.
WHAT WE BUILT
An end-to-end solution from tariff selection in the browser through to provisioning in the Ucopia WiFi controller, supported by a Java Spring Boot API, a React frontend, and consistently GDPR-aware data handling.
/api/v1/sepm/confirm. In one orchestrated step:mt-packages.ymlThe API exposes three public endpoints (packages, checkout, confirm) plus internal endpoints for status monitoring and customer management β including a deleteexpired endpoint typically called by a cron job daily.
Ucopia knows three ways of giving an account identity new validity β we covered all three, because different port contexts have different requirements:
| Refill mode | How | Strengths | Weaknesses |
|---|---|---|---|
| profile | Validity via profile | simple | not very flexible, not cumulative |
| account | Set directly on creation | flexible, simple | not cumulative |
| voucher | Validity via voucher | natively cumulative | voucher packages must be maintained |
Default mode is account β fits most port scenarios (easy to maintain, sufficiently flexible). voucher is recommended for scenarios where guests want to buy more during an active validity period (cumulative).
MariaDB holds customer data only as long as it's actually needed β and the operator decides per lifecycle phase how the data is handled. Three configurable strategies are available:
The choice sits with the SEPM operator, not in the code. A configuration entry, not a migration script.
The API's mt-settings.yml controls behaviour at a level of detail that's the difference between "works in the standard case" and "works in edge cases too":
mt-packages.yml, with profile or voucher mappingBackend and frontend are packaged separately in Docker and orchestrated via Kubernetes / OpenShift. The seasonality argument isn't academic here: during Grand Prix weeks or summer peaks, the API pods scale elastically β outside the season, the system runs on a minimal footprint. No hardware investment for the peak, no idle hardware in the off-season.
WHAT IT GIVES THEM
WHAT WE DELIBERATELY DID NOT AUTOMATE
mt-packages.yml, maintained by the operator.WHY THIS PATTERN TRANSFERS
The setup works wherever public WiFi is offered as a paid service element and the captive portal operator needs a self-service solution with real depth in payment, accounting, and compliance β marinas, ports, airports, trade fairs, festivals, co-working spaces, hospitality chains, stadiums, tourist hubs, bus and train stations.
The pattern: branded captive portal with multilingual support β tariff and voucher logic β payment integration via Ingenico (or Saferpay / Stripe / similar) β connection to a Ucopia controller via the Deleg API β MariaDB as a minimal data holder under GDPR configuration β container deployment via K8s with elastic seasonal scaling.
The SEPM solution has been in production since 2021. The pattern has since been reused multiple times in variations β different payment providers, different languages, different port and transport contexts.
Talk to us
Specific bottleneck?
No obligation, no cost, with concrete next steps at the end.
Book a 30-minute callYour own AI platform?
Demo with your own data is possible. We bring the pseudonymisation set up and ready.
Request a demo