CAT
/MCP
SkillsMCPMarketplacesDigestToolsAdvertise

This week in Claude

Every Monday: Claude Code, Agent SDK, MCP, and the Anthropic platform moves worth your time.

Skills by Category
Frontend DevelopmentBackend & APIsTesting & QASecurityDevOps & CI/CDGit & Pull RequestsDocumentationCode Review & QualityAI & Agent BuildingSkill Development
MCP Servers by Category
Sales & MarketingWeb & Browser AutomationDatabasesAI & LLM ToolsCloud & InfrastructureCommunication & MessagingDeveloper ToolsDesign & CreativeDocuments & KnowledgeSearch & Web Crawling
Marketplaces by Category
AI Agents & OrchestrationLLM IntegrationDevelopment ToolsFrontend & UIBackend & APIsDatabasesTesting & Code QualityDevOps & CloudSecurity & ComplianceGit & Version Control

Cross AI Tools

Discover Claude Code plugins, extensions, and tools. Automatically updated directory of Anthropic Claude AI marketplaces with development tools, productivity plugins, and integrations.

Resources

  • Browse Skills
  • Browse MCP Servers
  • Browse Marketplaces
  • Plugins Reference

Community

  • About
  • Tools
  • Feedback
  • Privacy Policy
  • Advertise

Built for the Claude Code community with Claude Code by @mertduzgun

Independent project, not affiliated with Anthropic

OrbiAds — Google Ad Manager

orbiads/orbiads-gam-mcp
180 toolsHTTPregistry active
Summary

This connects Claude to Google Ad Manager's API so you can programmatically handle campaign operations without switching to the GAM interface. You get tools for creating and updating orders, managing creatives, configuring targeting rules, and pulling reports. Reach for this when you're building workflows that need to orchestrate ad campaigns alongside other business logic, like spinning up seasonal promotions based on inventory data or generating performance summaries that combine GAM metrics with your own analytics. The streamable HTTP transport means you can run it as a remote service rather than installing locally.

CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
Keep your Mac awake
Keep your Mac awake
Keep your Mac awake while Claude Code and 40+ AI agents run. Sleeps when they're idle.
One time payment $9 →
Context.devContext.dev
Context.dev
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →
Make money from your Skills
Make money from your Skills
On Capafy, your Skill runs online 24/7 as an agent product, and you get paid every time someone uses it.
Start earning →
AppSignal
AppSignal
Monitor with ease. Code with confidence.
Start Free Trial →
CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
Keep your Mac awake
Keep your Mac awake
Keep your Mac awake while Claude Code and 40+ AI agents run. Sleeps when they're idle.
One time payment $9 →
Context.devContext.dev
Context.dev
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →
Make money from your Skills
Make money from your Skills
On Capafy, your Skill runs online 24/7 as an agent product, and you get paid every time someone uses it.
Start earning →
AppSignal
AppSignal
Monitor with ease. Code with confidence.
Start Free Trial →

Tools

Public tool metadata for what this MCP can expose to an agent.

80 tools
get_network_infoGet the GAM network configuration for the tenant. Returns the cached network info (network code, display name, ad units). If not initialized, returns None (agent should call switch_network/network_init).1 params

Get the GAM network configuration for the tenant. Returns the cached network info (network code, display name, ad units). If not initialized, returns None (agent should call switch_network/network_init).

Parameters* required
tenant_idstring
switch_networkInitialize or switch the GAM network context for the tenant. Verifies GAM connectivity and caches the network configuration (ad units, etc.). Use this if get_network_info returns None or to refresh the config.1 params

Initialize or switch the GAM network context for the tenant. Verifies GAM connectivity and caches the network configuration (ad units, etc.). Use this if get_network_info returns None or to refresh the config.

Parameters* required
tenant_idstring
list_accessible_networksList all GAM networks accessible with the tenant's credentials. Calls GET /v1/networks using the tenant's OAuth refresh token. Returns network code, display name, currency, and timezone for each.1 params

List all GAM networks accessible with the tenant's credentials. Calls GET /v1/networks using the tenant's OAuth refresh token. Returns network code, display name, currency, and timezone for each.

Parameters* required
tenant_idstring
Firebase tenant UID
list_advertisersList all advertisers in the tenant's GAM network.1 params

List all advertisers in the tenant's GAM network.

Parameters* required
tenant_idstring
get_advertiserGet a single advertiser by its ID.2 params

Get a single advertiser by its ID.

Parameters* required
tenant_idstring
advertiser_idstring
get_agenciesList all Agencies (type=AGENCY) in the GAM network.1 params

List all Agencies (type=AGENCY) in the GAM network.

Parameters* required
tenant_idstring
create_agencyCreate a new Agency company in GAM.4 params

Create a new Agency company in GAM.

Parameters* required
namestring
dry_runboolean
If True (default), returns preview without executing any SOAP calldefault: true
tenant_idstring
confirmation_tokenvalue
Token from a previous dry_run=True call. Required when dry_run=False.
create_advertiserCreate a new Advertiser company in GAM. Checks for an existing advertiser with the same name first. If found, returns the existing one with alreadyExisted=true instead of creating a duplicate.4 params

Create a new Advertiser company in GAM. Checks for an existing advertiser with the same name first. If found, returns the existing one with alreadyExisted=true instead of creating a duplicate.

Parameters* required
namestring
Name of the new advertiser to create in GAM
dry_runboolean
If True (default), returns preview without executing any SOAP calldefault: true
tenant_idstring
confirmation_tokenvalue
Token from a previous dry_run=True call. Required when dry_run=False.
find_advertiserFind an existing advertiser by exact name match in GAM. Searches all advertisers in the network and returns the first one whose name exactly matches the provided string. Returns NOT_FOUND if no match exists. Cost: 0.5 credits (deducted on call — no dry_run required for a search).2 params

Find an existing advertiser by exact name match in GAM. Searches all advertisers in the network and returns the first one whose name exactly matches the provided string. Returns NOT_FOUND if no match exists. Cost: 0.5 credits (deducted on call — no dry_run required for a search).

Parameters* required
namestring
Advertiser name to search for (exact match)
tenant_idstring
find_or_create_advertiserFind an existing advertiser by name, or create it if it doesn't exist. Combines search + creation in a single call. Ideal for end-to-end campaign setup workflows where the advertiser may or may not exist.4 params

Find an existing advertiser by name, or create it if it doesn't exist. Combines search + creation in a single call. Ideal for end-to-end campaign setup workflows where the advertiser may or may not exist.

Parameters* required
namestring
Advertiser name — returns existing if found, creates if missing
dry_runboolean
If True (default), returns preview without executing any SOAP calldefault: true
tenant_idstring
confirmation_tokenvalue
Token from a previous dry_run=True call. Required when dry_run=False.
find_or_create_orderFind an existing order by name for a given advertiser, or create it if missing. Searches orders for the advertiser, returns the first match by name. If no match, creates a new order. Ideal for idempotent campaign setup.5 params

Find an existing order by name for a given advertiser, or create it if missing. Searches orders for the advertiser, returns the first match by name. If no match, creates a new order. Ideal for idempotent campaign setup.

Parameters* required
dry_runboolean
If True (default), returns preview without executing any SOAP calldefault: true
tenant_idstring
order_namestring
Order name — returns existing if found, creates if missing
advertiser_idstring
GAM Advertiser ID
confirmation_tokenvalue
Token from a previous dry_run=True call. Required when dry_run=False.
list_delivering_ordersList all delivering or delivering_slowly orders for a tenant. Queries GAM OrderService for orders with status DELIVERING or DELIVERING_SLOWLY. Returns basic details: id, name, status, start/end dates, advertiserId.1 params

List all delivering or delivering_slowly orders for a tenant. Queries GAM OrderService for orders with status DELIVERING or DELIVERING_SLOWLY. Returns basic details: id, name, status, start/end dates, advertiserId.

Parameters* required
tenant_idstring
Firebase tenant UID
get_orderFetch a single GAM Order by ID. Returns: id, name, status, advertiserId, agencyId, traffickerId, poNumber, notes.2 params

Fetch a single GAM Order by ID. Returns: id, name, status, advertiserId, agencyId, traffickerId, poNumber, notes.

Parameters* required
order_idstring
GAM Order ID
tenant_idstring
Firebase tenant UID
list_ordersList GAM Orders with optional name search and pagination. Returns: items (list of order dicts), total, offset, limit. Each order has: id, name, status, advertiserId, traffickerId, poNumber, notes.4 params

List GAM Orders with optional name search and pagination. Returns: items (list of order dicts), total, offset, limit. Each order has: id, name, status, advertiserId, traffickerId, poNumber, notes.

Parameters* required
qvalue
Optional name search (LIKE match)
limitinteger
Page size (max 200)default: 50
offsetinteger
Pagination offsetdefault: 0
tenant_idstring
Firebase tenant UID
create_orderCreate a new GAM Order. An Order is the container for Line Items. It belongs to an Advertiser. The traffickerId is automatically set to the current authenticated user. When check_existing=True (default), searches for an order with the same name and advertiser before creating....9 params

Create a new GAM Order. An Order is the container for Line Items. It belongs to an Advertiser. The traffickerId is automatically set to the current authenticated user. When check_existing=True (default), searches for an order with the same name and advertiser before creating....

