> ## Documentation Index
> Fetch the complete documentation index at: https://docs.base44.com/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Internal links on these pages omit the .md extension. Append .md to a docs page URL, or send an Accept: text/markdown header, to get that page as markdown.

# Get Google Ads campaign conversion breakdown

> <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>



## OpenAPI

````yaml /developers/references/app-management/app-management-openapi.json get /api/apps/{app_id}/google-ads/campaigns/{campaign_id}/impact
openapi: 3.1.0
info:
  title: Base44 App Management API
  version: 1.0.0
servers:
  - url: https://app.base44.com
security:
  - PersonalAccessTokenAuth: []
paths:
  /api/apps/{app_id}/google-ads/campaigns/{campaign_id}/impact:
    get:
      summary: Get Google Ads campaign conversion breakdown
      description: >-
        <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>
      operationId: >-
        get_campaign_impact_api_apps__app_id__google_ads_campaigns__campaign_id__impact_get
      parameters:
        - name: app_id
          in: path
          required: true
          schema:
            type: string
            description: ID of the app whose Google Ads reporting you want to read.
            title: App Id
          description: ID of the app whose Google Ads reporting you want to read.
          example: 6820f3a4e7b91d003c45a1f2
        - name: campaign_id
          in: path
          required: true
          schema:
            type: string
            description: >-
              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`.
            title: Campaign Id
          description: >-
            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`.
          example: 68b1c0d4e7b91d003c45a1f2
        - name: start_date
          in: query
          required: true
          schema:
            type: string
            description: First day of the window, as `YYYY-MM-DD`.
            title: Start Date
          description: First day of the window, as `YYYY-MM-DD`.
          example: '2026-09-01'
        - name: end_date
          in: query
          required: true
          schema:
            type: string
            description: Last day of the window, inclusive, as `YYYY-MM-DD`.
            title: End Date
          description: Last day of the window, inclusive, as `YYYY-MM-DD`.
          example: '2026-09-30'
      responses:
        '200':
          description: The campaign's conversions by goal, channel and location.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GoogleAdsCampaignImpact'
        '400':
          description: '`start_date` or `end_date` is not a valid `YYYY-MM-DD` date.'
        '401':
          description: Missing or invalid credentials.
        '403':
          description: >-
            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':
          description: >-
            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':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '429':
          description: >-
            The app has used up its 30 breakdowns for the current minute. Retry
            later.
