Experience · Becall Group (Be Call Digital), since January 2025

Twelve cases, in production.

In under two years I have gone from building reports to designing, deploying and running the data systems that the reports, the operation and the clients of a BPO group depend on: more than 40 projects delivered and more than 15 automated processes in production. The cases are told without sensitive data or internal business figures.

Power BI as codeData engineeringB2B integrationsDatabase optimisationWeb automationContact centre: OCM · NextivaClaude Code

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

Progression

From reports to systems.

Each stage builds on the previous one: the lead-matching scripts of 2025 ended up feeding the Conversions API.

Jan — Aug 2025

BI and marketing analytics

More than 20 Power BI reports, the first Google and Meta Ads pipeline, secure publishing with Power BI Embedded and Entra ID, and lead reconciliation between sources.

Sep 2025 — Feb 2026

Data engineering and automation

Automation of the Repsol CRM, portal scrapers, near-real-time ETL for two telephony providers, BigQuery data products over more than 190 tables, and recontact and do-not-call flows.

Mar — Jun 2026

Data platforms

The multi-client Unified CRM, invoice reconciliation with a Laravel monitor, Meta's Conversions API, the migration of reports from Nextiva/BigQuery to OCM/MariaDB and the optimisation of the dialer server.

Jul — Nov 2026

B2B integrations and architecture

Club Internacional del Libro, the Eni Plenitude web service, Hermes Router for Ignium, Informe General Digital, attribution for ASISA, the EDP dashboard and the design of an ML lead router documented in 17 ADRs.

Clients

Five sectors, the same rigour.

On top of the internal client. In many cases the deliverable goes straight to the client: files, APIs, webhooks or shared reports.

Energy

Repsol · Eni Plenitude · EDP · Gana Energía

CRM automation, returns via web service, invoice reconciliation, after-sales WhatsApp and B2B dashboards.

Telecoms

Finetwork · Vodafone · MásMóvil · Jazztel

CRM with MFA, dialling prioritisation, the sector report and sales reconciliation.

Alarms

ADT · Verisure · Segurma

Portal automation, exclusion audiences in Google Ads, number rotation and campaign migration.

Insurance

ASISA

Attribution of policies to calls and a 15-page report generated by code.

Publishing

Club Internacional del Libro

A complete integration over SFTP and REST API, with an internal report and one for the client.

Partners and others

Ignium · LoJack · Solvo

Near-real-time return of lead outcomes, a renewals campaign and operations reports.

Next step

Which process would you like to stop doing by hand?

Tell me the problem in two lines. I'll tell you honestly whether it can be automated, how, and what it would take.