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

# Launch Google Ads campaign

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

Creates the app's Google Ads account if it does not have one, then creates a campaign on it. This is what starts spending money.

Call [Get launch readiness](/api-reference/get-google-ads-launch-readiness) first and send its `landing_page` back here. Its `currency_code` is informational: there is no currency field on this request, and Base44 derives the account's currency itself.

<Warning>Creating the Google Ads account cannot be undone. There is no endpoint that deletes one, and an account keeps its currency and time zone for life. A later launch reuses that account, so the first attempt is what commits you to its currency.</Warning>

<Warning>A failure at the campaign step is not automatically safe to retry. Google Ads can create the campaign and then a follow-up step fail, which leaves it live and spending while Base44 has no record of it — so it does not appear in [List campaigns](/api-reference/list-google-ads-campaigns) either. The error message says when that is what happened and tells you not to re-approve. Read it before retrying.</Warning>

Base44 checks what it can from the request before creating anything: a Performance Max campaign needs `logo_url`, the budget has to sit inside the per-currency range for the campaign type, the business name has a length limit, and targeting that can reach the EU needs an EU political-advertising declaration. Those all fail with a 400 and create nothing. Anything only Google can judge — a logo it cannot fetch, a landing page it cannot crawl — fails after the account exists.

A 409 has four different causes and they are not all safe to retry:

- the workspace is on billing hold, or the account is, so no new spend is allowed. Fix the billing problem and retry.
- the campaign was already launched from this draft. Retrying will not create a second one.
- **the request to Google Ads timed out after being sent.** The campaign may be live and spending. Do not retry: read [List campaigns](/api-reference/list-google-ads-campaigns) and check before doing anything else.

The response carries the account and the campaign. A campaign can come back paused when its conversion tracking is not wired yet; Base44 enables it on its own once tracking verifies.

Launching is refused, rather than allowed through, while Base44 cannot reach its payment provider to confirm a card is on file. [Get launch readiness](/api-reference/get-google-ads-launch-readiness) reports that state as `stripe_unavailable`, so check it there instead of inferring it from a failed launch.

<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. Send only the fields documented here. Other request fields are not supported and their behavior can change.</Warning>



## OpenAPI

````yaml /developers/references/app-management/app-management-openapi.json post /api/apps/{app_id}/google-ads/launch
openapi: 3.1.0
info:
  title: Base44 App Management API
  version: 1.0.0
servers:
  - url: https://app.base44.com
security:
  - ApiKeyAuth: []