Parameters* required
namestring
Order display name in GAM
notesstring
Optional order notesdefault:
dry_runboolean
If True (default), returns preview without executing any SOAP calldefault: true
agency_idvalue
Optional GAM Agency company ID
po_numberstring
Optional purchase order numberdefault:
tenant_idstring
Firebase tenant UID
advertiser_idinteger
GAM Advertiser company ID
check_existingboolean
If True (default), checks for existing order with same name + advertiser before creatingdefault: true
confirmation_tokenvalue
Token from a previous dry_run=True call. Required when dry_run=False.
archive_orderArchive a GAM Order via performOrderAction(ArchiveOrders). Archiving hides the order and all its line items from active views. The order remains queryable but stops serving. Cannot be undone easily.4 params

Archive a GAM Order via performOrderAction(ArchiveOrders). Archiving hides the order and all its line items from active views. The order remains queryable but stops serving. Cannot be undone easily.

Parameters* required
dry_runboolean
If True (default), returns preview without executing any SOAP calldefault: true
order_idstring
GAM Order ID to archive
tenant_idstring
Firebase tenant UID
confirmation_tokenvalue
Token from a previous dry_run=True call. Required when dry_run=False.
approve_orderApprove a GAM Order (transitions it to APPROVED status). Approving an Order also approves all eligible Line Items within it, allowing them to start delivering when their start date is reached.4 params

Approve a GAM Order (transitions it to APPROVED status). Approving an Order also approves all eligible Line Items within it, allowing them to start delivering when their start date is reached.

Parameters* required
dry_runboolean
If True (default), returns preview without executing any SOAP calldefault: true
order_idstring
GAM Order ID to approve
tenant_idstring
Firebase tenant UID
confirmation_tokenvalue
Token from a previous dry_run=True call. Required when dry_run=False.
verify_order_setupPre-launch verification of an entire Order and all its Line Items. Runs verify_line_item_setup on each LI attached to the order. Returns aggregate pass/fail with per-LI details.2 params

Pre-launch verification of an entire Order and all its Line Items. Runs verify_line_item_setup on each LI attached to the order. Returns aggregate pass/fail with per-LI details.

Parameters* required
order_idstring
GAM Order ID to verify
tenant_idstring
Firebase tenant UID
update_orderUpdate an existing GAM Order. Uses read-modify-write: fetches the order, applies updates, and saves. Supported fields: name, poNumber, notes, traffickerId, startDateTime, endDateTime, totalBudget.5 params

Update an existing GAM Order. Uses read-modify-write: fetches the order, applies updates, and saves. Supported fields: name, poNumber, notes, traffickerId, startDateTime, endDateTime, totalBudget.

Parameters* required
dry_runboolean
If True (default), returns preview without executingdefault: true
updatesobject
Fields to update. Supported: name, poNumber, notes, traffickerId, startDateTime, endDateTime, totalBudget ({currencyCode, microAmount})
order_idstring
GAM Order ID to update
tenant_idstring
Firebase tenant UID
confirmation_tokenvalue
Token from dry_run=True call
get_contactsList GAM contacts, optionally filtered by company. Returns: list of contacts with id, name, companyId, email.2 params

List GAM contacts, optionally filtered by company. Returns: list of contacts with id, name, companyId, email.

Parameters* required
tenant_idstring
Firebase tenant UID
company_idvalue
Optional GAM Company/Advertiser ID to filter by
create_contactCreate a GAM Contact associated with a Company/Advertiser. Contacts can be attached to Orders for billing and communication purposes.8 params

Create a GAM Contact associated with a Company/Advertiser. Contacts can be attached to Orders for billing and communication purposes.

Parameters* required
namestring
Contact full name
emailstring
Contact email address
phonevalue
Optional phone number
titlevalue
Optional job title
dry_runboolean
If True (default), returns preview without executingdefault: true
tenant_idstring
Firebase tenant UID
company_idinteger
GAM Company/Advertiser ID this contact belongs to
confirmation_tokenvalue
Token from dry_run=True call
create_line_itemsCreate Line Items for a deployed job. Requires the job to have targeting configured in Firestore. Creates Line Items (one per Ad Unit).5 params

Create Line Items for a deployed job. Requires the job to have targeting configured in Firestore. Creates Line Items (one per Ad Unit).

Parameters* required
job_idstring
dry_runboolean
If True (default), returns preview without executing any SOAP calldefault: true
tenant_idstring
name_templatevalue
Optional name template for Line Items. Supports tokens: {short_id}, {i}, {prefix}, {advertiser}, {campaign}, {variant}.
confirmation_tokenvalue
Token from a previous dry_run=True call. Required when dry_run=False.
activate_line_itemsActivate all Line Items for a job (PAUSED -> DELIVERING).4 params

Activate all Line Items for a job (PAUSED -> DELIVERING).

Parameters* required
job_idstring
Firestore job document ID
dry_runboolean
If True (default), returns preview without executing any SOAP calldefault: true
tenant_idstring
Firebase tenant UID
confirmation_tokenvalue
Token from a previous dry_run=True call. Required when dry_run=False.
pause_line_itemsPause all Line Items for a job (DELIVERING -> PAUSED).4 params

Pause all Line Items for a job (DELIVERING -> PAUSED).

Parameters* required
job_idstring
Firestore job document ID
dry_runboolean
If True (default), returns preview without executing any SOAP calldefault: true
tenant_idstring
Firebase tenant UID
confirmation_tokenvalue
Token from a previous dry_run=True call. Required when dry_run=False.
get_line_itemGet a single line item by ID.2 params

Get a single line item by ID.

Parameters* required
tenant_idstring
Firebase tenant UID
line_item_idstring
GAM Line Item ID
update_line_itemUpdate a specific Line Item (e.g., changes to targeting, dates, or status).5 params

Update a specific Line Item (e.g., changes to targeting, dates, or status).

Parameters* required
updateobject
Fields to update (all optional). Accepted keys: name (str), start_date_time (ISO str), end_date_time (ISO str | null), priority (int 1-16), cost_per_unit_micro (int), currency_code (str), goal_units (int), delivery_rate_type (EVENLY|FRONTLOADED|AS_FAST_AS_POSSIBLE), line_item_type (STANDARD|SPONSORSHIP|NETWORK|HOUSE|BULK|PRICE_PRIORITY), creative_rotation_type (EVEN|OPTIMIZED|SEQUENTIAL), frequency_cap_impressions (int), frequency_cap_period (PER_DAY|PER_WEEK|PER_MONTH), roadblocking_type (ONE_OR_MORE|ALL_ROADBLOCK|CREATIVE_SET), allow_overbook (bool), primary_goal_units (int), primary_goal_type (str).
dry_runboolean
If True (default), returns preview without executing any SOAP calldefault: true
tenant_idstring
Firebase tenant UID
line_item_idstring
GAM Line Item ID
confirmation_tokenvalue
Token from a previous dry_run=True call. Required when dry_run=False.
list_line_items_by_orderList Line Items belonging to a specific Order. Returns details: id, name, status, stats, goals, etc. Supports pagination via offset and limit parameters.4 params

List Line Items belonging to a specific Order. Returns details: id, name, status, stats, goals, etc. Supports pagination via offset and limit parameters.

Parameters* required
limitinteger
Maximum number of items to return (1–500, default 100)default: 100
offsetinteger
Number of items to skip for pagination (default 0)default: 0
order_idinteger
GAM Order ID
tenant_idstring
Firebase tenant UID
duplicate_line_itemDuplicate a Line Item in Google Ad Manager. Fetches the full line item configuration, creates a copy with ' - Copy' appended to the name, and applies any provided overrides. The duplicate always starts in DRAFT status.5 params

Duplicate a Line Item in Google Ad Manager. Fetches the full line item configuration, creates a copy with ' - Copy' appended to the name, and applies any provided overrides. The duplicate always starts in DRAFT status.

Parameters* required
dry_runboolean
If True (default), returns preview without executing any SOAP calldefault: true
overridesvalue
Optional overrides to apply to the copy (e.g., {name: 'New Name', targeting: {...}})
tenant_idstring
Firebase tenant UID
line_item_idstring
GAM Line Item ID to duplicate
confirmation_tokenvalue
Token from a previous dry_run=True call. Required when dry_run=False.
archive_line_itemArchive a Line Item in Google Ad Manager. GAM does not delete Line Items — archiving removes them from active views. Archived items can still be queried but won't serve ads.4 params

Archive a Line Item in Google Ad Manager. GAM does not delete Line Items — archiving removes them from active views. Archived items can still be queried but won't serve ads.

Parameters* required
dry_runboolean
If True (default), returns preview without executing any SOAP calldefault: true
tenant_idstring
Firebase tenant UID
line_item_idstring
GAM Line Item ID to archive
confirmation_tokenvalue
Token from a previous dry_run=True call. Required when dry_run=False.
verify_line_item_setupPre-launch verification of a Line Item's readiness. Checks: creative associations exist, targeting is set, dates are valid, goal > 0. Returns a pass/fail report with actionable messages.2 params

Pre-launch verification of a Line Item's readiness. Checks: creative associations exist, targeting is set, dates are valid, goal > 0. Returns a pass/fail report with actionable messages.

Parameters* required
tenant_idstring
Firebase tenant UID
line_item_idstring
GAM Line Item ID to verify
approve_line_itemApprove a Line Item in GAM (transitions from DRAFT/NEEDS_CREATIVES to READY). Note: Line Items typically auto-approve when their parent Order is approved. Use this for individual LI approval when needed.4 params

