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 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 either. The error message says when that is what happened and tells you not to re-approve. Read it before retrying.</Warning>
Base44 checks these from the request before creating anything, and a request that fails one creates nothing:
- A Performance Max campaign has a logo_url, plus at least one MARKETING_IMAGE and one SQUARE_MARKETING_IMAGE whose url is on a host Base44 fetches images from.
- The budget sits inside the per-currency range for the campaign type.
- The business name is within its length limit.
- sitelinks and phone_number are well formed.
- Targeting that can reach the EU carries a political-advertising declaration.
Anything Base44 only finds out by fetching, or that only Google can judge, fails after the account exists. That includes an image or logo that doesn't download and a landing page Google can't crawl.
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 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 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
ID of the app to advertise.
ID of the app to advertise.
Request body
Example request
{
"campaign": {
"images": [
{
"url": "https://storage.base44.com/gads-assets/b7f3a1c8-landscape.png",
"field_type": "MARKETING_IMAGE",
"name": "Showroom landscape"
}
],
"sitelinks": [
{
"text": "Visit our showroom",
"url": "https://example.com/showroom"
}
]
}
}Response
The account the campaign lives on, and the campaign.
Example response
{
"account": {
"id": "68b1c0d4e7b91d003c45a1f0",
"status": "ACTIVE",
"account_name": "Nordwind Furniture",
"currency_code": "EUR",
"timezone": "Europe/Berlin",
"google_customer_id": "1234567890"
},
"campaign": {
"id": "68b1c0d4e7b91d003c45a1f2",
"google_campaign_id": "21098765432",
"campaign_name": "Spring sale in Berlin",
"campaign_type": "SMART",
"status": "ENABLED",
"daily_budget_micros": 15000000,
"landing_page": "https://example.com/spring",
"geo_targets": [
"1003854"
],
"phone_number": "+493012345678",
"learning_ends_at": "2026-09-08T11:20:00Z",
"review_status": "REVIEWED",
"serving_status": "SERVING",
"primary_status": "ELIGIBLE",
"primary_status_reasons": [
"CAMPAIGN_BUDGET_LIMITED"
],
"created_date": "2026-08-25T11:20:00Z",
"updated_date": "2026-08-25T14:05:00Z"
}
}