What broke · Google Ads API · 7 September 2026

The failure that looks like success.

Google can answer OK and still refuse your row inside the reply. Read only the status and you record conversions that never landed, and nothing ever retries them.

By Lovro Lucic · Published 7 September 2026

What Google does

The Google Ads API takes a list of operations in one request. Set the partial failure switch, partialFailure, to true and a request with some good rows and some bad ones does not fail whole. Google applies the good rows. The request returns HTTP 200. It describes the bad rows in a partialFailureError field in the body, each error pointing at the row it refused. Google Ads API, partial failures.

Leave the flag off and one bad row fails the whole request with an error status. The good rows in it are lost with it.

So the two honest outcomes of an upload are not "200" and "not 200". Either the response has a result for your row and no partial failure error, or it does not.

What breaks

The quick version of a sender does what every quick integration does. Post the conversion. Check the status flag, response.ok. On true, record the conversion as sent so nothing sends it again. Most tracking code works that way, and it is the right way to read Meta, which answers a bad row with an error status.

Google does not. Under the quick rule, a row with a malformed conversion time, a click id in the wrong field, or a conversion action from another account comes back 200 with the error in the body. Your record writes it as a signal the platform holds. The retry sweep resends only what the record calls unsent, so it never touches that row. The account never receives it. Your report says it did.

This is the one failure where the record itself lies, and every other number rests on the record. Nothing in a dashboard will show it. The only place it shows is the body of a reply the sender threw away.

The rule

How to check it yourself

Upload one conversion with a conversion time in the wrong format, with partialFailure on. Watch the status code. It will be 200. Then read the body. If your sender would have called that a success, every malformed row you have ever uploaded is a conversion your record claims and your account never saw.

What this does not cover