← Back to work▍ Padel Club: Bar Sales & Accounting

R2 Pádel

A padel club's bar till, connected to an analytics app and to Holded, built on the backup the till already made every day.

R2 Pádel, Padel Club: Bar Sales & Accounting
R2 Pádel, Padel Club: Bar Sales & Accounting

[01] The Challenge

R2 Pádel's bar runs on Ágora, a hospitality POS, in its Lite edition: no integration module, no API, no export beyond what the till prints. Four and a half years of sales lived in a SQL Server database on one touchscreen PC behind the bar. The club wanted to see what sells, when and at what price, and the day's sales had to reach Holded, its accounting software, without anyone typing them in again.

R2 Pádel, Padel Club: Bar Sales & Accounting
Full page · r2 pádel

[02] The Approach

Rather than pay for Ágora's integration module or run code against the live till, AEMEDIA used something the POS already does every day: its own backup. A small scheduled agent on the till sends each new backup to our server over HTTPS, in resumable 2 MB chunks, so the bar's connection can drop mid-upload without losing the day. On the server, a worker restores it on SQL Server Express, runs a set of checks (totals against lines, payments against totals) and loads a clean sales history into PostgreSQL. Nothing is ever deleted, so a reset till can't take the past with it.

R2 Pádel, Padel Club: Bar Sales & Accounting
▍ Stack
  • Python
  • FastAPI
  • PostgreSQL
  • SQL Server Express
  • React
  • Holded API
  • Docker
▍ Capabilities

System Integration · Data Pipelines · Analytics App · Accounting Sync · Monitoring

Mobile · r2 pádel

[03] The Solution

On top of that history sits a private, bilingual analytics app (Spanish and English): sales over time against any earlier period, the busiest hours of each weekday, what sells by family and product, card against cash, and a price history that shows what happened to sales after each price change. Every view exports to Excel. From the same data, each closed day becomes one sales receipt in Holded, with a line per product and the day's card and cash payments. Holded rounds VAT line by line and Ágora ticket by ticket, so the sync spreads a few cents across lines until both agree; tested against the full history, every day matches the till to the cent.

R2 Pádel system diagram: the bar's Ágora POS sends its daily backup over HTTPS in chunks to a FastAPI service; a worker restores it on SQL Server Express, checks it and loads PostgreSQL; FastAPI serves the analytics app from PostgreSQL, and the worker posts one sales receipt per day to Holded.▍ r2 pádel · system[02] integrationsbar → server · HTTPS · device token · sha256.bakzchunksJSONjobsSQLcorerestore1 receipt / dayÁgora TPVbar POS · daily backupFastAPIingest · sessions · APIReact appanalytics · ES / ENWorkerETL · checks · alertsPostgreSQLsales historySQL ServerExpress · restore onlyHoldedaccounting
System

[04] Outcome

The analytics app has been in production since October 2026, fed every day by the till's own backup, with monitoring and email alerts if a backup doesn't arrive or a check fails. The Holded sync is built and running against a test company, waiting for the accountant's sign-off before it posts to the real books.

▍ Next projectChic DentalDental Clinic · South of SpainA conversion-focused clinic site, built to turn local search into booked appointments.→
Chic Dental, Dental Clinic

Send us the problem, not a brief.

Three lines are enough: what's broken or missing, what you use today, and when you need it by. One of the two of us replies. There's no form pipeline.

hello@aemedia.es ↗