Skip to content

Lead generation with a call centreClient work

Silent Zeros: When a Reporting Pipeline Says Success and Delivers Nothing

I built a lead-gen reporting cockpit, repaired a silent n8n failure, and separately built scheduled Google Ads imports from call-tracking data.

The brief

Context

A US lead-generation business with a call centre needed to compare ad spend with calls, form leads and revenue. I built a Sheets cockpit with hourly, month-to-date and weekly views, plus account, campaign and keyword selectors.

I also worked on its offline conversion imports into Google Ads. That was a separate engagement. A successful ad-platform import does not prove that a reporting dashboard is fresh, and a working dashboard does not prove that Google accepted a conversion.

Sounds familiar?

Symptoms: the reporting cockpit

The situation Lead generation with a call centre
Tick what applies to you

The cockpit had passed 25 of 25 validation checks in May. Those checks verified the workbook against its sources at that time. They did not catch the later failure to deliver fresh rows.

Tick the lines that describe your case.

Describe my task

The investigation

Diagnosis: the reporting cockpit

I traced the flow from the source API responses through the n8n merge and into the sheet writes. An empty conversions branch made the merge emit no items. The downstream writes never ran, but the workflow still ended in success.

  1. There was a second problem inside Sheets. Static staging copies could go stale, and copying date values introduced a time component. Report formulas used exact-date equality, so a date with a time attached no longer matched the report’s clean date.

Handover

What I built: the reporting cockpit

Delivery noteDelivered May 2026

I repaired the merge so an empty input would not discard the other branch. On the verified scheduled run, the hourly reporting source received 96 rows instead of none.

I then wrote the fault-tolerant redesign: live staging imports, canonical text join keys, labelled import errors, freshness checks and a pipeline heartbeat that counts rows written. That architecture makes an empty run visible instead of presenting it as a plausible business zero. The evidence for this case establishes the merge repair and the redesign documents; it does not establish that every part of the redesign was deployed.

The conversions branch still returned no rows on the repair run. Restoring the reporting flow did not create missing source data or close that separate investigation.

The brief

Context: the separate Google Ads import engagement

The other scope was to send qualified form leads and inbound calls from WhatConverts into Google Ads. I consolidated the upload paths around the WhatConverts API, with Apps Script rewriting the upload sheets and Google Ads reading them through scheduled imports.

These were scheduled imports from Sheets. They were not a direct Google Ads API upload implementation.

Handover

What I built: the separate Google Ads imports

Delivery noteDelivered May 2026

I replaced the rejected phone-number matching route with click-based imports for inbound calls that carried a valid GCLID. I kept forms and calls in separate upload files, retained the lead-quality value tiers, and left the source API as the source of truth. The reporting sheet became a cache and audit copy.

The handover included the refresh schedule and the manual authorisation step needed to install its daily trigger. I documented which old upload routes should stay disabled.

Before → after

Results

Client work Done for real clients. Client details are anonymised.

  • Reporting cockpit validation, before the later outage

    May 2026

    25/25

    Before
    Historical workbook validation
    After
    25 of 25 checks OK
  • Rows written to the hourly reporting source on the verified repair run

    Jul 2026-17

    0 to 96

    Before
    0
    After
    96
  • Separate form-lead import summary in Google Ads

    May 2026-08

    Before
    Import paths needed consolidation
    After
    58 successful rows, 0 errors
The full results table
ScopeObserved resultRead on
Reporting cockpit, historical validation25 of 25 checks OK, before the later outageMay 2026
Reporting cockpit, verified merge repair0 to 96 hourly-source rows written17 July 2026
Separate Google Ads form-lead import58 successful rows, 0 errors8 May 2026

Notes on the numbers

The form-lead import summary is not a count of scheduled jobs. The separate inbound-call preview still had rows awaiting processing at handover. I do not roll those two results into an all-clear for every import.

A note from Daniilbefore you decide

What this means for a similar business

A pipeline’s success flag is only one check. I also need to know whether it delivered rows, whether the source is fresh, and whether the receiving platform accepted the intended conversions. Those are separate questions, even when the same business uses all three numbers to make decisions.

— Daniil

Daniil Maximkin

Hi, I’m Daniil.

I work with you from defining the problem to implementation and handover. You talk to the person who does the work. I work in English and Russian.

Have a similar task?

Describe your task

The first answer is free, within one working day. Or write directly: next@taskfordaniel.com