LP Agency

How we built a partner platform for the European market from scratch

and we have implemented our own formula for calculating commissions.

About the project

Type:
partner platform, web application
Sphere:
tourism, travel-tech
Geography:
Spain (Europe)
Format:
development from scratch
Term:
4 months
Stack:
Laravel 12, Livewire 3, Tailwind, PowerGrid, Chart.js
Customer:
RentaHoliday

Context

Prior to the launch of the partner platform, RentaHoliday did not have an affiliate accounting system at all.

Did not have:

  • partner account
  • widget generation mechanism
  • transparent statistics
  • automated commission calculation system
  • partner network scaling tool

At the same time, the business wanted:

  • enter the European market
  • scale up partner connections
  • minimize calculation errors
  • eliminate data loss
  • make the system transparent for partners

Pain

Key risks before launch:

  • inability to track orders correctly
  • errors in commission calculations
  • loss of click-through and booking statistics
  • lack of trust from partners
  • lack of scalability

The growth of the partner network is impossible without the system affiliate engine.

The purpose of the project

Create a full-fledged SaaS Affiliate product that:

  • allows partners to register themselves
  • generate widgets for websites
  • track clicks, redirects, and orders
  • see confirmed commissions
  • receive payments when the threshold is reached
  • supports multilingualism
  • scaled to the European market

Renta LK1

It was / Become

It was:

  • There was no partner system
  • calculations were potentially done manually
  • statistics were not systematically recorded
  • there was no tool to connect new partners

Become:

  • full-fledged affiliate dashboard
  • widget system with unique UUIDs
  • centralized statistics model
  • automated commission calculation
  • real-time data updates
  • admin panel for payment management
  • production-a product with real payouts

Architectural solution

We designed the system as a SaaS product, not an «internal cabinet».

Architecture:

  • Laravel 12 (PHP 8.2+)
  • Livewire 3
  • Tailwind 4
  • PowerGrid
  • js
  • Spatie Permission

The key model of the system is WidgetStatistic.

The central essence:

  • widget_uuid
  • partner_uuid
  • event type (click / redirect / order)
  • order details
  • status: pending / confirmed / cancelled / completed / paid

This allowed us to build a flexible statistical model without duplicating logic.

Key decisions

Widget generation. Partner:

  • gets a unique UUID
  • creates a widget (hotels / carsharing / transfer)
  • adjusts style, language, adaptability
  • gets the JS code for embedding

Each widget is tracked separately.

Cookie-based tracking (180 days):

  • prefix rah_
  • saving partner_uuid
  • correct attribution of orders

This ensured transparency and stability of tracking.

Custom payout formula. Different types of products — different formulas:

  • hotels: ((booking_amount — booking_netto) / VAT) / 2
  • carsharing: (booking_amount / VAT) / 2
  • Default VAT is 1.21

The hardest part was:

  • correct separation of gross and net profit
  • accounting for statuses
  • order transition from pending to confirmed
  • protection against double payments

Real-time statistics via Livewire:

  • charts are updated without restarting
  • the partner sees the dynamics by widget types
  • The admin keeps track of payouts

Admin Panel:

  • payment management
  • partner tables
  • order confirmation
  • the paid mark
  • export to Excel
  • News management and FAQ
  • multilingual translations

Multilingualism. Support for 6 languages:

  • EN
  • RU
  • ES
  • FR
  • DE
  • PL

Implemented via middleware + JSON files + translation models.

This allowed us to enter the European market without additional development.

Renta LK4

The complexities of the project

The hardest part:

  • architecture of statistics
  • calculation of commission formulas
  • synchronization of order statuses
  • API security balance (CSRF disabled for save endpoint, but data validation)

The data flow had to be continuous:

Widget → click → redirect → cookie → order → pending → confirmed → payout → paid

Any mistake is a direct financial loss.

Why did it work?

We didn’t make a «cabinet». We were building:

  • a sustainable architecture
  • a centralized statistics model
  • a flexible payment system
  • a scalable product

This is not a landing page. This is a financial instrument that directly affects the income of partners.

Results

After the launch:

  • accelerated connection of new partners
  • reduced the number of errors in calculations
  • the loss of statistics is excluded
  • automated payment process
  • A scalable SaaS affiliate has been created

The main thing is that the business has received a system that it can rely on when scaling in Europe.