paths:
  /api/apps/{app_id}/google-ads/launch:
    post:
      summary: Launch Google Ads campaign
      description: >-
        <Info>This API is in beta. Endpoints, fields, and behavior may still
        change, so avoid depending on it in production.</Info>


        Creates the app's Google Ads account if it does not have one, then
        creates a campaign on it. This is what starts spending money.


        Call [Get launch
        readiness](/api-reference/get-google-ads-launch-readiness) first and
        send its `landing_page` back here. Its `currency_code` is informational:
        there is no currency field on this request, and Base44 derives the
        account's currency itself.


        <Warning>Creating the Google Ads account cannot be undone. There is no
        endpoint that deletes one, and an account keeps its currency and time
        zone for life. A later launch reuses that account, so the first attempt
        is what commits you to its currency.</Warning>


        <Warning>A failure at the campaign step is not automatically safe to
        retry. Google Ads can create the campaign and then a follow-up step
        fail, which leaves it live and spending while Base44 has no record of it
        — so it does not appear in [List
        campaigns](/api-reference/list-google-ads-campaigns) either. The error
        message says when that is what happened and tells you not to re-approve.
        Read it before retrying.</Warning>


        Base44 checks what it can from the request before creating anything: a
        Performance Max campaign needs `logo_url`, the budget has to sit inside
        the per-currency range for the campaign type, the business name has a
        length limit, and targeting that can reach the EU needs an EU
        political-advertising declaration. Those all fail with a 400 and create
        nothing. Anything only Google can judge — a logo it cannot fetch, a
        landing page it cannot crawl — fails after the account exists.


        A 409 has four different causes and they are not all safe to retry:


        - the workspace is on billing hold, or the account is, so no new spend
        is allowed. Fix the billing problem and retry.

        - the campaign was already launched from this draft. Retrying will not
        create a second one.

        - **the request to Google Ads timed out after being sent.** The campaign
        may be live and spending. Do not retry: read [List
        campaigns](/api-reference/list-google-ads-campaigns) and check before
        doing anything else.


        The response carries the account and the campaign. A campaign can come
        back paused when its conversion tracking is not wired yet; Base44
        enables it on its own once tracking verifies.


        Launching is refused, rather than allowed through, while Base44 cannot
        reach its payment provider to confirm a card is on file. [Get launch
        readiness](/api-reference/get-google-ads-launch-readiness) reports that
        state as `stripe_unavailable`, so check it there instead of inferring it
        from a failed launch.


        <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. Send only the fields documented here. Other request fields are not
        supported and their behavior can change.</Warning>
      operationId: launch_campaign_api_apps__app_id__google_ads_launch_post
      parameters:
        - name: app_id
          in: path
          required: true
          schema:
            type: string
            description: ID of the app to advertise.
            title: App Id
          description: ID of the app to advertise.
          example: 6820f3a4e7b91d003c45a1f2
      requestBody:
        required: true
        content:
          application/json:
            schema:
              title: LaunchCampaign
              type: object
              required:
                - campaign
              properties:
                campaign:
                  title: LaunchCampaignDetails
                  type: object
                  required:
                    - campaign_name
                    - daily_budget_micros
                  properties:
                    campaign_name:
                      type: string
                      description: Name for the campaign.
                    campaign_type:
                      type: string
                      enum:
                        - SMART
                        - PERFORMANCE_MAX
                      default: SMART
                      description: Which campaign type to create.
                    daily_budget_micros:
                      type: integer
                      description: >-
                        Daily budget in micros of the account currency, so
                        `15000000` is 15.00. Google enforces a per-currency
                        minimum and rejects anything below it with a 400.
                    landing_page:
                      type: string
                      description: >-
                        URL the ads send clicks to. Google rejects the campaign
                        if it cannot reach this page.
                    logo_url:
                      type: string
                      description: >-
                        URL of a square logo image. Required for a
                        `PERFORMANCE_MAX` campaign and rejected with a 400 when
                        missing; ignored for `SMART`. Google must be able to
                        fetch it.
                    keyword_themes:
                      type: array
                      items:
                        type: string
                      description: Themes to match searches on, for a `SMART` campaign.
                    headlines:
                      type: array
                      items:
                        type: string
                      description: >-
                        Ad headlines. Google reviews these against its
                        advertising policies.
                    descriptions:
                      type: array
                      items:
                        type: string
                      description: >-
                        Ad description lines. Google reviews these against its
                        advertising policies.
                    geo_targets:
                      type: array
                      items:
                        type: string
                      description: Google Ads geo target constant IDs to target.
                    business_name:
                      type: string
                      description: Business name shown in the ad.
                    phone_number:
                      type: string
                      description: Phone number for the call extension.
                    contains_eu_political_advertising:
                      type: boolean
                      description: >-
                        Whether the campaign carries political advertising.
                        Required before an EU advertiser can create a campaign.
                    settings:
                      type: object
                      description: >-
                        Campaign settings. `language_code` is the only key this
                        API commits to; anything else is passed through
                        undocumented.
                      properties:
                        language_code:
                          type: string
                          description: >-
                            Two-letter code for the language the ad copy is
                            written in, which becomes the campaign's advertising
                            language. English when absent or unsupported —
                            `Accept-Language` does not affect it. Pass through
                            `settings` from [Suggest Google Ads
                            campaigns](/api-reference/suggest-google-ads-campaigns)
                            to keep a generated campaign's targeting on its
                            copy's language.
                  description: >-
                    The campaign to create. Same fields as [Create
                    campaign](/api-reference/create-google-ads-campaign).
                timezone:
                  type: string
                  description: >-
                    Time zone to create the Google Ads account in, as an IANA
                    name. Only used when the account does not exist yet, and
                    fixed for its lifetime after that. Defaults to `UTC`.
            example:
              campaign:
                campaign_name: Spring sale
                campaign_type: SMART
                daily_budget_micros: 15000000
                landing_page: https://example.com
                keyword_themes:
                  - oak furniture
                  - dining table
                business_name: Nordwind Furniture
              timezone: Europe/Berlin
      responses:
        '200':
          description: The account the campaign lives on, and the campaign.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LaunchResponse'
        '400':
          description: >-
            The request cannot produce a campaign: a Performance Max campaign
            with no `logo_url`, a budget outside the allowed range for the
            currency and campaign type, a business name that is too long,
            EU-reaching targeting with no political-advertising declaration, or
            a rejection passed through from Google Ads.
        '401':
          description: Missing or invalid credentials.
        '402':
          description: The workspace has no payment method on file.
        '403':
          description: >-
            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.
        '404':
          description: The `draft_id` does not name a launch draft for this app.
        '409':
          description: >-
            One of four things: the workspace is on billing hold, the account
            is, this draft was already launched, or the request to Google Ads
            timed out after being sent and the campaign may be live. The message
            says which; only the last one must not be retried.
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '429':
          description: Google Ads is rate limiting the account. Retry later.
