01 · Internal client · OCM dialling platform
>90 s → 10 sCritical view · refreshes up to 7 times faster
Optimising the dialer's database server
- Challenge
- The server behind 19 campaigns hit 100% CPU on every Power BI refresh, and agents' forms froze for around 50 s.
- Solution
- Analysis of some 200,000 slow queries and three root causes fixed: a non-sargable JOIN, a UNION that materialised on disk and a polling event replaced by 32 triggers. A view generator that only publishes when the checksum matches.
- Result
- Key views from 8–15 s to under 1.5 s, 1.38 million pointless statements a day removed and no more freezes, with a runbook and a rollback plan.
MariaDB 11Slow logEXPLAINTriggersPython
02 · Internal client · Management and operations
5+ → 1Reports merged into one model
Informe General Digital: configuration-driven reporting
- Challenge
- Five or more near-identical Power BI reports (energy, telecoms, alarms, assisted sales, renewals), each with its own logic. Adding a project meant republishing.
- Solution
- Rules held in database tables and a single model of 45 tables, 187 measures and 36 relationships, with dynamic RLS, incremental refresh and 49 build and validation scripts.
- Result
- Onboarding a project is adding a row. A 99–100% link between calls, leads and sales, and governed access for external partners.
Power BIPBIP / TMDLRLSMariaDBSharePoint
03 · Repsol, Plenitude, ADT, Verisure, Finetwork, Vodafone and others
−54%Rows read per day on the database
Unified CRM: a multi-client source of truth for sales
- Challenge
- The sales table lived as Power Query logic spread across several reports: slow, not reusable and dependent on the BI layer.
- Solution
- A Python package of some 5,900 lines holding the rules of around 11 clients in 3 sectors: hashed business key, watermark with overlap, reconciliation and about 120 tests.
- Result
- One source refreshed 23 times a day. Sales that never reached the CRM fell from 22% to 1%, and some 1,200 lines of M were removed.
PythonMariaDBBigQuerypytestcron
04 · Club Internacional del Libro
511 tests43 of 43 records accepted on the first delivery
Complete integration: SFTP, REST API and Power BI
- Challenge
- The client needed the outcome of every lead and the closed orders, in their own file formats and under their API contract.
- Solution
- A daily SFTP ETL with automatic recovery, an API module running a cycle every minute with an audit queue, a local simulator with fault injection and a 17-page report in internal and client versions.
- Result
- Only 5 rejections out of 4,822 movements, all with an identified cause, and 441 of 441 orders aligned across the three outputs.
PythonREST APISFTPSQLitePower BI
05 · Ignium · Lead-generation partner
~3 msWebhook response time in production
Hermes Router: a webhook with outbox and privacy by design
- Challenge
- The partner needed the outcome of each lead in near real time. The stopgap script always answered "OK", validated nothing and left personal data in an accessible log.
- Solution
- A strict PHP 8 receiver that validates against a formal contract, filters personal data through an allowlist and hands delivery to an outbox queue that retries for about 4 hours.
- Result
- 10 of 10 leads accepted in the first live test and 0 errors at launch. A data leak closed during the deployment itself.
PHP 8MySQLApacheOutboxGDPR
06 · Eni Plenitude · Energy
106 s → 0.3 sIntegration cycle, optimised
Returning call outcomes to the client's web service
- Challenge
- Every action taken on the client's leads had to go back to their web service reliably and without duplicates.
- Solution
- A Python worker that runs every 5 minutes, deduplicates by call and contract, maps agents automatically and only alerts when a failure persists.
- Result
- Thousands of outcomes returned with no duplicates, working directly with the client's technical team.
PythonWeb serviceMariaDBcron
07 · Internal client · Digital marketing
320 / 0Events sent / failures in validation
Closed-loop marketing: teaching Meta which leads convert
- Challenge
- Campaigns optimised for cost per lead, not for real customers. Ads, leads and sales were never joined up.
- Solution
- A multi-account ETL for Meta Ads and Lead Ads into a star schema, lead-to-sale matching and delivery to the Conversions API with personal data hashed with SHA-256.
- Result
- 23 pages and 92 forms synchronised in about 3 minutes, and the ad algorithm now receives the real sale.
Meta Conversions APILead AdsGoogle Ads APIPythonMySQL
08 · Eni Plenitude · Energy
93–97%Automatic reconciliation of 18 months of invoices
Plenitude CRM: extraction, reconciliation and a secure web monitor
- Challenge
- Extracting the client's web CRM for several accounts and reconciling commission self-invoices against sales every month.
- Solution
- A multi-account Playwright scraper, a reconciliation pipeline matching by contract and supply point, and a Laravel 12 monitor with roles, mandatory 2FA and AES-256-GCM encryption shared with Python.
- Result
- Automatic extraction every 25 minutes and unpaid contracts identified for claiming.
PlaywrightLaravel 12PHPpandas2FA
09 · Repsol, Finetwork, Gana Energía and ADT
30% → 90%+Reliability of the automation
Web CRM integrators with SSO, OTP, MFA and anti-bot
- Challenge
- Critical sales processes relied on daily manual downloads from client portals behind enterprise authentication.
- Solution
- Salesforce automation with the OTP read from the mailbox, MFA with number matching, passing Cloudflare Turnstile and downloads with 4 cascading strategies.
- Result
- Five manual processes turned into scheduled jobs, with sales data available every hour.
PlaywrightSeleniumSalesforcePythonMySQL
10 · Plenitude, ADT, Segurma and Verisure
17 a dayAutonomous runs
Automatic rotation of burned outbound numbers
- Challenge
- Outbound numbers get "burned" when carriers flag them as spam. Detecting and replacing them was manual.
- Solution
- A system that detects burned numbers with calibrated thresholds, finds a replacement with the same area code and applies everything in one transaction with audit and rollback.
- Result
- A manual process made autonomous, and about 5 more points of measured contact rate.
PythonMySQLsystemdOCM
11 · ASISA · Health insurance
90.6%Policies attributed to their originating call
Sales attribution and a report generated by code
- Challenge
- Knowing which source each policy comes from and what each lead costs, with no direct key between policy and call.
- Solution
- Attribution by phone and agent within a 90-day window, a BI schema recalculated every hour and a 15-page, 345-visual report generated with Python.
- Result
- Unmapped sources cut by 99% and the complete report delivered in about two weeks.
MySQLPower BITMDL / PBIRPython
12 · EDP · Energy (business segment)
4 daysA complete B2B dashboard, from data to report
EDP Business: acquisition dashboard
- Challenge
- A report and a lead-by-lead export in the client's exact template, starting from a very poor-quality database.
- Solution
- A versioned SQL layer with a star schema, dry-run deployment and a code-generated Power BI report with incremental refresh.
- Result
- Views under 0.6 s, an export matching 44 of 44 columns and 1,714 redundant dials removed.
MariaDBPower BIPythonData quality