Upload Google Ads conversions

<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>

Reports conversions to Google Ads from your own server, for the conversions only your server knows about.

This is the counterpart to the browser-side gtag('event', 'conversion', ...) call. Use it for a payment that actually settled, an order confirmed after review, or anything an ad blocker would stop the browser reporting. Each conversion needs the goal it counts towards, when it happened, and the click it came from.

Read the outcome from the counts rather than from status. A partial batch still comes back as success, so compare total_uploaded with total_submitted. The difference is accounted for by duplicates_removed, cross_request_duplicates, and skipped_no_click_id, and anything left over is rows Google rejected one by one. Google does not tell Base44 which rows those were, so the response cannot name them.

Send order_id on every conversion you can. Base44 remembers each conversion it has reported and never reports the same one twice, keyed on the order or click ID together with the goal and the timestamp, and that record does not expire. Sending a corrected value for a conversion you already reported has no effect for that reason. Use Upload enhanced conversions to add buyer details to a conversion you have already reported.

<Note>There is no cap on how many rows you can send and no rate limit on this endpoint. Base44 sends them to Google in batches of 2,000, one batch after another, while your request stays open, so a very large list means a very long request. Keep each call to a few thousand rows and send several calls instead.</Note>

<Note>A 409 means the request to Google timed out after it was sent, so those conversions may or may not have landed. Retrying is safe. Base44 has already recorded them as sent, so the retry reports them under cross_request_duplicates rather than counting them twice.</Note>

<Note>This endpoint accepts a personal API key. Workspace API keys are not authorized for it and are rejected with a 403.</Note>

post/api/apps/{app_id}/google-ads/conversions/upload

Path parameters

app_idstring required

ID of the app whose Google Ads conversion tracking you want to manage.

ID of the app whose Google Ads conversion tracking you want to manage.

Request body

Example request

{
  "conversions": [
    {
      "conversion_action_id": "7654321",
      "conversion_date_time": "2026-08-25 14:05:00+00:00",
      "gclid": "Cj0KCQjw1...",
      "conversion_value": 89.9,
      "currency_code": "EUR",
      "order_id": "ORD-10482"
    }
  ]
}

Response

What happened to each conversion in the batch.

statusstring required

Whether anything reached Google. The value is success when at least one conversion landed and no_rows_uploaded when none did, so it does not tell you the whole batch landed.

total_submittedinteger required

How many conversions you sent, counted before any of the checks below.

duplicates_removedinteger required

How many conversions were dropped as duplicates of another conversion in the same request, matching on order or click ID together with the goal and the timestamp.

cross_request_duplicatesinteger required

How many conversions a previous request already reported. Base44 remembers every conversion it has sent, permanently, so a retried upload lands here instead of counting twice.

skipped_no_click_idinteger required

How many conversions were dropped before Google saw them because they carried none of gclid, gbraid, or wbraid. Google requires one of the three.

total_uploadedinteger required

How many conversions Google accepted.

Example response

{
  "status": "success",
  "total_submitted": 12,
  "duplicates_removed": 1,
  "cross_request_duplicates": 2,
  "skipped_no_click_id": 1,
  "total_uploaded": 8
}

Changes

No recorded changes to this endpoint across all 1 revision of this API.