# Platform naming reference

Everything here was checked against the vendor pages in `sources.yaml` on 2026-10-17. Limits, tools and macros change: fetch the live page before quoting a number to a user, and say which page and date you used. Each fact is here because a naming, join or rename decision depends on it.

## Which object sits at which level

The convention names three levels. Map each platform onto them before writing any rule.

- Initiative level. Carries the six-token grammar, maps to `initiative_id` in the registry, and its ID is `utm_id`.
  - Google Ads: campaign.
  - Meta: campaign.
  - LinkedIn: campaign group.
- Targeting level. Who sees the ads and where.
  - Google Ads: ad group (Search, Display, Video, Demand Gen) and asset group (Performance Max).
  - Meta: ad set.
  - LinkedIn: campaign. It holds targeting, budget, bidding, the ad format and the tracking parameters, and inherits the group's objective.
- Ad level.
  - Google Ads: only some ad types have a name (see below). Responsive search ads have none.
  - Meta: ad.
  - LinkedIn: creative, through its optional `name` field.

Meta's API reference uses older object names in its page slugs: the campaign page is `ad-campaign-group`, the ad set page is `ad-campaign` and the ad page is `adgroup`. Read the page heading, not the slug.

## ID formats for joins

Store every platform ID as text, digits only, in staging and in the registry:

- Google Ads: `customer.id` is an `int64` in the API and in the BigQuery transfer's table suffix (`1234567890`). The UI shows it as `123-456-7890`.
- Meta: `account_id` on a campaign and on the ad account is a numeric string. The ad account's own `id` field is the string `act_{ad_account_id}`, as are endpoint paths such as `/act_{ad_account_id}/campaigns`, so tools that copy the account `id` carry the prefix.
- LinkedIn: object `id` fields are longs, but references are URNs: `urn:li:sponsoredAccount:{id}`, `urn:li:sponsoredCampaignGroup:{id}`. Keep the trailing number.
- Meta and LinkedIn IDs are long enough for Excel to round. Excel keeps 15 significant digits and replaces the rest with zeros.

## Google Ads

Limits and rules:

- Campaign name: the API system limits page lists 256 characters. The resource definition says the name is required and must not contain null, line feed or carriage return characters.
- Campaign name uniqueness: the API rejects a name already used by another active or paused campaign (`DUPLICATE_CAMPAIGN_NAME`). Treat a removed campaign's name as reusable, but never for a different meaning.
- Ad group name: the resource definition says fewer than 255 UTF-8 full-width characters; the system limits page says 256 characters. The pages disagree, so the rules template uses 254. Unique within its campaign (`DUPLICATE_ADGROUP_NAME`).
- Asset group name: 1 to 128 characters, unique within its campaign.
- Ad name: immutable once set, does not need to be unique, and only exists for display upload, image, legacy app install, shopping comparison listing, video, video responsive and Demand Gen ads. A wrong ad name cannot be fixed by renaming: record the correct concept and variant in the registry against the ad ID.
- Responsive search ads have no name. Their concept and variant live only in the registry, keyed by ad ID.
- Experiments: applying an experiment by converting it to a new campaign pauses the original and shows the experiment as a regular campaign with the original's budget and dates. The help page says nothing about IDs; the experiment arm is its own campaign, so confirm in the export that spend moved to a different campaign ID. Give it a registry row with `predecessor_id` set to the original and a new launch month.

Tracking:

- ValueTrack has no campaign-name or ad-group-name parameter. ID parameters: `{campaignid}`, `{adgroupid}`, `{creative}`, and `{assetgroupid}` for Performance Max. Other parameters insert text or codes: `{keyword}` the keyword, `{matchtype}` `e`, `p`, `b` or `a`, `{network}` and `{device}` short codes, `{placement}` the site.
- Custom parameters are referenced as `{_name}`, up to 8 per entity, never at account level. Value limits differ between Google pages; see `utm-mapping.md`.
- Auto-tagging gives a linked GA4 property the campaign and ad group names and IDs, in `session_traffic_source_last_click.google_ads_campaign` (`customer_id`, `account_name`, `campaign_id`, `campaign_name`, `ad_group_id`, `ad_group_name`) in the BigQuery export.

