---
title: "Get Google Ads campaign conversion breakdown"
method: GET
path: "/api/apps/{app_id}/google-ads/campaigns/{campaign_id}/impact"
---

# Get Google Ads campaign conversion breakdown

`GET /api/apps/{app_id}/google-ads/campaigns/{campaign_id}/impact`

## Request

- Base URL: `https://app.base44.com`
- URL: `https://app.base44.com/api/apps/{app_id}/google-ads/campaigns/{campaign_id}/impact`
- Auth: HTTP bearer

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

Breaks one campaign's conversions down by goal, by the Google surface they came through, and by where the people who converted were, for a date window.

Base44 reads all three live from Google Ads as separate reads, and each one can fail on its own. A failed read still returns a 200: its `*_unavailable` flag is `true` and its lists are empty, so show that section as unavailable rather than as zero conversions.

- **Goals.** `goals` totals conversions and conversion value for the `sales`, `leads`, `shopping` and `other` families, and `goal_actions` lists the conversion categories behind them. A category whose conversions round to zero is left out of `goal_actions` but still counts in `goals`, so a total can differ slightly from the sum of its rows. `BEGIN_CHECKOUT` and `ADD_TO_CART` count as `shopping`, not `sales`, and can carry a value, so don't add `shopping` to a sales total as revenue.
- **Channels.** `channels` ranks conversions by ad network. Conversions Google reports with no resolved network, which includes every Performance Max date before 1 June 2025, are summed into `channels_unresolved` instead.
- **Locations.** `countries` and `locations` rank conversions by where people were, not by what they searched for. Conversions Base44 can't name a place for are summed into `countries_unresolved` and `locations_unresolved`.

The ranked lists leave out entries that round to zero. `goals_configured` names the goal families the app reports conversions for, so you can hide one it never tracks.

`start_date` and `end_date` are inclusive, must both be `YYYY-MM-DD`, and are read in the Google Ads account's time zone. Anything else is rejected with a 400. Keep `start_date` on or before `end_date`. The campaign has to have reached Google Ads, so one with no `google_campaign_id` yet returns a 404.

This is limited to 30 requests a minute per app. Some workspaces have a different limit.

<Note>This endpoint accepts a personal API key from anyone who can view the app, including a read-only key. Workspace API keys are not authorized for it and are rejected with a 403.</Note>

## Path parameters

- `app_id` string, required: ID of the app whose Google Ads reporting you want to read.
- `campaign_id` string, required: Base44's ID for the campaign, as returned in `id` by [List campaigns](/api-reference/list-google-ads-campaigns). This is not the Google Ads campaign ID, which is reported separately as `google_campaign_id`.

## Query parameters

- `start_date` string, required: First day of the window, as `YYYY-MM-DD`.
- `end_date` string, required: Last day of the window, inclusive, as `YYYY-MM-DD`.

## Response `200`

The campaign's conversions by goal, channel and location.

- GoogleAdsCampaignImpact: One campaign's conversions, broken down by goal, channel and location.
  - `goals` object, required: Totals per goal family, keyed by `sales`, `leads`, `shopping` and `other`. Empty when `goals_unavailable` is `true`.
  - `goal_actions` GoogleAdsImpactGoalAction[]: The conversion categories behind `goals`, most conversions first. Categories that round to zero conversions are left out here but still count in `goals`. Absent when `goals_unavailable` is `true`.
    - `category` string, required: Google's conversion category, passed through as Google reports it, for example `PURCHASE`, `SUBMIT_LEAD_FORM` or `BEGIN_CHECKOUT`.
    - `family` string, required: The goal family the category counts toward in `goals`: `sales`, `leads`, `shopping` or `other`.
    - `conversions` number, required: Conversions in this category, rounded to two decimals. Can be negative when Google retracted conversions.
    - `conversions_value` number, required: Total value of those conversions in the account's currency, rounded to two decimals.
  - `goals_unavailable` boolean, required: `true` when the goal read failed, so `goals` is empty because the numbers are missing, not zero.
  - `channels` GoogleAdsImpactChannel[], required: Conversions per ad network, most first. Empty when `channels_unavailable` is `true`.
    - `channel` string, required: Google's ad network, passed through as Google reports it, for example `SEARCH`, `YOUTUBE` or `CONTENT`.
    - `conversions` number, required: Conversions through this network, rounded to two decimals.
  - `channels_unresolved` number: Conversions Google reported with no resolved network, which includes every Performance Max conversion before 1 June 2025. Absent when `channels_unavailable` is `true`.
  - `channels_unavailable` boolean, required: `true` when the channel read failed, so `channels` is empty because the numbers are missing, not zero.
  - `countries` GoogleAdsImpactCountry[], required: Conversions per country the people who converted were in, most first. Empty when `locations_unavailable` is `true`.
    - `code` string, required: ISO 3166-1 alpha-2 code of the country.
    - `conversions` number, required: Conversions from people in this country, rounded to two decimals.
  - `locations` GoogleAdsImpactLocation[], required: Conversions per city, or the most specific place Google resolved, most first. Empty when `locations_unavailable` is `true`.
    - `name` string, required: Name of the city, or of the most specific place Google resolved when it has no city. Names that would be ambiguous carry their region or country.
    - `conversions` number, required: Conversions from people in this place, rounded to two decimals.
  - `countries_unresolved` number: Conversions Base44 could not name a country for, so they are missing from `countries`. Absent when `locations_unavailable` is `true`.
  - `locations_unresolved` number: Conversions Base44 could not name a place for, so they are missing from `locations`. Absent when `locations_unavailable` is `true`.
  - `locations_unavailable` boolean, required: `true` when the location read failed, so `countries` and `locations` are empty because the numbers are missing, not zero.
  - `goals_configured` string[], required: The goal families, `sales` and `leads`, that the app has an enabled conversion mapping for. Empty when Base44 can't tell, in which case treat both as possible.

## Other responses

- `400`: `start_date` or `end_date` is not a valid `YYYY-MM-DD` date.
- `401`: Missing or invalid credentials.
- `403`: You can't view 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.
- `404`: The app has no connected Google Ads account, there is no campaign with this ID, or the campaign has not reached Google Ads yet.
- `422`: Validation Error
- `429`: The app has used up its 30 breakdowns for the current minute. Retry later.

## Changes

- **2026-10-11** `80287813ab84`: 1 info
  - the endpoint scheme security `PersonalAccessTokenAuth` was added to the API
- **2026-10-10** `fc604cdcc3a2`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/idealspot/apis/base44-app-management-api/changes/api/apps/:app_id/google-ads/campaigns/:campaign_id/impact/get.md)

---

[API](https://skmtc.dev/idealspot/apis/base44-app-management-api.md) - [All operations](https://skmtc.dev/idealspot/apis/base44-app-management-api/llms.txt) - [OpenAPI document](https://skmtc.dev/idealspot/apis/base44-app-management-api/revisions/b5b4ebd82a1e?raw)