Approve a Line Item in GAM (transitions from DRAFT/NEEDS_CREATIVES to READY). Note: Line Items typically auto-approve when their parent Order is approved. Use this for individual LI approval when needed.

Parameters* required
dry_runboolean
If True (default), returns preview without executing any SOAP calldefault: true
tenant_idstring
Firebase tenant UID
line_item_idstring
GAM Line Item ID to approve
confirmation_tokenvalue
Token from a previous dry_run=True call. Required when dry_run=False.
create_adexchange_line_itemCreate an AdExchange (programmatic) Line Item with floor CPM targeting. currency_code, delivery_rate_type, and creative_rotation_type fall back to tenant delivery defaults (configurable via update_delivery_defaults) when not provided.17 params

Create an AdExchange (programmatic) Line Item with floor CPM targeting. currency_code, delivery_rate_type, and creative_rotation_type fall back to tenant delivery defaults (configurable via update_delivery_defaults) when not provided.

Parameters* required
namestring
Line Item name in GAM
sizesvalue
Creative sizes [{width, height}]. Defaults to 1×1 (BROWSER) or 640×360 (VIDEO_PLAYER).
dry_runboolean
If True (default), returns preview without executing any SOAP calldefault: true
order_idinteger
GAM Order ID
priorityvalue
Line item priority (1-16). Defaults to type default.
tenant_idstring
Firebase tenant UID
ad_unit_idsarray
List of Ad Unit IDs to target
currency_codevalue
ISO currency code. None = use tenant delivery defaults.
environment_typestring
BROWSER or VIDEO_PLAYERdefault: BROWSER
floor_cpm_microsinteger
Floor CPM in micros (e.g. 1000000 = 1.00 EUR)default: 0
roadblocking_typestring
ONE_OR_MORE, ALL_ROADBLOCK, or CREATIVE_SETdefault: ONE_OR_MORE
confirmation_tokenvalue
Token from a previous dry_run=True call. Required when dry_run=False.
delivery_rate_typevalue
EVENLY, FRONTLOADED, or AS_FAST_AS_POSSIBLE. None = use tenant delivery defaults.
frequency_cap_periodstring
PER_DAY, PER_WEEK, PER_MONTH, PER_HOURdefault: PER_DAY
video_max_duration_msinteger
Max video duration in ms (VIDEO_PLAYER only)default: 30000
creative_rotation_typevalue
EVEN, OPTIMIZED, or SEQUENTIAL. None = use tenant delivery defaults.
frequency_cap_impressionsinteger
Max impressions per frequency_cap_period. 0 = no cap.default: 0
create_open_bidding_line_itemCreate an Open Bidding (Exchange Bidding) Line Item with floor CPM. Open Bidding line items use lineItemType=AD_EXCHANGE with a floor CPM. Demand partners bid in real-time above the floor; delivery is not guaranteed.15 params

Create an Open Bidding (Exchange Bidding) Line Item with floor CPM. Open Bidding line items use lineItemType=AD_EXCHANGE with a floor CPM. Demand partners bid in real-time above the floor; delivery is not guaranteed.

Parameters* required
namestring
Line Item name in GAM
sizesvalue
Creative sizes [{width, height}]. Defaults to 1x1.
dry_runboolean
If True (default), returns preview without executing any SOAP calldefault: true
order_idinteger
GAM Order ID
tenant_idstring
Firebase tenant UID
ad_unit_idsarray
List of Ad Unit IDs to target
currency_codestring
ISO currency codedefault: EUR
end_date_timevalue
ISO end datetime. None = unlimited.
allow_overbookboolean
Allow overbooking (default True for RTB)default: true
start_date_timevalue
ISO start datetime. None = immediately.
environment_typestring
BROWSER or VIDEO_PLAYERdefault: BROWSER
floor_cpm_microsinteger
Floor CPM in micros (e.g. 1000000 = 1.00 EUR)default: 0
confirmation_tokenvalue
Token from a previous dry_run=True call. Required when dry_run=False.
frequency_cap_periodstring
PER_DAY, PER_WEEK, PER_MONTH, PER_HOURdefault: PER_DAY
frequency_cap_impressionsinteger
Max impressions per frequency_cap_period. 0 = no cap.default: 0
list_private_dealsList Private Deals (PMP) available in the GAM network. Returns deal IDs, names, types and statuses. Use the returned Id as deal_id when calling create_preferred_deal_line_item. Note: requires a live network — may return UNEXECUTABLE on test networks.2 params

List Private Deals (PMP) available in the GAM network. Returns deal IDs, names, types and statuses. Use the returned Id as deal_id when calling create_preferred_deal_line_item. Note: requires a live network — may return UNEXECUTABLE on test networks.

Parameters* required
tenant_idstring
Firebase tenant UID
status_filtervalue
Filter by status: ACTIVE, INACTIVE, ARCHIVED. None = all.
update_line_item_targetingUpdate targeting on an existing Line Item (custom, geo, day-part targeting). Modifiable post-creation: customTargeting, geoTargeting, dayPartTargeting. Ad unit targeting is locked after line item creation.5 params

Update targeting on an existing Line Item (custom, geo, day-part targeting). Modifiable post-creation: customTargeting, geoTargeting, dayPartTargeting. Ad unit targeting is locked after line item creation.

Parameters* required
dry_runboolean
If True (default), returns preview without executingdefault: true
tenant_idstring
Firebase tenant UID
line_item_idstring
GAM Line Item ID
targeting_fieldsobject
Targeting fields to update. Accepted keys: customTargeting (list of {keyId, valueIds}), customTargetingOperator ('AND'|'OR'), geoTargeting (GAM geo targeting dict), dayPartTargeting (GAM day-part targeting dict). Note: ad unit targeting is NOT modifiable post-creation.
confirmation_tokenvalue
Token from dry_run=True call
create_preferred_deal_line_itemCreate a Preferred Deal (PMP non-guaranteed) Line Item linked to a private deal ID. Requires Deal Manager to be disabled on the network (direct flow). Use list_private_deals to retrieve valid deal IDs before calling this tool. The line item is created with: - lineItemType = PR...16 params

Create a Preferred Deal (PMP non-guaranteed) Line Item linked to a private deal ID. Requires Deal Manager to be disabled on the network (direct flow). Use list_private_deals to retrieve valid deal IDs before calling this tool. The line item is created with: - lineItemType = PR...

Parameters* required
namestring
Line Item name in GAM
sizesvalue
Creative sizes [{width, height}]. Defaults to 1×1.
deal_idinteger
External Deal ID shared by the buyer (from list_private_deals)
dry_runboolean
If True (default), returns preview without executing any SOAP calldefault: true
order_idinteger
GAM Order ID
tenant_idstring
Firebase tenant UID
ad_unit_idsarray
List of Ad Unit IDs to target
currency_codevalue
ISO currency code. None = use tenant delivery defaults.
end_date_timevalue
ISO end datetime. None = unlimited.
start_date_timevalue
ISO start datetime. None = immediately.
environment_typestring
BROWSER or VIDEO_PLAYERdefault: BROWSER
floor_cpm_microsinteger
Floor CPM in micros (e.g. 2000000 = 2.00 EUR)default: 0
confirmation_tokenvalue
Token from a previous dry_run=True call. Required when dry_run=False.
creative_size_typestring
DISPLAY, NATIVE, or VIDEOdefault: DISPLAY
frequency_cap_periodstring
PER_DAY, PER_WEEK, PER_MONTH, PER_HOURdefault: PER_DAY
frequency_cap_impressionsinteger
Max impressions per period. 0 = no cap.default: 0
list_creatives_by_advertiserList all creatives associated with a specific advertiser.2 params

List all creatives associated with a specific advertiser.

Parameters* required
tenant_idstring
Firebase tenant UID
advertiser_idstring
GAM Advertiser ID (numeric string)
upload_creative[DEPRECATED] Upload a standalone image asset to Google Ad Manager. CreativeAssetService is unavailable in the supported GAM SOAP version. Use create_image_creative instead — it uploads and creates the creative in one step.5 params

[DEPRECATED] Upload a standalone image asset to Google Ad Manager. CreativeAssetService is unavailable in the supported GAM SOAP version. Use create_image_creative instead — it uploads and creates the creative in one step.

Parameters* required
namestring
Human-readable name for the creative asset in GAMdefault:
dry_runboolean
If True (default), returns preview without executing any SOAP calldefault: true
file_pathstring
Absolute path to the image file on the server filesystem
tenant_idstring
Firebase tenant UID
confirmation_tokenvalue
Token from a previous dry_run=True call. Required when dry_run=False.
associate_creativeAssociate a creative with a Line Item in Google Ad Manager (create LICA). Links the specified creative to the Line Item so ads can serve. Returns the created LICA ID(s).5 params

Associate a creative with a Line Item in Google Ad Manager (create LICA). Links the specified creative to the Line Item so ads can serve. Returns the created LICA ID(s).

