Performance Max
Stay organized with collections
Save and categorize content based on your preferences.
function
getAllPerformanceMaxCampaigns
()
{
//
AdsApp
.
performanceMaxCampaigns
()
will
return
all
campaigns
that
are
not
//
removed
by
default
.
const
performanceMaxCampaignIterator
=
AdsApp
.
performanceMaxCampaigns
()
.
get
();
console
.
log
(
`
Total
campaigns
found
:
$
{
performanceMaxCampaignIterator
.
totalNumEntities
()}
`
);
return
performanceMaxCampaignIterator
;
}
Usage
const
performanceMaxCampaigns
=
getAllPerformanceMaxCampaigns
();
for
(
const
performanceMaxCampaign
of
performanceMaxCampaigns
)
{
//
Process
your
campaign
.
}
function
getPerformanceMaxCampaignByName
(
campaignName
)
{
const
performanceMaxCampaignIterator
=
AdsApp
.
performanceMaxCampaigns
()
.
withCondition
(
`
campaign
.
name
=
"${campaignName}"
`
)
.
get
();
if
(
!
performanceMaxCampaignIterator
.
hasNext
())
{
throw
new
Error
(
`
No
performance
max
campaign
with
name
$
{
campaignName
}
found
.
`
);
}
const
performanceMaxCampaign
=
performanceMaxCampaignIterator
.
next
();
console
.
log
(
`
Campaign
Name
:
$
{
performanceMaxCampaign
.
getName
()}
`
);
console
.
log
(
`
Enabled
:
$
{
performanceMaxCampaign
.
isEnabled
()}
`
);
console
.
log
(
`
Bidding
strategy
:
$
{
performanceMaxCampaign
.
getBiddingStrategyType
()}
`
);
console
.
log
(
`
Ad
rotation
:
$
{
performanceMaxCampaign
.
getAdRotationType
()}
`
);
console
.
log
(
`
Start
date
:
$
{
formatDate
(
performanceMaxCampaign
.
getStartDate
())}
`
);
console
.
log
(
`
End
date
:
$
{
formatDate
(
performanceMaxCampaign
.
getEndDate
())}
`
);
return
performanceMaxCampaign
;
}
function
formatDate
(
date
)
{
function
zeroPad
(
number
)
{
return
Utilities
.
formatString
(
'
%02d
'
,
number
);
}
return
(
date
==
null
)
?
'None'
:
zeroPad
(
date
.
year
)
+
zeroPad
(
date
.
month
)
+
zeroPad
(
date
.
day
);
}
function
getPerformanceMaxCampaignStats
(
campaignName
)
{
const
performanceMaxCampaignIterator
=
AdsApp
.
performanceMaxCampaigns
()
.
withCondition
(
`
campaign
.
name
=
"${campaignName}"
`
)
.
get
();
if
(
!
performanceMaxCampaignIterator
.
hasNext
())
{
throw
new
Error
(
`
No
performance
max
campaign
with
name
$
{
campaignName
}
found
.
`
);
}
const
performanceMaxCampaign
=
performanceMaxCampaignIterator
.
next
();
//
Fetch
stats
for
the
last
month
.
See
the
DateRangeLiteral
section
at
//
https
:
//
developers
.
google
.
com
/
adwords
/
api
/
docs
/
guides
/
awql
#formal_grammar
//
for
a
list
of
all
supported
pre
-
defined
date
ranges
.
//
Note
:
Reports
can
also
be
used
to
fetch
stats
.
See
//
https
:
//
developers
.
google
.
com
/
google
-
ads
/
scripts
/
docs
/
features
/
reports
//
for
more
information
.
var
stats
=
performanceMaxCampaign
.
getStatsFor
(
'LAST_MONTH'
);
console
.
log
(
`
$
{
performanceMaxCampaign
.
getName
()},
$
{
stats
.
getImpressions
()}
impressions
,
`
+
`
$
{
stats
.
getViews
()}
views
`
);
return
stats
;
}
function
pausePerformanceMaxCampaign
(
campaignName
)
{
const
performanceMaxCampaignIterator
=
AdsApp
.
performanceMaxCampaigns
()
.
withCondition
(
`
campaign
.
name
=
"${campaignName}"
`
)
.
get
();
if
(
performanceMaxCampaignIterator
.
hasNext
())
{
const
performanceMaxCampaign
=
performanceMaxCampaignIterator
.
next
();
performanceMaxCampaign
.
pause
();
}
}
Retrieve an asset group by its name
function
getAssetGroupByName
(
campaignName
,
assetGroupName
)
{
//
Defined
above
const
performanceMaxCampaign
=
getPerformanceMaxCampaignByName
(
campaignName
);
if
(
performanceMaxCampaign
==
null
)
{
return
null
;
}
const
assetGroupIterator
=
performanceMaxCampaign
.
assetGroups
()
.
withCondition
(
`
asset_group
.
name
=
"${assetGroupName}"
`
)
.
get
();
if
(
!
assetGroupIterator
.
hasNext
())
{
throw
new
Error
(
`
No
asset
group
found
with
name
$
{
assetGroupName
}
.
`
);
}
return
assetGroupIterator
.
next
();
}
Pause an asset group
function
pausePerformanceMaxAssetGroup
(
campaignName
,
assetGroupName
)
{
//
Defined
above
const
assetGroup
=
getAssetGroupByName
(
campaignName
,
assetGroupName
);
assetGroup
.
pause
();
console
.
log
(
`
AssetGroup
with
name
:
$
{
assetGroup
.
getName
()}
`
+
`
has
paused
status
:
$
{
assetGroup
.
isPaused
()}
`
);
}
Retrieve a specific video for use in an asset group
function
getVideoByYouTubeId
(
youTubeVideoId
)
{
//
You
can
filter
on
the
YouTubeVideoId
if
you
already
have
that
video
in
//
your
account
to
fetch
the
exact
one
you
want
right
away
.
const
videos
=
AdsApp
.
adAssets
()
.
assets
()
.
withCondition
(
`
asset
.
type
=
YOUTUBE_VIDEO
AND
`
+
`
asset
.
youtube_video_asset
.
youtube_video_id
=
'${youTubeVideoId}'
`
)
.
get
();
if
(
videos
.
hasNext
())
{
return
videos
.
next
();
}
return
null
;
}
Add a specific video to an asset group
function
addVideoToAssetGroup
(
youTubeVideoId
,
campaignName
,
assetGroupName
)
{
//
Defined
above
const
video
=
getVideoByYouTubeId
(
youTubeVideoId
);
const
assetGroup
=
getAssetGroupByName
(
campaignName
,
assetGroupName
);
assetGroup
.
addAsset
(
video
,
'YOUTUBE_VIDEO'
);
}
Remove a specific video from an asset group
function
removeVideoFromAssetGroup
(
youTubeVideoId
,
campaignName
,
assetGroupName
)
{
//
Defined
above
const
video
=
getVideoByYouTubeId
(
youTubeVideoId
);
const
assetGroup
=
getAssetGroupByName
(
campaignName
,
assetGroupName
);
assetGroup
.
removeAsset
(
video
,
'YOUTUBE_VIDEO'
);
}
Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License
, and code samples are licensed under the Apache 2.0 License
. For details, see the Google Developers Site Policies
. Java is a registered trademark of Oracle and/or its affiliates.
Last updated 2025-08-20 UTC.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-08-20 UTC."],[[["\u003cp\u003eThis script provides functions to manage Google Ads Performance Max campaigns, including retrieving, pausing, and getting stats for campaigns and asset groups.\u003c/p\u003e\n"],["\u003cp\u003eYou can retrieve campaigns by name or iterate through all of them, and access campaign details like bidding strategy and start/end dates.\u003c/p\u003e\n"],["\u003cp\u003eAsset group management includes retrieving by name, pausing, and adding or removing specific videos identified by their YouTube IDs.\u003c/p\u003e\n"],["\u003cp\u003eFunctions to get campaign and asset group stats are included, utilizing predefined date ranges or enabling the use of reports for more customized analysis.\u003c/p\u003e\n"],["\u003cp\u003eError handling is incorporated to identify and report when campaigns or asset groups with specified names are not found.\u003c/p\u003e\n"]]],[],null,["# Performance Max\n\nRetrieve all performance max campaigns\n--------------------------------------\n\n```gdscript\nfunction getAllPerformanceMaxCampaigns() {\n // AdsApp.performanceMaxCampaigns() will return all campaigns that are not\n // removed by default.\n const performanceMaxCampaignIterator = AdsApp.performanceMaxCampaigns().get();\n console.log(`Total campaigns found : ${performanceMaxCampaignIterator.totalNumEntities()}`);\n return performanceMaxCampaignIterator;\n}\n```\n\n### Usage\n\n```gdscript\nconst performanceMaxCampaigns = getAllPerformanceMaxCampaigns();\n\nfor (const performanceMaxCampaign of performanceMaxCampaigns) {\n\n // Process your campaign.\n}\n```\n\nRetrieve a performance max campaign by its name\n-----------------------------------------------\n\n```gdscript\nfunction getPerformanceMaxCampaignByName(campaignName) {\n const performanceMaxCampaignIterator = AdsApp.performanceMaxCampaigns()\n .withCondition(`campaign.name = \"${campaignName}\"`)\n .get();\n if (!performanceMaxCampaignIterator.hasNext()) {\n throw new Error(`No performance max campaign with name ${campaignName} found.`);\n }\n const performanceMaxCampaign = performanceMaxCampaignIterator.next();\n console.log(`Campaign Name: ${performanceMaxCampaign.getName()}`);\n console.log(`Enabled: ${performanceMaxCampaign.isEnabled()}`);\n console.log(`Bidding strategy: ${performanceMaxCampaign.getBiddingStrategyType()}`);\n console.log(`Ad rotation: ${performanceMaxCampaign.getAdRotationType()}`);\n console.log(`Start date: ${formatDate(performanceMaxCampaign.getStartDate())}`);\n console.log(`End date: ${formatDate(performanceMaxCampaign.getEndDate())}`);\n return performanceMaxCampaign;\n}\n\nfunction formatDate(date) {\n function zeroPad(number) { return Utilities.formatString('%02d', number); }\n return (date == null) ? 'None' : zeroPad(date.year) + zeroPad(date.month) +\n zeroPad(date.day);\n}\n```\n\nRetrieve a performance max campaign's stats\n-------------------------------------------\n\n```gdscript\nfunction getPerformanceMaxCampaignStats(campaignName) {\n const performanceMaxCampaignIterator = AdsApp.performanceMaxCampaigns()\n .withCondition(`campaign.name = \"${campaignName}\"`)\n .get();\n if (!performanceMaxCampaignIterator.hasNext()) {\n throw new Error(`No performance max campaign with name ${campaignName} found.`);\n }\n const performanceMaxCampaign = performanceMaxCampaignIterator.next();\n // Fetch stats for the last month. See the DateRangeLiteral section at\n // https://developers.google.com/adwords/api/docs/guides/awql#formal_grammar\n // for a list of all supported pre-defined date ranges.\n // Note: Reports can also be used to fetch stats. See\n // https://developers.google.com/google-ads/scripts/docs/features/reports\n // for more information.\n var stats = performanceMaxCampaign.getStatsFor('LAST_MONTH');\n console.log(`${performanceMaxCampaign.getName()}, ${stats.getImpressions()} impressions, ` +\n `${stats.getViews()} views`);\n return stats;\n}\n```\n\nPause a performance max campaign\n--------------------------------\n\n```gdscript\nfunction pausePerformanceMaxCampaign(campaignName) {\n const performanceMaxCampaignIterator = AdsApp.performanceMaxCampaigns()\n .withCondition(`campaign.name = \"${campaignName}\"`)\n .get();\n if (performanceMaxCampaignIterator.hasNext()) {\n const performanceMaxCampaign = performanceMaxCampaignIterator.next();\n performanceMaxCampaign.pause();\n }\n}\n```\n\nRetrieve an asset group by its name\n-----------------------------------\n\n```gdscript\nfunction getAssetGroupByName(campaignName, assetGroupName) {\n // Defined above\n const performanceMaxCampaign = getPerformanceMaxCampaignByName(campaignName);\n if (performanceMaxCampaign == null) {\n return null;\n }\n const assetGroupIterator = performanceMaxCampaign.assetGroups()\n .withCondition(`asset_group.name = \"${assetGroupName}\"`)\n .get();\n if (!assetGroupIterator.hasNext()) {\n throw new Error(`No asset group found with name ${assetGroupName}.`);\n }\n return assetGroupIterator.next();\n}\n```\n\nPause an asset group\n--------------------\n\n```gdscript\nfunction pausePerformanceMaxAssetGroup(campaignName, assetGroupName) {\n // Defined above\n const assetGroup = getAssetGroupByName(campaignName, assetGroupName);\n assetGroup.pause();\n console.log(`AssetGroup with name: ${assetGroup.getName()} ` +\n `has paused status: ${assetGroup.isPaused()}`);\n}\n```\n\nRetrieve a specific video for use in an asset group\n---------------------------------------------------\n\n```gdscript\nfunction getVideoByYouTubeId(youTubeVideoId) {\n // You can filter on the YouTubeVideoId if you already have that video in\n // your account to fetch the exact one you want right away.\n const videos = AdsApp.adAssets().assets()\n .withCondition(`asset.type = YOUTUBE_VIDEO AND ` +\n `asset.youtube_video_asset.youtube_video_id = '${youTubeVideoId}'`)\n .get();\n if (videos.hasNext()) {\n return videos.next();\n }\n return null;\n}\n```\n\nAdd a specific video to an asset group\n--------------------------------------\n\n```gdscript\nfunction addVideoToAssetGroup(youTubeVideoId, campaignName, assetGroupName) {\n // Defined above\n const video = getVideoByYouTubeId(youTubeVideoId);\n const assetGroup = getAssetGroupByName(campaignName, assetGroupName);\n assetGroup.addAsset(video, 'YOUTUBE_VIDEO');\n}\n```\n\nRemove a specific video from an asset group\n-------------------------------------------\n\n```gdscript\nfunction removeVideoFromAssetGroup(youTubeVideoId, campaignName, assetGroupName) {\n // Defined above\n const video = getVideoByYouTubeId(youTubeVideoId);\n const assetGroup = getAssetGroupByName(campaignName, assetGroupName);\n assetGroup.removeAsset(video, 'YOUTUBE_VIDEO');\n}\n```"]]