Manage ads
Pause and resume Google campaigns, ad groups and ads, change a campaign's budget and bidding, rename ad groups, and delete any level.
By the end of this page, you can stop and restart delivery, change what a running Google campaign spends, and remove what you no longer need.
Before you start
You need a googleads account and a campaign. campaignId and adSetId are Google's numeric campaign and ad group ids (platformCampaignId and platformAdSetId on the created ad).
Pause or resume
PUT /v1/ads/campaigns/{campaignId}/status writes the campaign's own switch (ENABLED or PAUSED) and nothing else. Its ad groups and ads keep their own switches.
import Zernio from '@zernio/node';
const zernio = new Zernio();
const { data: paused } = await zernio.adcampaigns.updateAdCampaignStatus({
path: { campaignId: '21874563210' },
body: { status: 'paused', platform: 'google' }
});Response (200):
{ "status": "paused", "platformCampaignStatus": "PAUSED", "statusReadAt": "2026-10-19T08:55:34.565Z", "updated": 1, "skipped": 0 }Zernio reads the switch from Google first. When it is already in the requested state, nothing is written and the response says updated: 0, skipped: 1 with a reason.
Resuming a campaign lets each ad group and ad deliver again only if its own switch is on. Narrower scopes take the same status:
| Scope | Call |
|---|---|
| One ad group | PUT /v1/ads/ad-sets/{adSetId}/status |
| One ad | PUT /v1/ads/{adId}/status, which leaves sibling ads running |
| Up to 50 campaigns | POST /v1/ads/campaigns/bulk-status, which reports each row on its own |
A Performance Max campaign is always created paused. Resume it here once it passes review.
Change the budget
Send budget on PUT /v1/ads/campaigns/{campaignId}. Google budgets are daily only, and the amount is in whole units of the account's currency, not micros.
const { data: rebudgeted } = await zernio.adcampaigns.updateAdCampaign({
path: { campaignId: '21874563210' },
body: { platform: 'google', budget: { amount: 80, type: 'daily' } }
});Response (200):
{ "updated": 1, "budget": { "amount": 80, "type": "daily", "amountMicros": "80000000" }, "budgetLevel": "campaign" }budget on PUT /v1/ads/{adId} changes the same campaign budget.
Shared budgets. A budget is shared when Google flags it so, or when more than one campaign uses it. On PUT /v1/ads/campaigns/{campaignId}, changing one returns 409 unless you send allowSharedBudgetUpdate: true, because the change reaches every campaign on it. PUT /v1/ads/{adId} does not take that flag and always returns 409.
sharedBudgetId moves the campaign onto a budget from GET /v1/ads/shared-budgets, and also needs allowSharedBudgetUpdate: true. sharedBudgetId: null moves it back onto a new daily budget of its own, sized by budget.
Change the bidding
bidStrategy on PUT /v1/ads/campaigns/{campaignId} sets the campaign's bidding. Amounts are whole currency units.
bidStrategy | With | Google strategy |
|---|---|---|
LOWEST_COST_WITHOUT_CAP | Maximize Conversions | |
COST_CAP | bidAmount | Target CPA |
LOWEST_COST_WITH_MIN_ROAS | roasAverageFloor | Target ROAS |
LOWEST_COST_WITH_BID_CAP | bidAmount | Maximize Clicks with a CPC ceiling |
Instead of bidStrategy, send one of:
portfolioBidStrategyId, to attach a portfolio strategy fromGET /v1/ads/bid-strategiestargetImpressionShare(Search only)manualCpc: { maxCpc }(Search and Display), which gives every ad group of the campaignmaxCpcas its bid
A campaign on a portfolio strategy rejects bidStrategy. Detach it in Google Ads first, since the strategy is shared across campaigns.
Rename
name on PUT /v1/ads/ad-sets/{adSetId} renames the ad group.
Google ads have no rename: PUT /v1/ads/{adId} does not take name on Google. To change what an ad says, edit its text instead (Edit responsive search ad text).
Delete
| Level | Call | What Google does |
|---|---|---|
| Ad | DELETE /v1/ads/{adId} | Removes the ad. Zernio keeps it as cancelled for history. |
| Ad group | DELETE /v1/ads/ad-sets/{adSetId} | Removes the ad group, which stays readable for reporting. Its ads are marked cancelled. |
| Campaign | DELETE /v1/ads/campaigns/{campaignId} | Removes the campaign. Its ads are marked cancelled. |
Deleting an ad never deletes its campaign or ad group while they hold another ad.
A campaign with no ads in Zernio is deleted only after Google confirms it holds no ad groups, ads or asset groups. To delete one, send accountId in the body or the query string.
If it fails
| Error | Cause | Fix |
|---|---|---|
409 on a budget change | The campaign's budget is shared, or its sharing state is unknown | Send allowSharedBudgetUpdate: true if you mean to change every campaign on it |
422 on budgetType | The budget is lifetime | Send type: "daily" |
501 on bidStrategy on an ad group | Google bids at campaign level | Set it on PUT /v1/ads/campaigns/{campaignId} |
409 invalid_resource_state on a campaign delete | The empty campaign was never synced, or Google still lists ad groups or ads under it | Sync the ad account (POST /v1/ads/sync) and delete again |
429 with budgetScope | More than 15 writes a minute on one account, or 120 across your accounts | Retry within the minute (Quotas) |
Related
- Create a campaign: the campaigns these calls manage.
- Targeting: change a running campaign's locations, languages and devices.
- Keywords: pause, change or remove one keyword.
- Pause or resume a campaign, Update a campaign and Delete a campaign: every field.
URL tracking tags
Read and update a Google campaign's tracking template and final URL suffix through GET and PATCH /v1/ads/{adId}/tracking-tags.
Recommendations
Read Google's optimization recommendations for a Google Ads account with their estimated impact, apply them with Google's suggested values or your own, and dismiss the ones you do not want.