I build and run data systems.

Pipelines, warehouses, internal applications and the infrastructure under them, for e-commerce, media and manufacturing. Most of my work is not shipping a setup. It is working out why the numbers are wrong while every report says they are fine. Six markets: SK, CZ, HU, RO, AT, DE.

Profit ROAS after rebuilding a bidding signal4.23x
Tracked users through one pipeline, monthly75k
Brands since 2023, Prague and remote~80
Karol Bolgár

Current technologies

BigQueryWarehouse
dbtTransformations
AirbyteIngestion
Cloud RunServerless
GA4Analytics
server-side GTMFirst-party tagging
Google Ads APIBidding data
Meta CAPIServer events
Cloudflare WorkersEdge compute
SupabasePostgres backend
PythonPipelines
TypeScriptApplications
SQLModelling
DockerContainers
.NETInternal tools
ReactFront end
TerraformInfrastructure
Looker StudioReporting

What I do

Warehouse
and pipelines

BigQuery, dbt, Airbyte, Cloud Run, scheduled jobs and alerts when something breaks. Connectors into S3, Google Ads API, Meta, Microsoft Ads, product feeds and CRMs, including connector migrations through breaking changes.

Applications
for operations

Internal tools people use every day. .NET and React, SQL Server behind stored procedures, containers on Cloud Run. Auditable edits, permission tiers, GDPR handling, multiple environments and languages, and vendor abstractions so a different supplier is a config change rather than a rewrite.

Measurement

Server-side tracking on your own domain, resistant to blockers and Safari ITP. First-party identity and attribution. Consent handled so remarketing still works and nothing leaves without permission. And reconciliation against invoicing, so the numbers can be checked.

Margin as the
bidding signal

Ad platforms optimise for the value you send them. Sending revenue buys volume without regard to profit. I send margin per order, derived from the feed or calculated when the feed does not carry it.

Infrastructure

Servers, Docker, systemd, Cloudflare Workers, Supabase, VPC networking. Heartbeats, backups, credential rotation, monitoring. A data platform without this degrades within months.

Built

TrackGap

trackgap.nulllogic.eu ↗

My own product. A Shopify app that reconciles orders against GA4 and splits the gap by cause: real tracking failure, declined consent, or a wrong value. Eligible conversions go back to GA4 with their original source, and a daily check catches the break the day it happens.

Shopify app · Node · GA4 Measurement Protocol

BagClaim

bagclaim.eu ↗

Also mine. A baggage-compensation claim builder, documents are processed in the browser, payment through Paddle, the PDF is released only after the transaction verifies. Five languages.

Cloudflare Workers · TypeScript · Paddle

Identity platform

client work

First-party identity and attribution. A consent-gated anchor that survives Safari ITP, same-origin ingestion, cross-session first-touch attribution and a daily export into the warehouse.

Cloudflare Workers · Supabase · BigQuery

Video pipeline

private

Topic research, script, voice synthesis, render and scheduled publishing, end to end without intervention, with performance measured back into topic selection.

Python · ffmpeg · YouTube API

Selected work

Eight from roughly eighty brands since 2023. Client names withheld, figures rounded.

Event pipeline for an international SaaS, three years running

Poker training SaaS. Subscriptions sold worldwide, but the ad platforms could not see what a customer was worth, so bidding ran blind on sign-ups instead of revenue.

How it was done

I implemented a customer data platform as the central event pipeline and wired it into the Google Ads Conversions API with enhanced conversions: server-side purchase events carrying order id, revenue and subscription tier, with hashed identifiers for match rate. Later a BigQuery layer for checkout events and attribution. Roughly 75,000 tracked users a month, in production since 2023 and still running.

Bidding on gross profit instead of revenue, profit ROAS 4.23

E-commerce, Czech and Slovak markets. Platforms optimise for whatever value you send them, so a discounted order and a full-price one looked identical to the algorithm.

How it was done

I fed item-level cost of goods from the product feed into the platform so bidding optimises on gross profit directly. That meant auditing how the margin was calculated before trusting it, building the supplemental feed for both markets, and fixing a rate limit on the client API that was silently rewriting conversion values. First fourteen days after launch: 2,737 EUR spend, 11,593 EUR gross profit, profit ROAS 4.23.

Margin silently replaced by a constant for weeks

Watch retailer. Bot protection on the margin API started answering with HTTP 200 and an HTML challenge page, so every order was priced at the same fallback margin while bidding ran on those numbers.

How it was done

Found by validating response bodies rather than status codes. A 200 with the wrong body is invisible to every monitor that watches status alone. The same class of failure turned up at a second client three weeks later, which is why I now check payloads by default.

Server-side tracking that I proved had not worked

Watches and jewellery, six markets. Tracking was live and everyone assumed the share of orders reaching analytics had gone up.

How it was done

I pulled orders from the shop database and from analytics and compared a full month before against a full month after. The share had not risen, it had fallen. Reconciling against the source system rather than against a second measurement is the only way that result surfaces, and reporting it was worth more to the client than defending the deployment.

Warehouse data used to settle whether the tracking was worth paying for

Furniture retailer. The team believed server-side tracking had changed nothing and that they were paying for a setup with no return.

How it was done

The argument was being had in screenshots, so I brought warehouse figures into their own comparison sheet, reconciled the discrepancies and explained in plain terms how that data feeds back into analytics to improve accuracy. The deliverable was not a tag, it was a client who could see what they were paying for.

Consent Mode across separate domains, verified by script

Scooter retailer and a print e-shop. Ads and analytics disagreed on conversions by a wide margin, and consent bugs look identical to tracking bugs from the outside.

How it was done

A control script reported the state of each consent signal instead of leaving it to inspection of the Tag Manager screen, which showed which signals never reached granted. The fix went across multiple domains under one container. Consent is where most measurement breaks now, and it breaks silently.

CRM that stops creating the same lead twice

Marketing agency, internal CRM. Leads arrived from several sources into a system that created a new record every time, so the pipeline counted the same company repeatedly.

How it was done

I automated the whole chain: leads from the web into the system, the responsible person assigned automatically, a duplicate check that runs before a record is created rather than after, email history attached to the client, calendar integration and reporting into the BI tool. Thirty-one shipped tasks over the project.

Shop migration without losing the measurement

Scooter retailer. The shop moved platform over a single weekend, and migration is where measurement usually dies quietly.

How it was done

Ads paused ahead of the switch, analytics rebuilt on the new platform, and the data reconciled so the series before and after line up rather than showing a cliff. The gap is normally found months later when somebody questions a report.

Numbers that do not add up?

Send me a message and I will tell you where I would look first.