---
title: "Scan Google Ads conversion tracking"
method: GET
path: "/api/apps/{app_id}/google-ads/tracking-scan"
---

# Scan Google Ads conversion tracking

`GET /api/apps/{app_id}/google-ads/tracking-scan`

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

Cross-references the app's conversion mappings against the conversion calls in its code, and reports what does not line up.

Each entry in `gaps` names one problem. An `error` is a mapped conversion that cannot fire, and a `warning` is a setup that works but probably is not what you meant, such as a disabled mapping or code firing a goal no mapping points at. A `missing-call-` gap also carries a `composer_prompt` you can hand to [Send chat message](/api-reference/send-chat-message) to have the AI write the fix.

<Warning>Treat `error` gaps and `calls_count` as unverified. The scan reads the app's code from a copy that is empty for apps built in the current editor, so it reports `calls_count` as `0` and raises a `missing-call-` gap for every enabled mapping even when the call is present and working. Base44's own alerting re-checks these against the deployed app before acting on them, and this endpoint does not. Confirm a `missing-call-` gap against the app's real code before changing anything, and do not read `calls_count` as evidence that no conversions fire.</Warning>

<Warning>`is_clean` is `true` when nothing was scanned, so read `skipped_reason` first. An app with no Google Ads account comes back with `is_clean` set to `true`, no `gaps`, and `skipped_reason` set to `no_google_ads_account`, which is not a clean bill of health. That response also omits `enabled_mappings_count`.</Warning>

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

<Warning>The response includes fields beyond the ones documented here. Don't rely on undocumented response fields, as they can change at any time.</Warning>

## Path parameters

- `app_id` string, required — ID of the app whose Google Ads conversion tracking you want to manage.

## Response `200`

What the scan found.

- TrackingScanResult — What the conversion-tracking scan found.
  - `gaps` TrackingGap[], required — Everything the scan flagged. Empty when it found nothing and when it did not run, which `skipped_reason` tells apart.
    - `id` string, required — Identifier for this gap within the scan. A gap whose ID starts with `missing-call-` is a mapped goal with no firing code, `no-action-` is a mapping with no matching goal in Google Ads, `disabled-` is a disabled mapping, and `orphan-call-` is code firing a conversion no mapping points at.
    - `severity` string, required — How serious the gap is. `error` means a mapped conversion cannot fire, and `warning` means the setup works but something is configured in a way you probably did not intend.
    - `message` string, required — What is wrong, written for an engineer. It names the `send_to` and the call shape where those apply.
    - `suggested_files` string[], required — Up to three files in the app that look like the place to add or fix the call. Empty when the scan has no suggestion.
    - `composer_prompt` string, required — An instruction you can send to [Send chat message](/api-reference/send-chat-message) to have the AI fix this gap. Only a `missing-call-` gap carries one; it is an empty string on every other kind.
    - `mapping_id` string, nullable — The conversion mapping this gap is about. Absent on an `orphan-call-` gap, which is about code rather than a mapping.
    - `conversion_type` string, nullable — Conversion category the mapping names, such as `PURCHASE`. Absent on an `orphan-call-` gap.
    - `entity_name` string, nullable — App entity the mapping is tied to. Absent on a `disabled-` or `orphan-call-` gap, and empty on a mapping with no entity.
    - `trigger_action` string, nullable — Which write on the entity the mapping covers. Absent on a `disabled-` or `orphan-call-` gap.
    - `send_to` string, nullable — The gtag `send_to` value the code should fire. Present only on a `missing-call-` gap, which is the only kind that has resolved one.
    - `display_message` string, nullable — The same problem in plain language, safe to show someone. Present only on a `missing-call-` gap.
  - `mappings_count` integer, required — How many conversion mappings the account has, enabled or not.
  - `calls_count` integer, required — How many gtag conversion calls the scan found in the app's code. See the warning on this operation before reading it as zero.
  - `is_clean` boolean, required — Whether the scan flagged no error-severity gap (`true`) or at least one (`false`). It also reads `true` when the scan did not run at all, so check `skipped_reason` first.
  - `enabled_mappings_count` integer, nullable — How many of the mappings are enabled. Absent when `skipped_reason` is set.
  - `skipped_reason` string, nullable — Why nothing was scanned. The value is `no_google_ads_account` when the app has no active Google Ads account, or `app_not_found`. The field is absent whenever a scan ran.

## Other responses

- `401` — Missing or invalid credentials.
- `403` — You don't have access to this app, the app does not exist, or you used a workspace API key. A missing app and an app you cannot reach are deliberately the same answer.

## Changes

- **2026-09-02** `6ad855bf424f` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/adexad/apis/base44-app-management-api/changes/api/apps/:app_id/google-ads/tracking-scan/get.md)

---

[API](https://skmtc.dev/adexad/apis/base44-app-management-api.md) · [All operations](https://skmtc.dev/adexad/apis/base44-app-management-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/adexad/base44-app-management-api/revisions/6ad855bf424f/schema)