components:
  schemas:
    GoogleAdsCampaignImpact:
      properties:
        goals:
          additionalProperties:
            $ref: '#/components/schemas/GoogleAdsImpactGoalTotals'
          type: object
          title: Goals
          description: >-
            Totals per goal family, keyed by `sales`, `leads`, `shopping` and
            `other`. Empty when `goals_unavailable` is `true`.
          example:
            leads:
              conversions: 6
              conversions_value: 0
            other:
              conversions: 0
              conversions_value: 0
            sales:
              conversions: 24
              conversions_value: 1830
            shopping:
              conversions: 9
              conversions_value: 410
        goal_actions:
          items:
            $ref: '#/components/schemas/GoogleAdsImpactGoalAction'
          type: array
          title: Goal Actions
          description: >-
            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`.
          example:
            - category: PURCHASE
              conversions: 12
              conversions_value: 960
              family: sales
        goals_unavailable:
          type: boolean
          title: Goals Unavailable
          description: >-
            `true` when the goal read failed, so `goals` is empty because the
            numbers are missing, not zero.
          example: false
        channels:
          items:
            $ref: '#/components/schemas/GoogleAdsImpactChannel'
          type: array
          title: Channels
          description: >-
            Conversions per ad network, most first. Empty when
            `channels_unavailable` is `true`.
          example:
            - channel: SEARCH
              conversions: 18
        channels_unresolved:
          type: number
          title: Channels Unresolved
          description: >-
            Conversions Google reported with no resolved network, which includes
            every Performance Max conversion before 1 June 2025. Absent when
            `channels_unavailable` is `true`.
          default: 0
          example: 2
        channels_unavailable:
          type: boolean
          title: Channels Unavailable
          description: >-
            `true` when the channel read failed, so `channels` is empty because
            the numbers are missing, not zero.
          example: false
        countries:
          items:
            $ref: '#/components/schemas/GoogleAdsImpactCountry'
          type: array
          title: Countries
          description: >-
            Conversions per country the people who converted were in, most
            first. Empty when `locations_unavailable` is `true`.
          example:
            - code: DE
              conversions: 20
        locations:
          items:
            $ref: '#/components/schemas/GoogleAdsImpactLocation'
          type: array
          title: Locations
          description: >-
            Conversions per city, or the most specific place Google resolved,
            most first. Empty when `locations_unavailable` is `true`.
          example:
            - conversions: 11
              name: Berlin
        countries_unresolved:
          type: number
          title: Countries Unresolved
          description: >-
            Conversions Base44 could not name a country for, so they are missing
            from `countries`. Absent when `locations_unavailable` is `true`.
          default: 0
          example: 0
        locations_unresolved:
          type: number
          title: Locations Unresolved
          description: >-
            Conversions Base44 could not name a place for, so they are missing
            from `locations`. Absent when `locations_unavailable` is `true`.
          default: 0
          example: 1
        locations_unavailable:
          type: boolean
          title: Locations Unavailable
          description: >-
            `true` when the location read failed, so `countries` and `locations`
            are empty because the numbers are missing, not zero.
          example: false
        goals_configured:
          items:
            type: string
          type: array
          title: Goals Configured
          description: >-
            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.
          example:
            - sales
      type: object
      required:
        - goals
        - goals_unavailable
        - channels
        - channels_unavailable
        - countries
        - locations
        - locations_unavailable
        - goals_configured
      title: GoogleAdsCampaignImpact
      description: One campaign's conversions, broken down by goal, channel and location.
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    GoogleAdsImpactGoalTotals:
      properties:
        conversions:
          type: number
          title: Conversions
          description: Conversions in the window, rounded to two decimals.
          example: 24
        conversions_value:
          type: number
          title: Conversions Value
          description: >-
            Total value of those conversions in the account's currency, rounded
            to two decimals.
          example: 1830
      type: object
      required:
        - conversions
        - conversions_value
      title: GoogleAdsImpactGoalTotals
      description: Conversions and their value for one goal family.
    GoogleAdsImpactGoalAction:
      properties:
        category:
          type: string
          title: Category
          description: >-
            Google's conversion category, passed through as Google reports it,
            for example `PURCHASE`, `SUBMIT_LEAD_FORM` or `BEGIN_CHECKOUT`.
          example: PURCHASE
        family:
          type: string
          title: Family
          description: >-
            The goal family the category counts toward in `goals`: `sales`,
            `leads`, `shopping` or `other`.
          example: sales
        conversions:
          type: number
          title: Conversions
          description: >-
            Conversions in this category, rounded to two decimals. Can be
            negative when Google retracted conversions.
          example: 12
        conversions_value:
          type: number
          title: Conversions Value
          description: >-
            Total value of those conversions in the account's currency, rounded
            to two decimals.
          example: 960
      type: object
      required:
        - category
        - family
        - conversions
        - conversions_value
      title: GoogleAdsImpactGoalAction
      description: One conversion category's share of the campaign's conversions.
    GoogleAdsImpactChannel:
      properties:
        channel:
          type: string
          title: Channel
          description: >-
            Google's ad network, passed through as Google reports it, for
            example `SEARCH`, `YOUTUBE` or `CONTENT`.
          example: SEARCH
        conversions:
          type: number
          title: Conversions
          description: Conversions through this network, rounded to two decimals.
          example: 18
      type: object
      required:
        - channel
        - conversions
      title: GoogleAdsImpactChannel
      description: Conversions that came through one Google surface.
    GoogleAdsImpactCountry:
      properties:
        code:
          type: string
          title: Code
          description: ISO 3166-1 alpha-2 code of the country.
          example: DE
        conversions:
          type: number
          title: Conversions
          description: Conversions from people in this country, rounded to two decimals.
          example: 20
      type: object
      required:
        - code
        - conversions
      title: GoogleAdsImpactCountry
      description: Conversions from people in one country.
    GoogleAdsImpactLocation:
      properties:
        name:
          type: string
          title: Name
          description: >-
            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.
          example: Berlin
        conversions:
          type: number
          title: Conversions
          description: Conversions from people in this place, rounded to two decimals.
          example: 11
      type: object
      required:
        - name
        - conversions
      title: GoogleAdsImpactLocation
      description: Conversions from people in one place.
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
  securitySchemes:
    PersonalAccessTokenAuth:
      type: http
      scheme: bearer
      description: 'Personal access token, sent as `Authorization: Bearer <token>`.'

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.