Google files a conversion on the date you tell it, in its own format. A retry that sends the current time moves your bookings onto the day of the outage. The week then reads wrong for good.
An offline click conversion carries the time of the conversion, the field conversionDateTime. Google attributes the conversion to the
click and reports it on the date and time that field states. Not the date it received the upload.
The format is yyyy-mm-dd hh:mm:ss+|-hh:mm, with the offset written out. Google refuses a string in ISO 8601 form, with a T between date and time or a Z for UTC. The refusal arrives
as a partial failure inside a 200, which is its own
note.
Google Ads API, upload click conversions.
Two things, and they compound.
The retry sends the time of the send. The live upload happens inside the request that confirmed the appointment. The event and the send are the same instant, so "now" is correct by accident. A retry runs later.
Say a booking confirms on Tuesday evening. A token endpoint has a bad minute and the live upload never lands. The retry goes out on Wednesday morning with Wednesday's time. Google files it on Wednesday. Every cost-per-booking number that reads a date is now off by the length of the outage. Tuesday looks worse than it was. Wednesday looks better.
The offset is whatever the machine had. Format a wall-clock time in one timezone and label it with another, or with the offset of whichever server ran the code. The string now states a different instant, off by the gap between the two zones. Google reads the offset as given. A booking at 11:30 in the evening is close enough to midnight for that gap to put it on the next day.
Both hide on the live path, where the event and the send are the same instant. The question that finds them is simple: what would a resend six hours late say?
+00:00. One constant offset. No client's
timezone and no server's locale can move a conversion across midnight. Google converts for reporting.T with a space. Cut at the
seconds. Append the offset. Do not hand a library's default output to the API and hope.event_time, is seconds since the epoch and
must be the time of the action. It accepts up to seven days back. One principle: a resend states when the thing
happened, never when the resend happened.Take a booking from three days ago that your record says went up. Find it in the conversion report by
date. If it sits on the day of an outage rather than the day of the booking, your retry is stamping the send.
Then upload one conversion with a T in the time and read the body of the 200 you get back.