components:
  schemas:
    LaunchResponse:
      properties:
        account:
          $ref: '#/components/schemas/LaunchAccountSummary'
          description: >-
            The Google Ads account the campaign was created on, whether it
            already existed or was created by this call.
        campaign:
          $ref: '#/components/schemas/CampaignResource'
          description: The campaign that is now live.
      type: object
      required:
        - account
        - campaign
      title: LaunchResponse
      description: The account and the campaign, after both exist.
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    LaunchAccountSummary:
      properties:
        id:
          type: string
          title: Id
          description: Base44's ID for the account.
          example: 68b1c0d4e7b91d003c45a1f0
        status:
          type: string
          title: Status
          description: >-
            Where the account stands: `ACTIVE` once it can spend,
            `PENDING_BILLING_SETUP` while Base44 is still wiring its billing.
          example: ACTIVE
        account_name:
          type: string
          title: Account Name
          description: >-
            Name Base44 gave the account on Google, taken from the business
            details.
          example: Nordwind Furniture
        currency_code:
          type: string
          title: Currency Code
          description: >-
            Currency the account is billed in. Fixed when the account is created
            and never changes.
          example: EUR
        timezone:
          type: string
          title: Timezone
          description: Time zone the account reports its days in. Also fixed at creation.
          example: Europe/Berlin
        google_customer_id:
          type: string
          title: Google Customer Id
          description: >-
            The account's Google Ads customer ID. Empty for the moment between
            Base44 reserving the account and Google returning its ID.
          example: '1234567890'
      type: object
      required:
        - id
        - status
        - account_name
        - currency_code
        - timezone
        - google_customer_id
      title: LaunchAccountSummary
      description: The Google Ads account the campaign now lives on.
    CampaignResource:
      properties:
        id:
          type: string
          title: Id
          description: >-
            Base44's ID for the campaign. Pass this as `campaign_id` on the
            other campaign endpoints.
          example: 68b1c0d4e7b91d003c45a1f2
        google_campaign_id:
          type: string
          title: Google Campaign Id
          description: >-
            The campaign's ID in Google Ads. Empty while a just-created campaign
            is still being pushed to Google.
          example: '21098765432'
        campaign_name:
          type: string
          title: Campaign Name
          description: Name shown for the campaign.
          example: Spring sale in Berlin
        campaign_type:
          type: string
          enum:
            - SMART
            - PERFORMANCE_MAX
            - SEARCH
            - DISPLAY
            - SHOPPING
            - VIDEO
            - DEMAND_GEN
            - LOCAL
            - UNKNOWN
          title: Campaign Type
          description: >-
            Campaign type. Base44 creates `SMART` and `PERFORMANCE_MAX`; the
            other values appear only on campaigns created outside Base44 and
            synced in.
          example: SMART
        status:
          type: string
          enum:
            - ENABLED
            - PAUSED
            - REMOVED
            - UNKNOWN
          title: Status
          description: >-
            Serving state in Base44's cache. `REMOVED` is a deleted campaign,
            which Google keeps for reporting.
          example: ENABLED
        daily_budget_micros:
          type: integer
          title: Daily Budget Micros
          description: >-
            Daily budget in micros of the account currency: 1,000,000 micros is
            one unit, so `15000000` is 15.00.
          example: 15000000
        landing_page:
          type: string
          title: Landing Page
          description: URL the ads send clicks to.
          example: https://example.com/spring
        geo_targets:
          items:
            type: string
          type: array
          title: Geo Targets
          description: Google Ads geo target constant IDs the campaign targets.
          example:
            - '1003854'
        phone_number:
          type: string
          title: Phone Number
          description: Call-extension phone number, empty when the campaign has none.
          example: '+493012345678'
        learning_ends_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Learning Ends At
          description: >-
            When Smart Bidding's learning period is expected to end, about 14
            days after creation. `null` on a campaign that has not started
            learning.
          example: '2026-09-08T11:20:00Z'
        review_status:
          type: string
          title: Review Status
          description: >-
            Google's policy review status, passed through as Google reports it
            (`REVIEWED`, `UNDER_REVIEW`, …). Empty until the first sync after
            creation.
          example: REVIEWED
        serving_status:
          type: string
          title: Serving Status
          description: >-
            Google's serving status, passed through as Google reports it. Can
            still report review gating after policy review clears, so read it
            alongside `review_status`.
          example: SERVING
        primary_status:
          type: string
          title: Primary Status
          description: >-
            Google's summary of whether the campaign is serving well, passed
            through as Google reports it (`ELIGIBLE`, `LIMITED`, `NOT_SERVING`,
            …).
          example: ELIGIBLE
        primary_status_reasons:
          items:
            type: string
          type: array
          title: Primary Status Reasons
          description: >-
            Google's reasons behind `primary_status`, e.g. why a campaign is
            limited. Empty when there is nothing to explain.
          example:
            - CAMPAIGN_BUDGET_LIMITED
        created_date:
          type: string
          format: date-time
          title: Created Date
          description: When the campaign was created in Base44.
          example: '2026-08-25T11:20:00Z'
        updated_date:
          type: string
          format: date-time
          title: Updated Date
          description: When Base44 last changed its record of the campaign.
          example: '2026-08-25T14:05:00Z'
      type: object
      required:
        - id
        - google_campaign_id
        - campaign_name
        - campaign_type
        - status
        - daily_budget_micros
        - landing_page
        - geo_targets
        - phone_number
        - review_status
        - serving_status
        - primary_status
        - primary_status_reasons
        - created_date
        - updated_date
      title: CampaignResource
      description: The campaign fields this API commits to.
    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:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: api_key
      description: Personal API key.

````