Parameters* required
dry_runboolean
If True (default), returns preview without executing any SOAP calldefault: true
tenant_idstring
Firebase tenant UID
creative_idinteger
GAM Creative / NativeStyle ID
line_item_idinteger
GAM Line Item ID
confirmation_tokenvalue
Token from a previous dry_run=True call. Required when dry_run=False.
update_creativeUpdate a creative in Google Ad Manager (read-modify-write). Modify any property: name, destinationUrl, snippet, tracking URLs, size, status. For tracking: add/replace thirdPartyImpressionTrackingUrls (pixel URLs for IAS, MOAT, DoubleVerify, DCM), thirdPartyClickTrackingUrl (Ht...5 params

Update a creative in Google Ad Manager (read-modify-write). Modify any property: name, destinationUrl, snippet, tracking URLs, size, status. For tracking: add/replace thirdPartyImpressionTrackingUrls (pixel URLs for IAS, MOAT, DoubleVerify, DCM), thirdPartyClickTrackingUrl (Ht...

Parameters* required
dry_runboolean
If True (default), returns preview without executingdefault: true
tenant_idstring
Firebase tenant UID
creative_idinteger
GAM Creative ID
update_fieldsobject
Dictionary of fields to update. Supported keys: name, destinationUrl, snippet, expandedSnippet, vastRedirectUrl, size ({width, height}), status (ACTIVE/INACTIVE), thirdPartyImpressionTrackingUrls (list of pixel URLs — ImageCreative/Html5Creative/ThirdPartyCreative), thirdPartyClickTrackingUrl (string — Html5Creative only), trackingUrls (dict of VAST event → URL list — VideoRedirectCreative only, keys: CREATIVE_VIEW, START, FIRST_QUARTILE, MIDPOINT, THIRD_QUARTILE, COMPLETE, CLICK_TRACKING), isSafeFrameCompatible (bool). Tracking URLs support GAM macros: %%CACHEBUSTER%%, %%CLICK_URL_ESC%%, %%SITE%%.
confirmation_tokenvalue
Token from a previous dry_run=True call
list_creatives_by_line_itemList all creatives associated with a specific line item. Uses LICA service to find associations, then Creative service to fetch details.2 params

List all creatives associated with a specific line item. Uses LICA service to find associations, then Creative service to fetch details.

Parameters* required
tenant_idstring
Firebase tenant UID
line_item_idstring
GAM Line Item ID (numeric string)
get_creativeFetch details for a single creative by ID.2 params

Fetch details for a single creative by ID.

Parameters* required
tenant_idstring
Firebase tenant UID
creative_idstring
GAM Creative ID (numeric string)
get_creative_preview_urlGenerate a GAM creative preview URL for testing on a real site. Opens the specified site with the ad injected for visual verification, without affecting delivery statistics. Perfect for client sign-off.4 params

Generate a GAM creative preview URL for testing on a real site. Opens the specified site with the ad injected for visual verification, without affecting delivery statistics. Perfect for client sign-off.

Parameters* required
site_urlstring
URL of the site to preview the ad on (e.g., https://www.example.com/article)
tenant_idstring
Firebase tenant UID
creative_idstring
GAM Creative ID
line_item_idstring
GAM Line Item ID
get_campaign_preview_linksGenerate preview URLs for multiple Line Item / Creative pairs in one call. Each pair can have its own site_url; falls back to default_site_url. Soft-fail per pair: a failed URL returns {error: ...} instead of failing the whole call. Returns: previewLinks list with label, lineI...3 params

Generate preview URLs for multiple Line Item / Creative pairs in one call. Each pair can have its own site_url; falls back to default_site_url. Soft-fail per pair: a failed URL returns {error: ...} instead of failing the whole call. Returns: previewLinks list with label, lineI...

Parameters* required
tenant_idstring
Firebase tenant UID
default_site_urlstring
Fallback site URL for pairs without their own site_url
li_creative_pairsarray
List of {line_item_id, creative_id, label?, site_url?} pairs
upload_and_associate_creativeUpload a creative image and associate it with a Line Item in one step. Performs three operations in sequence: 1. create_image_creative — uploads image bytes inline + creates the ImageCreative in GAM. 2. create_lica — links the creativeId to the line_item_id so ads can serve. T...10 params

Upload a creative image and associate it with a Line Item in one step. Performs three operations in sequence: 1. create_image_creative — uploads image bytes inline + creates the ImageCreative in GAM. 2. create_lica — links the creativeId to the line_item_id so ads can serve. T...

Parameters* required
namestring
Creative name in GAM. If empty, auto-resolved from the tenant naming convention (creative_template). Macros available: {advertiser}, {format}, {size}, {YYYY}, {MM}, {DD}. Example: 'OrbitAds-IMAGE-300x250-20260304'.default:
widthinteger
Creative width in pixels (e.g. 300)
heightinteger
Creative height in pixels (e.g. 250)
dry_runboolean
If True (default), returns preview without executingdefault: true
file_pathstring
Absolute path to the image file (PNG/JPG/GIF — max 1 MB)
tenant_idstring
Firebase tenant UID
line_item_idinteger
GAM Line Item ID to associate with
advertiser_idinteger
GAM Advertiser ID — required to create the ImageCreative object
destination_urlstring
Click-through URL (e.g. https://www.example.com)default:
confirmation_tokenvalue
Token from a previous dry_run=True call
bulk_upload_creativesUpload multiple creative images with per-file sizes, names and click URLs. REQUIRED per file: file_path, width, height, destination_url. Each file can have its own name/destination_url override. The creative name follows the tenant naming convention (creative_template) if conf...8 params

Upload multiple creative images with per-file sizes, names and click URLs. REQUIRED per file: file_path, width, height, destination_url. Each file can have its own name/destination_url override. The creative name follows the tenant naming convention (creative_template) if conf...

Parameters* required
filesarray
List of creative files to upload. Each entry MUST include: {"file_path": "/abs/path/banner.png", "width": 300, "height": 250, "destination_url": "https://example.com/landing"}. Optional per file: "name" (default: filename stem). REQUIRED: width, height (exact pixel dimensions for GAM inventory forecasting), destination_url (click-through URL — REQUIRED for image creatives). Size limit: PNG/JPG/GIF max 1 MB each.
dry_runboolean
If True (default), returns preview without executingdefault: true
tenant_idstring
Firebase tenant UID
advertiser_idinteger
GAM Advertiser ID for all creatives
line_item_idsvalue
Optional GAM Line Item IDs — each uploaded creative is automatically associated to ALL provided Line Items via LICA. Use for multi-placement campaigns.
destination_urlstring
Default click-through URL for all files (per-file destination_url overrides this). REQUIRED if not provided per-file. Image creatives must have a click-through URL.default:
skip_duplicatesboolean
If True (default), skip upload if a creative with the same name+size already exists for the advertiserdefault: true
confirmation_tokenvalue
Token from a previous dry_run=True call
create_third_party_creativeCreate a ThirdPartyCreative in GAM for external ad tags. Use this for custom HTML/JS tags from third-party ad servers (DV360, TTD, etc.). Distinct from create_html5_creative which is for self-contained HTML5 ads. Supports native third-party impression tracking (IAS, MOAT, DV,...10 params

Create a ThirdPartyCreative in GAM for external ad tags. Use this for custom HTML/JS tags from third-party ad servers (DV360, TTD, etc.). Distinct from create_html5_creative which is for self-contained HTML5 ads. Supports native third-party impression tracking (IAS, MOAT, DV,...

Parameters* required
namestring
Creative name in GAM
widthinteger
Creative width in pixelsdefault: 300
heightinteger
Creative height in pixelsdefault: 250
dry_runboolean
If True (default), returns preview without executingdefault: true
tenant_idstring
Firebase tenant UID
html_snippetstring
Third-party HTML/JS ad tag snippet
advertiser_idinteger
GAM advertiser ID
confirmation_tokenvalue
Token from a previous dry_run=True call
is_safe_frame_compatibleboolean
Whether the creative is SafeFrame compatibledefault: true
third_party_impression_tracking_urlsvalue
Third-party impression pixel URLs (IAS, MOAT, DoubleVerify, DCM Floodlight). Native GAM field — stored on the creative object, not injected in HTML.
create_video_creativeCreate a VAST VideoRedirectCreative in GAM. Supports native video event tracking (VAST pixels) for IAS, MOAT, DoubleVerify, DCM, etc. Use tracking_urls to attach pixels to specific VAST events (impression, quartiles, complete).9 params

Create a VAST VideoRedirectCreative in GAM. Supports native video event tracking (VAST pixels) for IAS, MOAT, DoubleVerify, DCM, etc. Use tracking_urls to attach pixels to specific VAST events (impression, quartiles, complete).

Parameters* required
namestring
Creative name in GAM
widthinteger
Creative width in pixelsdefault: 640
heightinteger
Creative height in pixelsdefault: 360
dry_runboolean
If True (default), returns preview without executing any SOAP calldefault: true
tenant_idstring
Firebase tenant UID
advertiser_idinteger
GAM advertiser ID
tracking_urlsvalue
Native GAM video event tracking — map of ConversionEvent to URL lists. Keys: CREATIVE_VIEW, START, FIRST_QUARTILE, MIDPOINT, THIRD_QUARTILE, COMPLETE, MUTE, UNMUTE, PAUSE, REWIND, FULLSCREEN, CLICK_TRACKING. Example: {"CREATIVE_VIEW": ["https://pixel.ias.com/..."], "COMPLETE": ["https://track.example.com/..."]}
vast_redirect_urlstring
VAST redirect URL for the video creative
confirmation_tokenvalue
Token from a previous dry_run=True call. Required when dry_run=False.
create_html5_creativeCreate an Html5Creative in GAM from an HTML snippet. The HTML content is automatically packaged into a ZIP bundle and uploaded as an Html5Creative (not a ThirdPartyCreative). For 3rd-party tags, use create_third_party_creative instead. IMPORTANT: For HTML5 creatives, the click...8 params

Create an Html5Creative in GAM from an HTML snippet. The HTML content is automatically packaged into a ZIP bundle and uploaded as an Html5Creative (not a ThirdPartyCreative). For 3rd-party tags, use create_third_party_creative instead. IMPORTANT: For HTML5 creatives, the click...

Parameters* required
namestring
Creative name in GAM. Macros available if creative_template is configured: {advertiser}, {format}, {size}, {YYYY}, {MM}, {DD}.
widthinteger
Creative width in pixelsdefault: 300
heightinteger
Creative height in pixelsdefault: 250
dry_runboolean
If True (default), returns preview without executing any SOAP calldefault: true
tenant_idstring
Firebase tenant UID
html_snippetstring
Self-contained HTML5 ad content. The click URL must be hardcoded inside the HTML (destination_url is not applicable for Html5Creative).
advertiser_idinteger
GAM advertiser ID
confirmation_tokenvalue
Token from a previous dry_run=True call. Required when dry_run=False.
upload_html5_zip_creativeUpload a pre-built HTML5 ZIP bundle as an Html5Creative in GAM. Use this when the studio delivers a ready-made ZIP file. For an inline HTML snippet, use create_html5_creative instead. IMPORTANT: The click-through URL must be embedded in the HTML/JS inside the ZIP. There is no...11 params

Upload a pre-built HTML5 ZIP bundle as an Html5Creative in GAM. Use this when the studio delivers a ready-made ZIP file. For an inline HTML snippet, use create_html5_creative instead. IMPORTANT: The click-through URL must be embedded in the HTML/JS inside the ZIP. There is no...

Parameters* required
namestring
Creative name in GAM. If empty, auto-resolved from the tenant naming convention. Macros: {advertiser}, {format}, {size}, {YYYY}, {MM}, {DD}.default:
widthinteger
Creative width in pixels (e.g. 728). Use 1 with force_fluid=True for responsive creatives.
heightinteger
Creative height in pixels (e.g. 90). Use 1 with force_fluid=True for responsive creatives.
dry_runboolean
If True (default), returns preview without executingdefault: true
file_pathstring
Absolute path to the HTML5 ZIP bundle (max 2 MB)
tenant_idstring
Firebase tenant UID
force_fluidboolean
If True, always create as 1×1 fluid regardless of detected size.default: false
advertiser_idinteger
GAM advertiser ID
auto_detect_fluidboolean
If True, analyse index.html in the ZIP for responsive CSS/JS patterns. When detected (vw/vh/%, @media, window.innerWidth), the creative is created as 1×1 fluid (isAspectRatio=True) and can serve at any container size.default: false
confirmation_tokenvalue
Token from a previous dry_run=True call
allow_safeframe_breakoutboolean
If False (default), high-risk SafeFrame breakout patterns (window.top.location, parent.document, document.domain) block the upload. Set True only if the creative intentionally requires parent-frame access (e.g. expandable ads).default: false
compress_image_creativeCompress an oversized image creative to meet GAM's 1 MB limit. Uses PIL/Pillow to progressively reduce JPEG quality via binary search until the output fits within target_kb. GIF files are converted to PNG first. Output: written next to the original as {stem}_compressed.jpg (or...5 params

Compress an oversized image creative to meet GAM's 1 MB limit. Uses PIL/Pillow to progressively reduce JPEG quality via binary search until the output fits within target_kb. GIF files are converted to PNG first. Output: written next to the original as {stem}_compressed.jpg (or...

Parameters* required
dry_runboolean
If True (default), returns estimate without writing the filedefault: true
file_pathstring
Absolute path to PNG or JPG image (GIF will be converted to PNG)
target_kbinteger
Target output size in KB (default 100, max 1000)default: 100
tenant_idstring
Firebase tenant UID
confirmation_tokenvalue
Token from a previous dry_run=True call
get_licas_by_line_itemList all LICA associations (Line Item Creative Associations) for a Line Item. Returns raw LICA objects with id, lineItemId, creativeId, status, and sizes. Use list_creatives_by_line_item to get enriched Creative details instead.2 params

List all LICA associations (Line Item Creative Associations) for a Line Item. Returns raw LICA objects with id, lineItemId, creativeId, status, and sizes. Use list_creatives_by_line_item to get enriched Creative details instead.

Parameters* required
tenant_idstring
Firebase tenant UID
line_item_idstring
GAM Line Item ID (numeric string)
get_licas_batchFetch LICA associations for multiple Line Items in a single batch call. Returns a dict mapping lineItemId (str) to a list of LICA objects. More efficient than calling get_licas_by_line_item repeatedly.2 params

Fetch LICA associations for multiple Line Items in a single batch call. Returns a dict mapping lineItemId (str) to a list of LICA objects. More efficient than calling get_licas_by_line_item repeatedly.

Parameters* required
tenant_idstring
Firebase tenant UID
line_item_idsarray
List of GAM Line Item IDs (numeric strings)
deactivate_licaDeactivate a LICA (Line Item Creative Association) in GAM. Removes the association between a creative and a line item so the creative stops serving on that line item. The LICA can be re-activated later.5 params

Deactivate a LICA (Line Item Creative Association) in GAM. Removes the association between a creative and a line item so the creative stops serving on that line item. The LICA can be re-activated later.

Parameters* required
dry_runboolean
If True (default), returns preview without executingdefault: true
tenant_idstring
Firebase tenant UID
creative_idinteger
GAM Creative / NativeStyle ID
line_item_idinteger
GAM Line Item ID
confirmation_tokenvalue
Token from a previous dry_run=True call
delete_licasDelete LICAs (Line Item Creative Associations) from GAM. Permanently removes creative associations from a line item. Use get_licas_by_line_item to find LICA IDs first. WARNING: This action cannot be undone.5 params

Delete LICAs (Line Item Creative Associations) from GAM. Permanently removes creative associations from a line item. Use get_licas_by_line_item to find LICA IDs first. WARNING: This action cannot be undone.

Parameters* required
dry_runboolean
If True (default), returns preview without executingdefault: true
lica_idsarray
List of LICA IDs to delete
tenant_idstring
Firebase tenant UID
line_item_idstring
GAM Line Item ID
confirmation_tokenvalue
Token from a previous dry_run=True call
create_audio_creativeCreate a VAST AudioCreative in GAM.7 params

Create a VAST AudioCreative in GAM.

Parameters* required
namestring
Creative name in GAM
dry_runboolean
If True (default), returns preview without executing any SOAP calldefault: true
tenant_idstring
Firebase tenant UID
advertiser_idinteger
GAM advertiser ID
duration_millisinteger
Audio duration in millisecondsdefault: 30000
vast_redirect_urlstring
VAST redirect URL for audio
confirmation_tokenvalue
Token from a previous dry_run=True call. Required when dry_run=False.
list_creatives_by_networkSearch all creatives in the GAM network by name. Returns: items (list of creative dicts), total, offset, limit. Each creative has id, name, advertiserId, size, creativeType, status.4 params

Search all creatives in the GAM network by name. Returns: items (list of creative dicts), total, offset, limit. Each creative has id, name, advertiserId, size, creativeType, status.

Parameters* required
qvalue
Optional name search
limitinteger
Page size (max 500)default: 100
offsetinteger
Pagination offsetdefault: 0
tenant_idstring
Firebase tenant UID
archive_creativeArchive (deactivate) a creative in GAM. Archived creatives no longer serve traffic but are not deleted. This action can be reversed by reactivating the creative in GAM UI.4 params

Archive (deactivate) a creative in GAM. Archived creatives no longer serve traffic but are not deleted. This action can be reversed by reactivating the creative in GAM UI.

Parameters* required
dry_runboolean
If True (default), returns preview without executingdefault: true
tenant_idstring
Firebase tenant UID
creative_idinteger
GAM Creative ID to archive
confirmation_tokenvalue
Token from dry_run=True call
list_native_stylesList NativeStyles in the GAM network with optional name filter.4 params

List NativeStyles in the GAM network with optional name filter.

Parameters* required
limitinteger
Max number of results (default 500)default: 500
offsetinteger
Pagination offsetdefault: 0
tenant_idstring
Firebase tenant UID
name_filtervalue
Optional name substring filter
get_native_styleFetch a single NativeStyle by ID, including HTML/CSS snippets and fluid settings.2 params

Fetch a single NativeStyle by ID, including HTML/CSS snippets and fluid settings.

Parameters* required
tenant_idstring
Firebase tenant UID
native_style_idinteger
OrbiAdsStyle ID
update_native_styleUpdate a NativeStyle's HTML, CSS, name, or size settings.10 params

Update a NativeStyle's HTML, CSS, name, or size settings.

Parameters* required
namevalue
New name (optional)
widthvalue
New width in pixels (optional)
heightvalue
New height in pixels (optional)
dry_runboolean
If True (default), returns preview without executingdefault: true
is_fluidvalue
Set fluid flag (optional — omit to keep existing)
tenant_idstring
Firebase tenant UID
css_snippetvalue
New CSS snippet (optional)
html_snippetvalue
New HTML snippet (optional)
native_style_idinteger
OrbiAdsStyle ID to update
confirmation_tokenvalue
Token from a previous dry_run=True call
archive_native_styleArchive a NativeStyle so it stops serving.4 params

Archive a NativeStyle so it stops serving.

Parameters* required
dry_runboolean
If True (default), returns preview without executingdefault: true
tenant_idstring
Firebase tenant UID
native_style_idinteger
OrbiAdsStyle ID to archive
confirmation_tokenvalue
Token from a previous dry_run=True call
create_image_creativeCreate an ImageCreative in GAM from a local image file. Reads the image file and uploads it inline via CreativeService (no separate upload step). Supports standard IAB display sizes (banner, MPU, billboard, etc.). Supported formats: PNG, JPG, GIF, SVG. Supports native third-pa...10 params

Create an ImageCreative in GAM from a local image file. Reads the image file and uploads it inline via CreativeService (no separate upload step). Supports standard IAB display sizes (banner, MPU, billboard, etc.). Supported formats: PNG, JPG, GIF, SVG. Supports native third-pa...

Parameters* required
namestring
Creative display name in GAM
widthinteger
Creative width in pixels (e.g. 300)
heightinteger
Creative height in pixels (e.g. 250)
dry_runboolean
If True (default), returns preview without executingdefault: true
file_pathstring
Absolute path to the image file (PNG/JPG/GIF)
tenant_idstring
Firebase tenant UID
advertiser_idinteger
GAM Advertiser ID
destination_urlvalue
Click-through destination URL
confirmation_tokenvalue
Token from dry_run=True call
third_party_impression_tracking_urlsvalue
Third-party impression pixel URLs (IAS, MOAT, DoubleVerify, DCM Floodlight). Native GAM field — stored on the creative, not injected in HTML. Supports GAM macros: %%CACHEBUSTER%%, %%SITE%%, %%CLICK_URL_ESC%%, etc.
create_html5_creative_from_filesCreate an Html5Creative in GAM from individual files or a pre-built ZIP bundle. Accepts either: - A pre-built ZIP bundle via zip_path, OR - Individual files: html_path (required) + optional css_path + optional image_path When individual files are provided, they are automatical...12 params

Create an Html5Creative in GAM from individual files or a pre-built ZIP bundle. Accepts either: - A pre-built ZIP bundle via zip_path, OR - Individual files: html_path (required) + optional css_path + optional image_path When individual files are provided, they are automatical...

Parameters* required
namestring
Creative display name in GAM
widthinteger
Creative width in pixels (e.g. 300)
heightinteger
Creative height in pixels (e.g. 250)
dry_runboolean
If True (default), returns preview without executingdefault: true
css_pathvalue
Absolute path to the CSS file (optional)
zip_pathvalue
Absolute path to a pre-built HTML5 ZIP bundle
html_pathvalue
Absolute path to the main HTML file
tenant_idstring
Firebase tenant UID
image_pathvalue
Absolute path to the image asset (optional)
advertiser_idinteger
GAM Advertiser ID
destination_urlvalue
Click-through destination URL
confirmation_tokenvalue
Token from dry_run=True call
ensure_classic_native_templateEnsure the Classic Native Template exists for this tenant, creating it if needed. The Classic Native Template is a USER_DEFINED native GAM template with 7 variable slots: - headline (STRING, required) - click_url (URL, required) - main_image (ASSET/IMAGE, required) - body (STR...2 params

Ensure the Classic Native Template exists for this tenant, creating it if needed. The Classic Native Template is a USER_DEFINED native GAM template with 7 variable slots: - headline (STRING, required) - click_url (URL, required) - main_image (ASSET/IMAGE, required) - body (STR...

Parameters* required
tenant_idstring
Firebase tenant UID
force_recreateboolean
If True, create a fresh template even if one is already cacheddefault: false
create_classic_native_creativeCreate a Classic Native creative in GAM (TemplateCreative over the Classic Native Template). This creative type combines a headline, body text, CTA, a main image, and an optional logo into a native ad that renders using the per-tenant Classic Native Template. The Classic Nativ...15 params

Create a Classic Native creative in GAM (TemplateCreative over the Classic Native Template). This creative type combines a headline, body text, CTA, a main image, and an optional logo into a native ad that renders using the per-tenant Classic Native Template. The Classic Nativ...

Parameters* required
bodyvalue
Ad body / description text (optional)
namestring
Creative display name in GAM
widthinteger
Creative width in pixels (e.g. 300)default: 300
heightinteger
Creative height in pixels (e.g. 250)default: 250
dry_runboolean
If True (default), returns preview without executingdefault: true
headlinestring
Ad headline text (required)
click_urlstring
Destination URL when the ad is clicked (required)
logo_pathvalue
Absolute path to the logo image (optional)
tenant_idstring
Firebase tenant UID
sponsored_byvalue
Sponsor label, e.g. 'Acme Corp' (optional)
advertiser_idinteger
GAM Advertiser ID
call_to_actionvalue
CTA label, e.g. 'En savoir plus' (optional)
destination_urlvalue
Click-through URL at the creative level (defaults to click_url)
main_image_pathstring
Absolute path to the main ad image (PNG/JPG/GIF, required)
confirmation_tokenvalue
Token from dry_run=True call
list_creative_templatesList CreativeTemplates in the GAM network with their variable definitions. Returns all USER_DEFINED templates, with full variable metadata per template (label, uniqueName, isRequired, type, defaultValue/mimeTypes).4 params

List CreativeTemplates in the GAM network with their variable definitions. Returns all USER_DEFINED templates, with full variable metadata per template (label, uniqueName, isRequired, type, defaultValue/mimeTypes).

Parameters* required
limitinteger
Max number of templates to return (max 500)default: 500
offsetinteger
Pagination offsetdefault: 0
tenant_idstring
Firebase tenant UID
name_filtervalue
Optional substring filter on template name
get_creative_templateFetch a single CreativeTemplate by ID with all variable definitions and snippet. Returns full template details including all variable slots with their types, default values, required flags, and the raw HTML snippet if present.2 params

Fetch a single CreativeTemplate by ID with all variable definitions and snippet. Returns full template details including all variable slots with their types, default values, required flags, and the raw HTML snippet if present.

Parameters* required
tenant_idstring
Firebase tenant UID
template_idinteger
GAM CreativeTemplate ID
check_delivery_statusCheck the real-time delivery status of a job's line items. Returns the aggregated lifecycle status (DELIVERING, READY, etc.) and per-line-item statuses.2 params

Check the real-time delivery status of a job's line items. Returns the aggregated lifecycle status (DELIVERING, READY, etc.) and per-line-item statuses.

Parameters* required
job_idstring
Firestore job document ID
tenant_idstring
Firebase tenant UID
fetch_delivery_reportFetch a delivery report for the job (Impressions, Clicks, CTR). Returns a list of rows (one per Line Item). Uses Firestore cache when available.2 params

Fetch a delivery report for the job (Impressions, Clicks, CTR). Returns a list of rows (one per Line Item). Uses Firestore cache when available.

Parameters* required
job_idstring
tenant_idstring
run_custom_reportRun a dynamic GAM report with any dimensions and metrics. Costs 0.5 credits. Submits the report job to GAM REST v1 (or SOAP if api='soap'), polls until ready (up to ~100 seconds), then caches and returns results. Response structure: - rows: first 200 rows inline - totalRows: t...8 params

Run a dynamic GAM report with any dimensions and metrics. Costs 0.5 credits. Submits the report job to GAM REST v1 (or SOAP if api='soap'), polls until ready (up to ~100 seconds), then caches and returns results. Response structure: - rows: first 200 rows inline - totalRows: t...

Parameters* required
apistring
Reporting API to use: 'rest' (Interactive Reports, default) or 'soap' (Legacy Reports). REST supports fewer dimensions/metrics but is the modern API. SOAP supports all legacy dimensions (TOTAL_*, MONTH_AND_YEAR, etc.) but will be deprecated.default: rest
filtersvalue
Optional dimension filters. Same format as create_gam_report. Each entry: {"dimension": "DIM_NAME", "values": ["val1", ...]}. Example: [{"dimension": "LINE_ITEM_ID", "values": ["123"]}, {"dimension": "COUNTRY_NAME", "values": ["France", "Germany"]}]
metricsarray
GAM report metrics — any valid string accepted by the API. Common values: AD_SERVER_IMPRESSIONS, AD_SERVER_CLICKS, AD_SERVER_CTR, AD_SERVER_CPM_AND_CPC_REVENUE, TOTAL_FILL_RATE, AD_SERVER_ACTIVE_VIEW_VIEWABLE_IMPRESSIONS_RATE, TOTAL_LINE_ITEM_LEVEL_ALL_REVENUE. Call get_report_metrics for the full catalogue with categories.
end_datestring
YYYY-MM-DD — required only when date_range_type=FIXEDdefault:
tenant_idstring
Firebase tenant UID
dimensionsarray
GAM report dimensions — any valid string accepted by the API. Common values: DATE, LINE_ITEM_NAME, AD_UNIT_NAME, ADVERTISER_NAME, ORDER_NAME, COUNTRY_NAME, DEVICE_CATEGORY_NAME, PLACEMENT_NAME, CREATIVE_SIZE, BROWSER_NAME. Call get_report_dimensions for the full catalogue with categories.
start_datestring
YYYY-MM-DD — required only when date_range_type=FIXEDdefault:
date_range_typestring
Date range: LAST_MONTH (default), LAST_WEEK, LAST_7_DAYS, LAST_30_DAYS, YESTERDAY, TODAY, CURRENT_MONTH, CURRENT_QUARTER, LAST_3_MONTHS, LAST_YEAR, or FIXED (requires start_date + end_date).default: LAST_MONTH
fetch_inventory_reportFetch an inventory report: ad requests, impressions, fill rate per ad unit. Costs 0.5 credits. Defaults to LAST_MONTH if no dates are provided.5 params

Fetch an inventory report: ad requests, impressions, fill rate per ad unit. Costs 0.5 credits. Defaults to LAST_MONTH if no dates are provided.

Parameters* required
apistring
Reporting API to use: 'rest' (Interactive Reports, default) or 'soap' (Legacy Reports). REST supports fewer dimensions/metrics but is the modern API. SOAP supports all legacy dimensions (TOTAL_*, MONTH_AND_YEAR, etc.) but will be deprecated.default: rest
end_datestring
YYYY-MM-DD (omit to use LAST_MONTH)default:
tenant_idstring
Firebase tenant UID
ad_unit_idvalue
Optional GAM Ad Unit ID to filter by
start_datestring
YYYY-MM-DD (omit to use LAST_MONTH)default:
get_report_resultRetrieve a previously cached report result without re-running the report. Free tool — no credit cost. Results expire after 30 days. Returns the full result including ALL rows, summary totals, metadata, and the GAM API resource reference (gamResultRef).2 params

Retrieve a previously cached report result without re-running the report. Free tool — no credit cost. Results expire after 30 days. Returns the full result including ALL rows, summary totals, metadata, and the GAM API resource reference (gamResultRef).

Parameters* required
result_idstring
Result UUID returned by run_custom_report or run_report_from_template. Cached for 30 days.
tenant_idstring
Firebase tenant UID
export_report_csvExport a report as CSV, TSV, XLSX, or XML. Costs 0.5 credits. Uses FIXED date range. For api='rest': returns {csv, rowCount, resultId}. Always CSV format. For api='soap' with text formats (CSV_DUMP, TSV, TSV_EXCEL): returns {csv, rowCount}. CSV string with appropriate delimite...8 params

Export a report as CSV, TSV, XLSX, or XML. Costs 0.5 credits. Uses FIXED date range. For api='rest': returns {csv, rowCount, resultId}. Always CSV format. For api='soap' with text formats (CSV_DUMP, TSV, TSV_EXCEL): returns {csv, rowCount}. CSV string with appropriate delimite...

Parameters* required
apistring
Reporting API to use: 'rest' (default) or 'soap'. REST returns CSV from JSON rows. SOAP supports native export formats (see export_format).default: rest
filtersvalue
Optional dimension filters. Same format as run_custom_report. Each entry: {"dimension": "DIM_NAME", "values": ["val1", ...]}.
metricsarray
GAM metric names
end_datestring
YYYY-MM-DD
tenant_idstring
Firebase tenant UID
dimensionsarray
GAM dimension names
start_datestring
YYYY-MM-DD
export_formatstring
Export format (SOAP only, ignored for REST). Options: CSV_DUMP (default) — machine-readable CSV | TSV — tab-separated values | TSV_EXCEL — TSV formatted for Excel | XLSX — Excel 2007+ binary (returned as base64) | XML — structured XML (returned as base64)default: CSV_DUMP
get_report_dimensionsList all documented GAM report dimensions with category and description. Returns list of {name, category, description, api}. Any valid GAM dimension string can be used in run_custom_report even if not listed here. Categories: time, line_item, order, advertiser, creative, inven...1 params

List all documented GAM report dimensions with category and description. Returns list of {name, category, description, api}. Any valid GAM dimension string can be used in run_custom_report even if not listed here. Categories: time, line_item, order, advertiser, creative, inven...

Parameters* required
apistring
Filter by API: 'rest', 'soap', or 'all' (default)default: all
get_report_metricsList all documented GAM report metrics with category and description. Returns list of {name, category, description, api}. Any valid GAM metric string can be used in run_custom_report even if not listed here. Categories: ad_server, viewability, inventory, total, adsense, adx, p...1 params

List all documented GAM report metrics with category and description. Returns list of {name, category, description, api}. Any valid GAM metric string can be used in run_custom_report even if not listed here. Categories: ad_server, viewability, inventory, total, adsense, adx, p...

Parameters* required
apistring
Filter by API: 'rest', 'soap', or 'all' (default)default: all
get_report_date_rangesList supported relative date range values for date_range_type parameter.

List supported relative date range values for date_range_type parameter.

No parameter schema in public metadata yet.

get_standalone_forecastGet an availability forecast for arbitrary targeting without an existing job. Returns: availableUnits, matchedUnits, deliveredUnits, utilizationPercent, contendingLineItems, recommendation (with riskLevel).8 params

Get an availability forecast for arbitrary targeting without an existing job. Returns: availableUnits, matchedUnits, deliveredUnits, utilizationPercent, contendingLineItems, recommendation (with riskLevel).

Parameters* required
end_datestring
Forecast end datetime (ISO)
tenant_idstring
Firebase tenant UID
key_valuesvalue
Custom targeting key-values [{keyId: int, valueIds: [int]}]
start_datestring
Forecast start datetime (ISO)
ad_unit_idsarray
Target Ad Unit IDs (array)
geo_targetingvalue
GAM geo location IDs e.g. ['2840'] for USA
creative_sizesvalue
Display banner sizes [{width, height}]. None = 1x1 NATIVE (default). Required for accurate display forecast.
primary_goal_unitsvalue
Optional impression goal for recommendation
get_delivery_forecast_by_line_itemGet an availability forecast for an existing Line Item. Returns: availableUnits, forecastUnits, possibleUnits, unitType, lineItemId.2 params

Get an availability forecast for an existing Line Item. Returns: availableUnits, forecastUnits, possibleUnits, unitType, lineItemId.

Parameters* required
tenant_idstring
Firebase tenant UID
line_item_idstring
GAM Line Item ID
list_report_templatesList all saved report templates (built-in + custom). Built-in templates are seeded on first call: - GAM: monthly performance, by advertiser, inventory, viewability - GA4: monthly traffic, performance by country (if GA4 configured) Use run_report_from_template with any template...1 params

List all saved report templates (built-in + custom). Built-in templates are seeded on first call: - GAM: monthly performance, by advertiser, inventory, viewability - GA4: monthly traffic, performance by country (if GA4 configured) Use run_report_from_template with any template...

Parameters* required
tenant_idstring
Firebase tenant UID

OrbiAds — Google Ad Manager MCP

English · Français

OrbiAds Terminal Mockup

MCP Protocol GAM API Version CLI Works with Claude Works with ChatGPT Works with Gemini GLAMA Registry

A skill for Claude, ChatGPT, Gemini, and OpenAI Codex that gives your AI assistant direct access to Google Ad Manager.

→ Get started free at orbiads.com · ★ Star this repo


Two Ways to Connect

OrbiAds offers two integration methods — choose the one that fits your workflow.

Option A: MCP Server (AI agents)

Connect your AI assistant (Claude, ChatGPT, Gemini) to GAM via the hosted MCP endpoint. Conversational, guided, zero-install.

MCP endpoint: https://orbiads.com/mcp

Option B: CLI (terminal & scripts)

A lightweight Python CLI for developers, CI/CD pipelines, and headless automation. Same API, same credits, same guardrails.

pip install orbiads-cli
orbiads auth login
orbiads network info

Comparison

CriteriaMCP ServerCLI
InterfaceAI agent (Claude, ChatGPT, Gemini)Terminal / command line
InstallationURL to paste into agent settingspip install orbiads-cli
AuthenticationOAuth via browser (automatic)OAuth Device Flow (code displayed)
Best forExploration, conversations, guided workflowsScripts, CI/CD, headless automation
Output formatNatural language via the agentJSON or structured table
CreditsSame consumption gridSame consumption grid
OfflineNo — requires internetNo — requires internet
Python requiredNoYes (3.10+)

Both methods share the same backend, credits, and safety guardrails.

CLI Quick Reference

CommandDescription
orbiads auth loginAuthenticate via Google OAuth Device Flow
orbiads auth statusCheck authentication status
orbiads network infoShow current GAM network details
orbiads network listList accessible GAM networks
orbiads orders listList orders in the network
orbiads line-items list --order IDList line items for an order
orbiads creatives listList creatives
orbiads inventory ad-unitsList ad units
orbiads forecast check --ad-unit IDCheck inventory availability
orbiads report run --template IDRun a delivery report

Full command reference: orbiads.com/docs/cli/commands


Installation Guide

OrbiAds offers three integration pathways depending on your environment.

1. Zero-Install MCP Server (ChatGPT, Gemini, Claude Desktop)

Connect your AI assistant to our hosted server using the Model Context Protocol:

  • Claude Desktop: Add this to your claude_desktop_config.json:
    {
      "mcpServers": {
        "orbiads": {
          "type": "http",
          "url": "https://orbiads.com/mcp"
        }
      }
    }
    
  • Gemini / AI Studio: Go to Tools → MCP configuration → Add https://orbiads.com/mcp
  • ChatGPT: Go to Settings → Connectors → Add connector → MCP URL: https://orbiads.com/mcp
  • GLAMA / MCP Registry: Access, test, and connect the server directly in your browser via glama.ai/mcp/servers/OrbiAds/Orbiads-GAM-MCP
  • Other environments (Cursor, Codex, Warp): Add the https://orbiads.com/mcp endpoint to your configuration and copy AGENTS.md to your project root.

2. Claude Code Plugin (Slash Commands)

Add the /adops command set directly into your Claude Code CLI terminal:

claude plugin install orbiads

3. Agent Skills (Structured Workflows)

Install our markdown-based guidelines permanently into Claude Code's memory:

  1. Clone this repository locally.
  2. Run the skill installer:
    ./install.sh skills --copy
    

This copies our 6 consolidated skill files to your ~/.claude/skills/ directory. Claude Code will automatically leverage them to prevent hallucinations and strictly apply the preview-to-execute workflow.

→ Installation guides: Claude · ChatGPT · Gemini · OpenAI Codex


What is OrbiAds?

OrbiAds is a hosted MCP server that connects your AI assistant directly to Google Ad Manager (GAM). Instead of clicking through the GAM interface or writing API scripts, you describe what you want in plain language — OrbiAds handles the API calls, guardrails, and audit trail.

You: "Check inventory availability on the homepage banner for a 300x250 in France next week"
OrbiAds: [runs forecast] → Available: 1.2M impressions. Pressure: low. Safe to traffic.

You: "Create the line item for Renault, €15 CPM, Monday to Friday"
OrbiAds: [applies guardrails] → Preview ready. Confirm to push?

No scripts. No API tokens to manage. No switching tabs.


Who is this for?

  • AdOps managers who traffic campaigns daily and want to move faster without making mistakes
  • Publishers who manage their own GAM network and want AI-assisted workflows
  • Media agencies running multiple GAM accounts who want a consistent, auditable process
  • Developers building AdOps automation on top of Claude, ChatGPT, or Gemini

Supported AI Platforms

PlatformSetup guideMode
Claude (Desktop / claude.ai / Claude Code)docs/install/claude.mdPlugin + MCP remote
ChatGPT (Pro connector)docs/install/chatgpt.mdMCP remote (HTTP)
Geminidocs/install/gemini.mdMCP remote
GLAMA (MCP registry)glama.ai/mcp/servers/OrbiAds/Orbiads-GAM-MCPMCP registry
Cursor / Codex / Warp / otherAGENTS.mdAGENTS.md + MCP wiring

All platforms connect to the same hosted MCP endpoint at https://orbiads.com/mcp.


5 Slash Commands

After installing the plugin, these /adops commands are available directly in Claude Code.

CommandWhat it does
/adops campaignDeploy, preview, pause, rollback — with mandatory forecast gate before any write
/adops auditMulti-dimensional account audit: delivery, inventory, security, creatives, billing
/adops reportCustom reports, delivery queries, CSV export, billing summaries, forecasts
/adops dealPMP deals, private auctions, Marketplace PG/PD proposals
/adops creativeUpload creatives, QA compliance, SSL validation, preview URLs, line item association

What's Inside (MCP Tools & Skills)

The OrbiAds surface maps the Google Ad Manager API into 28 parent tools and 270+ actions, consolidated into 6 core Agent Skills to keep context usage clean.

Click on any domain below to see which tools and capabilities are included:

1. Campaigns & Creative QA (orbiads-campaigns)
  • campaign — Create, update, pause, and rollback campaigns.
  • orders — Create and list orders, contacts, and roles.
  • line_items — Define line item delivery rules, CPMs, and targeting logic.
  • creatives — Upload creatives (images, HTML5, video/audio) and configure native styles.
  • creative_assets — Manage associated image and file assets.
  • creative_qa — Audit click-trackers, perform compliance scans, and validate SSL certificates.
  • creative_wrapper_skill — Manage third-party wrappers and delivery presets.
  • formats — Discover and configure ad creative formats.
  • jobs & gam_jobs — Monitor async campaign compilation and deployment workflows.
2. Inventory & Targeting (orbiads-inventory)
  • inventory — Retrieve ad unit trees, sizes, and generate ads.json manifests.
  • placements — Create, update, and list ad placement groups.
  • targeting — Manage custom targeting keys/values, countries, and categories.
  • audiences — Retrieve and modify first-party audience segments.
  • blueprint — Generate and push structured network inventory blueprints.
3. Reporting & Forecasting (orbiads-reporting)
  • reporting — Run custom reports from templates, check line item delivery, and integrate GA4.
  • preview — Verify inventory coverage and export preview URLs.
  • pql — Run raw PQL database queries.
4. Programmatic Deals (orbiads-deals)
  • deals — Manage PMP deals, private auctions, and marketplace buyers.
  • companies — Manage agency and advertiser company profiles.
5. Network Admin (orbiads-admin)
  • gam_admin — Access advanced fields, network labels, teams, and site records.
  • gam_features — Query active Google Ad Manager beta and system features.
  • network — List accessible networks and switch active network context.
  • settings — Configure default CPMs, pacing, and brand naming templates.
  • tenant_catalog — Access tenant-specific catalogs.
6. Audits & Billing (orbiads-audit)
  • audit_skill — Run automated security, hygiene, and wrapper coverage audits.
  • billing — Fetch credit balances and transaction histories.
  • audit — Search network audit logs.

See docs/tool-matrix/README.md for the complete parity matrix detailing exact costs, writes, and parameters for all 270+ actions.


Safety by Design

Every write action requires explicit confirmation. No campaign goes live by accident.

  • Dry-run mode on all deployment actions — preview before you push
  • Forecast gate before inventory commits — availability verified upfront
  • Audit trail on every action — who did what, when, with what result
  • Credit guard — read operations are always free, writes deduct credits transparently

Quick Start (3 steps)

1. Create your free account

Go to orbiads.com and sign up. You get 5 free credits — no credit card required.

2. Connect Google Ad Manager

From the OrbiAds dashboard, click Connect GAM and authorize with your Google account. OrbiAds uses OAuth — your GAM credentials never leave Google's infrastructure.

3. Configure your AI assistant

Pick your platform and follow the guide:

  • Claude setup →
  • ChatGPT setup →
  • Gemini setup →
  • Other tools (Cursor, Codex, Warp) →

Then start with:

"Connect to my GAM account and show me my active networks"


MCP Server Details

PropertyValue
Endpointhttps://orbiads.com/mcp
Transportstreamable-http (default) · sse
AuthOAuth 2.0 — Google account via OrbiAds
GAM API versionv202605
MCP Protocol2025-03-26

Repository Structure

skills/           ← 27 parent-tool sub-skills + orchestrator (generated from backend)
commands/         ← 5 /adops slash commands for Claude Code
agents/           ← Parallel audit subagents (audit-delivery, audit-inventory, …)
hooks/            ← Claude Code hooks (hooks.json)
cli/              ← OrbiAds CLI package (pip install orbiads-cli)
docs/             ← Installation guides, tool matrix, query library
_docs/            ← Internal: legacy tool mapping, anti-collision rules
.claude-plugin/   ← Claude plugin manifest (plugin.json, marketplace.json)
AGENTS.md         ← Cross-LLM contract for Cursor, Codex, Gemini, Warp, etc.
CLAUDE.md         ← Claude Code project guidance

Skills and the tool matrix are generated from the backend catalogue — do not hand-edit them. See CLAUDE.md for the generated vs. hand-authored breakdown.


Pricing

PlanPriceCredits
TrialFree5 credits (no card)
Starter€39/month50 credits/month
Early Access€29/month ← locked for life50 credits/month
Pack S€29 one-time+50 credits
Pack L€45 one-time+100 credits

Reads are always free. Credits are only consumed on write and deploy operations.

Start free →


License

The contents of this repository — distribution scaffold, skills, agents, workflows, JSON schemas, CLI client, platform integration manifests, documentation, and examples — are released under the MIT License.

The OrbiAds MCP server backend and Cloud Run services that the hosted endpoint at https://orbiads.com/mcp connects to are NOT in this repository and are governed by separate proprietary terms — see terms at orbiads.com.


OrbiAds Brand Logo

Featured
CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
Keep your Mac awake
Keep your Mac awake
Keep your Mac awake while Claude Code and 40+ AI agents run. Sleeps when they're idle.
One time payment $9 →
Context.devContext.dev
Context.dev
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →
Make money from your Skills
Make money from your Skills
On Capafy, your Skill runs online 24/7 as an agent product, and you get paid every time someone uses it.
Start earning →
AppSignal
AppSignal
Monitor with ease. Code with confidence.
Start Free Trial →
Categories
Communication & MessagingAutomation & WorkflowsData & Analytics
Registryactive
TransportHTTP
UpdatedJun 8, 2026
View on GitHub

Related Communication & Messaging MCP Servers

View all →
Microsoft 365 Teams

io.github.mindstone/mcp-server-microsoft-teams

Microsoft 365 Teams via Graph: list chats, read/send messages, list teams/channels, presence.
8
Outlook Email

com.mintmcp/outlook-email

A MCP server for Outlook email that lets you search, read, and draft emails and replies.
8
Resend Email MCP

helbertparanhos/resend-email-mcp

Complete Resend email MCP: full API coverage + debug layer (deliverability, DNS, bounces).
Email Mcp

marlinjai/email-mcp

Unified email MCP server for Gmail, Outlook, iCloud, and IMAP with batch operations
13
Email (IMAP/SMTP)

io.github.mindstone/mcp-server-email-imap

Email IMAP/SMTP MCP server: iCloud, Gmail, Yahoo, Outlook, and custom IMAP providers
8
HTML Email Playbook

io.github.osamahassouna/email-playbook-mcp

Teaches AI to write HTML email that renders in Outlook, Gmail, and Apple Mail. 19 rules, 6 comps.