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.

Current technologies
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.
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.
Identity platform
client workFirst-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.
Video pipeline
privateTopic research, script, voice synthesis, render and scheduled publishing, end to end without intervention, with performance measured back into topic selection.
Selected work
Eight from roughly eighty brands since 2023. Client names withheld, figures rounded.
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.
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.
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.
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.
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.
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.
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.
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.