Reading names:

- Google's Google Ads MCP server is read-only (developer page checked 2026-10-17). Tools: `list_accessible_customers`, `search` (GAQL) and `get_resource_metadata`. The repository README says that after the OAuth or Streamable HTTP setup, clients list namespaced tools (`customers_list_accessible_customers`, `search_search`, `metadata_get_resource_metadata`), and the prefixes are configurable. Match a tool by its suffix.
- Starting queries, to be checked with `get_resource_metadata` before running:

```sql
SELECT customer.id, campaign.id, campaign.name, campaign.status,
       campaign.advertising_channel_type
FROM campaign

SELECT campaign.id, ad_group.id, ad_group.name, ad_group.status
FROM ad_group

SELECT campaign.id, asset_group.id, asset_group.name, asset_group.status
FROM asset_group

SELECT ad_group.id, ad_group_ad.ad.id, ad_group_ad.ad.name,
       ad_group_ad.ad.type, ad_group_ad.status
FROM ad_group_ad
```

- BigQuery Data Transfer for Google Ads writes each report as a date-partitioned table `p_ads_<Report>_<customer_id>` and a view `ads_<Report>_<customer_id>`. Filter `_DATA_DATE` on the `p_` table so only the needed partitions are read.
- Name history from the transfer: match tables such as Campaign, AdGroup and Ad are snapshotted once a day into the partition for the run date. The transfer page (updated 2026-10-14) says match-table snapshots are not updated for backfills, for days loaded through the refresh window (7 days by default) or by manual runs. Name history therefore starts on the transfer's first scheduled run and has a gap for every failed day. It cannot be rebuilt for earlier periods.
- Rename evidence without snapshots: the `change_event` resource through GAQL, which returns old and new values and `changed_fields` for updates. The date range must be within the past 30 days and the query needs a `LIMIT` of at most 10,000 rows (page updated 2026-10-14). Google says not every change has a change event, so confirm that a rename you know about appears before treating an empty result as "no renames".

Applying renames:

- Google Ads Editor, Edit, Replace text has Match case, Match whole words only, Preserve capitalization and Make changes in duplicate items. The last creates copies and edits those on some tabs. Copies are new objects with new IDs, which breaks the ID join. Leave it unchecked when renaming, try one paused row first, and confirm in the post-build export that object IDs are unchanged.

## Meta

Limits and rules:

- Ad set name: maximum 400 characters, required (Marketing API ad set reference).
- Campaign and ad names: the reference pages state no length limit and say names support emoji. Test a long name in Ads Manager before relying on it.
- Campaign status values: `ACTIVE`, `PAUSED`, `DELETED`, `ARCHIVED`.

Tracking:

- `url_tags` is a field of the ad creative. Macros documented by Meta: `{{campaign.id}}`, `{{adset.id}}`, `{{ad.id}}`, `{{campaign.name}}`, `{{adset.name}}`, `{{ad.name}}`.
- Name values come from a snapshot stored when the object carrying the tags is first published, not from the live name. The guide does not mention renames. ID macros do not have this problem.
- Ads Manager's URL parameter builder may offer more macros. They are not on the developer page; confirm them in a resolved URL before use.

Reading names and rename evidence:

- Meta hosts an Ads MCP server at `https://mcp.facebook.com/ads`. Authentication: OAuth through Facebook Login for Business, a user access token, or a system user token with the Employee role (Admin-role system user tokens cannot access it). The token needs at least `ads_mcp_management` plus `ads_read` or `ads_management`. Grant `ads_read`, not `ads_management`, for this skill. Meta does not document whether that blocks the write tools, so the tool allow-list below still applies.
- Read tools this skill may call: `ads_get_ad_accounts`, `ads_get_ad_entities` (campaigns, ad sets and ads), `ads_get_field_context` (field metadata; call it first), `ads_get_creatives` (where `url_tags` live) and `ads_get_ad_preview`.
- Tools this skill never calls: `ads_create_campaign`, `ads_create_ad_set`, `ads_create_ad`, `ads_create_creative`, `ads_update_entity`, `ads_activate_entity`, `ads_boost_ig_post` and the custom audience create, update and delete tools.
- `ads_boost_ig_post` turns an organic Instagram post into a boosted ad. Boosts create spend whose names nobody typed from the registry; the weekly report catches them as unregistered IDs.
- The ad account activities edge returns change history with `event_type` values including `update_campaign_name`, `update_ad_set_name` and `update_ad_friendly_name`, with `event_time` and `object_id`. It returns one week by default; check the live page for the range parameters before relying on a longer window.

