---
title: "Launch Google Ads campaign"
method: POST
path: "/api/apps/{app_id}/google-ads/launch"
---

# Launch Google Ads campaign

`POST /api/apps/{app_id}/google-ads/launch`

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

## Path parameters

- `app_id` string, required — ID of the app to advertise.

## Request body

- object
  - `campaign` object, required — The campaign to create. Same fields as [Create campaign](/api-reference/create-google-ads-campaign).
    - `campaign_name` string, required — Name for the campaign.
    - `campaign_type` 'SMART' | 'PERFORMANCE_MAX' — Which campaign type to create.
    - `daily_budget_micros` integer, required — 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` string — URL the ads send clicks to. Google rejects the campaign if it cannot reach this page.
    - `logo_url` string — 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` string[] — Themes to match searches on, for a `SMART` campaign.
    - `headlines` string[] — Ad headlines. Google reviews these against its advertising policies.
    - `descriptions` string[] — Ad description lines. Google reviews these against its advertising policies.
    - `geo_targets` string[] — Google Ads geo target constant IDs to target.
    - `business_name` string — Business name shown in the ad.
    - `phone_number` string — Phone number for the call extension.
    - `contains_eu_political_advertising` boolean — Whether the campaign carries political advertising. Required before an EU advertiser can create a campaign.
    - `settings` object — Campaign settings. `language_code` is the only key this API commits to; anything else is passed through undocumented.
      - `language_code` string — 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.
  - `timezone` string — 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`.

## Response `200`

The account the campaign lives on, and the campaign.

- LaunchResponse — The account and the campaign, after both exist.
  - `account` LaunchAccountSummary, required — The Google Ads account the campaign now lives on.
    - `id` string, required — Base44's ID for the account.
    - `status` string, required — Where the account stands: `ACTIVE` once it can spend, `PENDING_BILLING_SETUP` while Base44 is still wiring its billing.
    - `account_name` string, required — Name Base44 gave the account on Google, taken from the business details.
    - `currency_code` string, required — Currency the account is billed in. Fixed when the account is created and never changes.
    - `timezone` string, required — Time zone the account reports its days in. Also fixed at creation.
    - `google_customer_id` string, required — The account's Google Ads customer ID. Empty for the moment between Base44 reserving the account and Google returning its ID.
  - `campaign` CampaignResource, required — The campaign fields this API commits to.
    - `id` string, required — Base44's ID for the campaign. Pass this as `campaign_id` on the other campaign endpoints.
    - `google_campaign_id` string, required — The campaign's ID in Google Ads. Empty while a just-created campaign is still being pushed to Google.
    - `campaign_name` string, required — Name shown for the campaign.
    - `campaign_type` 'SMART' | 'PERFORMANCE_MAX' | 'SEARCH' | 'DISPLAY' | 'SHOPPING' | 'VIDEO' | 'DEMAND_GEN' | 'LOCAL' | 'UNKNOWN', required — Campaign type. Base44 creates `SMART` and `PERFORMANCE_MAX`; the other values appear only on campaigns created outside Base44 and synced in.
    - `status` 'ENABLED' | 'PAUSED' | 'REMOVED' | 'UNKNOWN', required — Serving state in Base44's cache. `REMOVED` is a deleted campaign, which Google keeps for reporting.
    - `daily_budget_micros` integer, required — Daily budget in micros of the account currency: 1,000,000 micros is one unit, so `15000000` is 15.00.
    - `landing_page` string, required — URL the ads send clicks to.
    - `geo_targets` string[], required — Google Ads geo target constant IDs the campaign targets.
    - `phone_number` string, required — Call-extension phone number, empty when the campaign has none.
    - `learning_ends_at` string, date-time, nullable — When Smart Bidding's learning period is expected to end, about 14 days after creation. `null` on a campaign that has not started learning.
    - `review_status` string, required — Google's policy review status, passed through as Google reports it (`REVIEWED`, `UNDER_REVIEW`, …). Empty until the first sync after creation.
    - `serving_status` string, required — 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`.
    - `primary_status` string, required — Google's summary of whether the campaign is serving well, passed through as Google reports it (`ELIGIBLE`, `LIMITED`, `NOT_SERVING`, …).
    - `primary_status_reasons` string[], required — Google's reasons behind `primary_status`, e.g. why a campaign is limited. Empty when there is nothing to explain.
    - `created_date` string, date-time, required — When the campaign was created in Base44.
    - `updated_date` string, date-time, required — When Base44 last changed its record of the campaign.

## Other responses

- `400` — 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` — Missing or invalid credentials.
- `402` — The workspace has no payment method on file.
- `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.
- `404` — The `draft_id` does not name a launch draft for this app.
- `409` — 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` — Validation Error
- `429` — Google Ads is rate limiting the account. Retry later.

## Changes

- **2026-08-26** `f2727732ced1` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/idealspot/apis/base44-app-management-api/changes/api/apps/:app_id/google-ads/launch/post.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-service-production.skmtc.workers.dev/v1/apis/idealspot/base44-app-management-api/revisions/31ef75eb64ab/schema)