## LinkedIn

Limits and rules (Marketing API pages, docs default `li-lms-2026-10`, header `Linkedin-Version: 202610`):

- Campaign group name: must not exceed 200 bytes when UTF-8 encoded. Bytes, not characters: accented letters count double.
- Campaign name and creative name: no length limit stated. Test before relying on a long name.
- Campaign group `objectiveType` is optional and immutable; campaigns in the group inherit it. Ad format is set per campaign.
- Every ad account gets a default campaign group, flagged `backfilled`. In Enterprise accounts the default group cannot be updated through the API, and for other groups only `name` and `status` can.
- Status values: campaign groups `ACTIVE`, `ARCHIVED`, `CANCELLED` (schema; the search filter spells it `CANCELED`), `DRAFT`, `PAUSED`, `PENDING_DELETION`, `REMOVED`. Campaigns add `COMPLETED` and use `CANCELED`. A `COMPLETED` campaign can be reactivated.
- Marketing version 202511 (`Linkedin-Version: 202511`) sunsets on 16 November 2026. Check the version an integration sends before trusting a field list.

Tracking:

- Tracking parameters are set on a campaign, or on the ad account from version `202608`. A campaign-level change applies to every creative in that campaign, and the ad is not reviewed again. The page does not say which level wins when both are set.
- Dynamic values: `ACCOUNT_ID`, `ACCOUNT_NAME`, `CAMPAIGN_GROUP_ID`, `CAMPAIGN_GROUP_NAME`, `CAMPAIGN_ID`, `CAMPAIGN_NAME`, `CREATIVE_ID`, and `CREATIVE_NAME` from version `202606`. Custom (static) values sit beside them.
- Conversation Ads and Message Ads are not supported.
- Static UTM keys on a creative are kept and the dynamic set is appended. Remove the static ones.
- Whether a name value resolves to the live name or a snapshot after a rename is not documented.

Reading names and rename evidence:

- No official LinkedIn MCP server was found on 2026-10-17. Read through Campaign Manager exports or the Marketing API with the `r_ads` permission, which is read-only. The `VIEWER` account role is read-only even with `rw_ads`.
- Campaign groups and campaigns return `changeAuditStamps` with `created` and `lastModified` times. They say when an object last changed, not what changed: compare names against the previous export to find a rename.
- LinkedIn's API docs are searchable through the Microsoft Learn MCP server at `https://learn.microsoft.com/api/mcp`, which needs no authentication.

## GA4, where names and IDs land

- Parameter values are case sensitive in reports. Default channel definitions are not.
- Default channel rules for manual traffic test the campaign name: Paid Shopping matches `^(.*(([^a-df-z]|^)shop|shopping).*)$` with a paid medium, and Cross-network matches a campaign name containing `cross-network`. The Google Ads rules use ad network type and campaign type instead. With `utm_campaign` set from the registry, platform names only reach these rules if someone tags with a name macro; the vocabulary still avoids the terms (see `grammar-and-vocabulary.md`).
- BigQuery export scopes: `collected_traffic_source` holds the values present on each collected event (`manual_campaign_id` is `utm_id`). `session_traffic_source_last_click` holds the session's last-click attribution across Google Ads (`google_ads_campaign`) and manual campaigns (`manual_campaign.campaign_id`, `campaign_name`, `source`, `medium`, `content` and others). Use the session record for session counts and the event record for URL checks.
