From ece7997ed888cb47ff26d29711833ed3c495ed3e Mon Sep 17 00:00:00 2001 From: Dan Bunker Date: Fri, 7 Nov 2025 15:58:10 -0800 Subject: [PATCH 01/22] #2060 Add reusable datatypes and examples supporting Paid Media --- ...paid-media-additional-field.example.1.json | 4 + ...paid-media-additional-field.example.2.json | 4 + ...paid-media-additional-field.example.3.json | 4 + ...paid-media-additional-field.example.4.json | 4 + .../paid-media-additional-field.schema.json | 43 +++ .../paid-media-creative.example.1.json | 34 +++ .../paid-media-creative.example.2.json | 24 ++ .../paid-media-creative.example.3.json | 43 +++ .../paid-media-creative.schema.json | 187 +++++++++++++ .../paid-media-targeting.example.1.json | 41 +++ .../paid-media-targeting.example.2.json | 31 +++ .../paid-media-targeting.example.3.json | 18 ++ .../paid-media-targeting.schema.json | 246 ++++++++++++++++++ .../paid-media-url-tracking.example.1.json | 18 ++ .../paid-media-url-tracking.example.2.json | 17 ++ .../paid-media-url-tracking.example.3.json | 13 + .../paid-media-url-tracking.schema.json | 46 ++++ 17 files changed, 777 insertions(+) create mode 100644 components/datatypes/paid-media/paid-media-additional-field.example.1.json create mode 100644 components/datatypes/paid-media/paid-media-additional-field.example.2.json create mode 100644 components/datatypes/paid-media/paid-media-additional-field.example.3.json create mode 100644 components/datatypes/paid-media/paid-media-additional-field.example.4.json create mode 100644 components/datatypes/paid-media/paid-media-additional-field.schema.json create mode 100644 components/datatypes/paid-media/paid-media-creative.example.1.json create mode 100644 components/datatypes/paid-media/paid-media-creative.example.2.json create mode 100644 components/datatypes/paid-media/paid-media-creative.example.3.json create mode 100644 components/datatypes/paid-media/paid-media-creative.schema.json create mode 100644 components/datatypes/paid-media/paid-media-targeting.example.1.json create mode 100644 components/datatypes/paid-media/paid-media-targeting.example.2.json create mode 100644 components/datatypes/paid-media/paid-media-targeting.example.3.json create mode 100644 components/datatypes/paid-media/paid-media-targeting.schema.json create mode 100644 components/datatypes/paid-media/paid-media-url-tracking.example.1.json create mode 100644 components/datatypes/paid-media/paid-media-url-tracking.example.2.json create mode 100644 components/datatypes/paid-media/paid-media-url-tracking.example.3.json create mode 100644 components/datatypes/paid-media/paid-media-url-tracking.schema.json diff --git a/components/datatypes/paid-media/paid-media-additional-field.example.1.json b/components/datatypes/paid-media/paid-media-additional-field.example.1.json new file mode 100644 index 000000000..f54bb1bff --- /dev/null +++ b/components/datatypes/paid-media/paid-media-additional-field.example.1.json @@ -0,0 +1,4 @@ +{ + "xdm:fieldName": "platform_specific_metric", + "xdm:stringValue": "high_engagement" +} diff --git a/components/datatypes/paid-media/paid-media-additional-field.example.2.json b/components/datatypes/paid-media/paid-media-additional-field.example.2.json new file mode 100644 index 000000000..35b9e641e --- /dev/null +++ b/components/datatypes/paid-media/paid-media-additional-field.example.2.json @@ -0,0 +1,4 @@ +{ + "xdm:fieldName": "custom_score", + "xdm:numberValue": 87.5 +} diff --git a/components/datatypes/paid-media/paid-media-additional-field.example.3.json b/components/datatypes/paid-media/paid-media-additional-field.example.3.json new file mode 100644 index 000000000..7c3df7a15 --- /dev/null +++ b/components/datatypes/paid-media/paid-media-additional-field.example.3.json @@ -0,0 +1,4 @@ +{ + "xdm:fieldName": "is_optimized", + "xdm:booleanValue": true +} diff --git a/components/datatypes/paid-media/paid-media-additional-field.example.4.json b/components/datatypes/paid-media/paid-media-additional-field.example.4.json new file mode 100644 index 000000000..326a38dc0 --- /dev/null +++ b/components/datatypes/paid-media/paid-media-additional-field.example.4.json @@ -0,0 +1,4 @@ +{ + "xdm:fieldName": "last_updated", + "xdm:dateValue": "2025-01-15T10:30:00Z" +} diff --git a/components/datatypes/paid-media/paid-media-additional-field.schema.json b/components/datatypes/paid-media/paid-media-additional-field.schema.json new file mode 100644 index 000000000..05451d80d --- /dev/null +++ b/components/datatypes/paid-media/paid-media-additional-field.schema.json @@ -0,0 +1,43 @@ +{ + "meta:license": [ + "Copyright 2025 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "https://ns.adobe.com/xdm/datatypes/paid-media-additional-field", + "title": "Paid Media Additional Field", + "type": "object", + "description": "Flexible field structure for storing platform-specific or custom fields not defined in core schema. Supports multiple value types to accommodate different data types from paid media network APIs.", + "properties": { + "xdm:fieldName": { + "title": "Field Name", + "type": "string", + "description": "Name of the additional field" + }, + "xdm:stringValue": { + "title": "String Value", + "type": "string", + "description": "String value of the field" + }, + "xdm:numberValue": { + "title": "Number Value", + "type": "number", + "description": "Numeric value of the field" + }, + "xdm:booleanValue": { + "title": "Boolean Value", + "type": "boolean", + "description": "Boolean value of the field" + }, + "xdm:dateValue": { + "title": "Date Value", + "type": "string", + "format": "date-time", + "description": "Date/time value of the field" + } + }, + "required": ["xdm:fieldName"], + "meta:status": "experimental" +} diff --git a/components/datatypes/paid-media/paid-media-creative.example.1.json b/components/datatypes/paid-media/paid-media-creative.example.1.json new file mode 100644 index 000000000..c0ab65816 --- /dev/null +++ b/components/datatypes/paid-media/paid-media-creative.example.1.json @@ -0,0 +1,34 @@ +{ + "xdm:creativeID": "creative-12345", + "xdm:creativeType": "image", + "xdm:title": "Summer Sale - 50% Off", + "xdm:body": "Don't miss our biggest sale of the season. Shop now and save big on all summer items.", + "xdm:callToAction": "Shop Now", + "xdm:destinationURL": "https://example.com/summer-sale?utm_source=facebook&utm_campaign=summer2025", + "xdm:displayURL": "https://example.com/summer-sale", + "xdm:trackingURLs": [ + { + "xdm:eventType": "impression", + "xdm:url": "https://tracking.example.com/imp?id=12345" + }, + { + "xdm:eventType": "click", + "xdm:url": "https://tracking.example.com/click?id=12345" + } + ], + "xdm:assets": [ + { + "xdm:assetID": "asset-001", + "xdm:assetType": "image", + "xdm:name": "summer-sale-hero.jpg", + "xdm:url": "https://cdn.example.com/images/summer-sale-hero.jpg", + "xdm:thumbnailURL": "https://cdn.example.com/images/summer-sale-hero-thumb.jpg", + "xdm:dimensions": { + "xdm:width": 1200, + "xdm:height": 628 + }, + "xdm:fileSize": 245760, + "xdm:hash": "a3f5c8d9e2b1f4a6c7d8e9f0a1b2c3d4" + } + ] +} diff --git a/components/datatypes/paid-media/paid-media-creative.example.2.json b/components/datatypes/paid-media/paid-media-creative.example.2.json new file mode 100644 index 000000000..e0e25f0b6 --- /dev/null +++ b/components/datatypes/paid-media/paid-media-creative.example.2.json @@ -0,0 +1,24 @@ +{ + "xdm:creativeID": "creative-67890", + "xdm:creativeType": "video", + "xdm:title": "New Product Launch", + "xdm:body": "Introducing our revolutionary new product. Watch the video to learn more.", + "xdm:callToAction": "Learn More", + "xdm:destinationURL": "https://example.com/new-product", + "xdm:assets": [ + { + "xdm:assetID": "asset-video-001", + "xdm:assetType": "video", + "xdm:name": "product-launch-video.mp4", + "xdm:url": "https://cdn.example.com/videos/product-launch.mp4", + "xdm:thumbnailURL": "https://cdn.example.com/videos/product-launch-thumb.jpg", + "xdm:dimensions": { + "xdm:width": 1920, + "xdm:height": 1080 + }, + "xdm:fileSize": 15728640, + "xdm:duration": 30.5, + "xdm:hash": "b4e6d9f1a2c3e5d7f8a9b0c1d2e3f4a5" + } + ] +} diff --git a/components/datatypes/paid-media/paid-media-creative.example.3.json b/components/datatypes/paid-media/paid-media-creative.example.3.json new file mode 100644 index 000000000..5c8d12f0e --- /dev/null +++ b/components/datatypes/paid-media/paid-media-creative.example.3.json @@ -0,0 +1,43 @@ +{ + "xdm:creativeID": "creative-carousel-001", + "xdm:creativeType": "carousel", + "xdm:title": "Explore Our Collection", + "xdm:body": "Swipe through our latest products and find your favorites.", + "xdm:callToAction": "View Collection", + "xdm:destinationURL": "https://example.com/collection", + "xdm:assets": [ + { + "xdm:assetID": "asset-carousel-001", + "xdm:assetType": "image", + "xdm:name": "product-1.jpg", + "xdm:url": "https://cdn.example.com/carousel/product-1.jpg", + "xdm:dimensions": { + "xdm:width": 1080, + "xdm:height": 1080 + }, + "xdm:fileSize": 180224 + }, + { + "xdm:assetID": "asset-carousel-002", + "xdm:assetType": "image", + "xdm:name": "product-2.jpg", + "xdm:url": "https://cdn.example.com/carousel/product-2.jpg", + "xdm:dimensions": { + "xdm:width": 1080, + "xdm:height": 1080 + }, + "xdm:fileSize": 195584 + }, + { + "xdm:assetID": "asset-carousel-003", + "xdm:assetType": "image", + "xdm:name": "product-3.jpg", + "xdm:url": "https://cdn.example.com/carousel/product-3.jpg", + "xdm:dimensions": { + "xdm:width": 1080, + "xdm:height": 1080 + }, + "xdm:fileSize": 172032 + } + ] +} diff --git a/components/datatypes/paid-media/paid-media-creative.schema.json b/components/datatypes/paid-media/paid-media-creative.schema.json new file mode 100644 index 000000000..d95875bd0 --- /dev/null +++ b/components/datatypes/paid-media/paid-media-creative.schema.json @@ -0,0 +1,187 @@ +{ + "meta:license": [ + "Copyright 2025 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "https://ns.adobe.com/xdm/datatypes/paid-media-creative", + "title": "Paid Media Creative", + "type": "object", + "description": "Data type representing creative assets and content for paid media ads", + "definitions": { + "creative": { + "properties": { + "xdm:creativeID": { + "type": "string", + "title": "Creative ID", + "description": "Unique identifier for the creative" + }, + "xdm:creativeType": { + "type": "string", + "title": "Creative Type", + "description": "Type of creative content", + "enum": [ + "image", + "video", + "carousel", + "collection", + "dynamic", + "text", + "html5", + "playable", + "other" + ], + "meta:enum": { + "image": "Static Image", + "video": "Video", + "carousel": "Carousel/Multi-image", + "collection": "Collection/Catalog", + "dynamic": "Dynamic Creative", + "text": "Text Only", + "html5": "HTML5/Rich Media", + "playable": "Playable Ad", + "other": "Other Creative Type" + } + }, + "xdm:title": { + "type": "string", + "title": "Title", + "description": "Creative title or headline" + }, + "xdm:body": { + "type": "string", + "title": "Body Text", + "description": "Main body text or description" + }, + "xdm:callToAction": { + "type": "string", + "title": "Call to Action", + "description": "Call to action text or type" + }, + "xdm:destinationURL": { + "type": "string", + "format": "uri", + "title": "Destination URL", + "description": "Landing page URL where users are directed" + }, + "xdm:displayURL": { + "type": "string", + "format": "uri", + "title": "Display URL", + "description": "URL displayed in the ad" + }, + "xdm:trackingURLs": { + "type": "array", + "title": "Tracking URLs", + "description": "Third-party tracking URLs", + "items": { + "type": "object", + "properties": { + "xdm:eventType": { + "type": "string", + "title": "Event Type", + "description": "Type of event being tracked (click, impression, conversion)" + }, + "xdm:url": { + "type": "string", + "format": "uri", + "title": "Tracking URL", + "description": "The tracking URL" + } + } + } + }, + "xdm:assets": { + "type": "array", + "title": "Creative Assets", + "description": "Media assets used in the creative", + "items": { + "$ref": "#/definitions/asset" + } + } + } + }, + "asset": { + "properties": { + "xdm:assetID": { + "type": "string", + "title": "Asset ID", + "description": "Unique identifier for the asset" + }, + "xdm:assetType": { + "type": "string", + "title": "Asset Type", + "description": "Type of media asset", + "enum": ["image", "video", "audio", "document", "other"], + "meta:enum": { + "image": "Image", + "video": "Video", + "audio": "Audio", + "document": "Document", + "other": "Other Asset Type" + } + }, + "xdm:name": { + "type": "string", + "title": "Asset Name", + "description": "Name or title of the asset" + }, + "xdm:url": { + "type": "string", + "format": "uri", + "title": "Asset URL", + "description": "URL where the asset can be accessed" + }, + "xdm:thumbnailURL": { + "type": "string", + "format": "uri", + "title": "Thumbnail URL", + "description": "URL for asset thumbnail" + }, + "xdm:dimensions": { + "type": "object", + "title": "Asset Dimensions", + "description": "Dimensions of the asset", + "properties": { + "xdm:width": { + "type": "integer", + "title": "Width", + "description": "Width in pixels", + "minimum": 0 + }, + "xdm:height": { + "type": "integer", + "title": "Height", + "description": "Height in pixels", + "minimum": 0 + } + } + }, + "xdm:fileSize": { + "type": "integer", + "title": "File Size", + "description": "File size in bytes", + "minimum": 0 + }, + "xdm:duration": { + "type": "number", + "title": "Duration", + "description": "Duration in seconds (for video/audio assets)" + }, + "xdm:hash": { + "type": "string", + "title": "Asset Hash", + "description": "Unique hash identifier for the asset content" + } + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/creative" + } + ], + "meta:status": "experimental" +} diff --git a/components/datatypes/paid-media/paid-media-targeting.example.1.json b/components/datatypes/paid-media/paid-media-targeting.example.1.json new file mode 100644 index 000000000..063a8e690 --- /dev/null +++ b/components/datatypes/paid-media/paid-media-targeting.example.1.json @@ -0,0 +1,41 @@ +{ + "xdm:geoTargeting": { + "xdm:countries": ["US", "CA", "GB"], + "xdm:regions": ["California", "New York", "Ontario"], + "xdm:cities": ["San Francisco", "New York", "Toronto"] + }, + "xdm:demographicTargeting": { + "xdm:ageRanges": [ + { + "xdm:minAge": 25, + "xdm:maxAge": 34 + }, + { + "xdm:minAge": 35, + "xdm:maxAge": 44 + } + ], + "xdm:genders": ["all"], + "xdm:languages": ["en-US", "en-CA", "en-GB"] + }, + "xdm:interestTargeting": { + "xdm:interests": ["Technology", "E-commerce", "Fashion"], + "xdm:behaviors": ["Online Shoppers", "Frequent Travelers"], + "xdm:customAudiences": [ + { + "xdm:audienceID": "aud-12345", + "xdm:audienceName": "Website Visitors - Last 30 Days", + "xdm:audienceType": "retargeting" + } + ] + }, + "xdm:deviceTargeting": { + "xdm:deviceTypes": ["mobile", "desktop"], + "xdm:operatingSystems": ["iOS", "Android", "Windows", "macOS"], + "xdm:browsers": ["Chrome", "Safari", "Firefox"] + }, + "xdm:placementTargeting": { + "xdm:placements": ["feed", "stories", "search"], + "xdm:publisherCategories": ["News", "Entertainment", "Technology"] + } +} diff --git a/components/datatypes/paid-media/paid-media-targeting.example.2.json b/components/datatypes/paid-media/paid-media-targeting.example.2.json new file mode 100644 index 000000000..3d3800b4d --- /dev/null +++ b/components/datatypes/paid-media/paid-media-targeting.example.2.json @@ -0,0 +1,31 @@ +{ + "xdm:geoTargeting": { + "xdm:countries": ["US"], + "xdm:radius": { + "xdm:latitude": 37.7749, + "xdm:longitude": -122.4194, + "xdm:radiusKm": 25 + } + }, + "xdm:demographicTargeting": { + "xdm:ageRanges": [ + { + "xdm:minAge": 18, + "xdm:maxAge": 24 + } + ], + "xdm:genders": ["female"] + }, + "xdm:interestTargeting": { + "xdm:customAudiences": [ + { + "xdm:audienceID": "aud-lookalike-001", + "xdm:audienceName": "Lookalike - High Value Customers", + "xdm:audienceType": "lookalike" + } + ] + }, + "xdm:deviceTargeting": { + "xdm:deviceTypes": ["mobile"] + } +} diff --git a/components/datatypes/paid-media/paid-media-targeting.example.3.json b/components/datatypes/paid-media/paid-media-targeting.example.3.json new file mode 100644 index 000000000..1a89e5f4b --- /dev/null +++ b/components/datatypes/paid-media/paid-media-targeting.example.3.json @@ -0,0 +1,18 @@ +{ + "xdm:geoTargeting": { + "xdm:countries": ["DE", "FR", "IT", "ES"], + "xdm:postalCodes": ["10115", "75001", "00100", "28001"] + }, + "xdm:demographicTargeting": { + "xdm:ageRanges": [ + { + "xdm:minAge": 45, + "xdm:maxAge": 65 + } + ], + "xdm:languages": ["de-DE", "fr-FR", "it-IT", "es-ES"] + }, + "xdm:deviceTargeting": { + "xdm:deviceTypes": ["desktop", "tablet"] + } +} diff --git a/components/datatypes/paid-media/paid-media-targeting.schema.json b/components/datatypes/paid-media/paid-media-targeting.schema.json new file mode 100644 index 000000000..8016b905f --- /dev/null +++ b/components/datatypes/paid-media/paid-media-targeting.schema.json @@ -0,0 +1,246 @@ +{ + "meta:license": [ + "Copyright 2025 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "https://ns.adobe.com/xdm/datatypes/paid-media-targeting", + "title": "Paid Media Targeting", + "type": "object", + "description": "Data type representing targeting specifications for paid media campaigns", + "definitions": { + "targeting": { + "properties": { + "xdm:geoTargeting": { + "type": "object", + "title": "Geographic Targeting", + "description": "Geographic targeting specifications", + "properties": { + "xdm:countries": { + "type": "array", + "title": "Countries", + "description": "Targeted countries (ISO country codes)", + "items": { + "type": "string" + } + }, + "xdm:regions": { + "type": "array", + "title": "Regions/States", + "description": "Targeted regions or states", + "items": { + "type": "string" + } + }, + "xdm:cities": { + "type": "array", + "title": "Cities", + "description": "Targeted cities", + "items": { + "type": "string" + } + }, + "xdm:postalCodes": { + "type": "array", + "title": "Postal Codes", + "description": "Targeted postal codes", + "items": { + "type": "string" + } + }, + "xdm:radius": { + "type": "object", + "title": "Radius Targeting", + "description": "Location radius targeting", + "properties": { + "xdm:latitude": { + "type": "number", + "title": "Latitude" + }, + "xdm:longitude": { + "type": "number", + "title": "Longitude" + }, + "xdm:radiusKm": { + "type": "number", + "title": "Radius (km)", + "description": "Radius in kilometers" + } + } + } + } + }, + "xdm:demographicTargeting": { + "type": "object", + "title": "Demographic Targeting", + "description": "Demographic targeting specifications", + "properties": { + "xdm:ageRanges": { + "type": "array", + "title": "Age Ranges", + "description": "Targeted age ranges", + "items": { + "type": "object", + "properties": { + "xdm:minAge": { + "type": "integer", + "title": "Minimum Age" + }, + "xdm:maxAge": { + "type": "integer", + "title": "Maximum Age" + } + } + } + }, + "xdm:genders": { + "type": "array", + "title": "Genders", + "description": "Targeted genders", + "items": { + "type": "string", + "enum": ["male", "female", "all", "unknown"], + "meta:enum": { + "male": "Male", + "female": "Female", + "all": "All Genders", + "unknown": "Unknown/Unspecified" + } + } + }, + "xdm:languages": { + "type": "array", + "title": "Languages", + "description": "Targeted languages (ISO language codes)", + "items": { + "type": "string" + } + } + } + }, + "xdm:interestTargeting": { + "type": "object", + "title": "Interest Targeting", + "description": "Interest and behavior targeting", + "properties": { + "xdm:interests": { + "type": "array", + "title": "Interests", + "description": "Targeted interest categories", + "items": { + "type": "string" + } + }, + "xdm:behaviors": { + "type": "array", + "title": "Behaviors", + "description": "Targeted behaviors", + "items": { + "type": "string" + } + }, + "xdm:customAudiences": { + "type": "array", + "title": "Custom Audiences", + "description": "Custom audience segments", + "items": { + "type": "object", + "properties": { + "xdm:audienceID": { + "type": "string", + "title": "Audience ID" + }, + "xdm:audienceName": { + "type": "string", + "title": "Audience Name" + }, + "xdm:audienceType": { + "type": "string", + "title": "Audience Type", + "enum": ["custom", "lookalike", "retargeting", "similar"], + "meta:enum": { + "custom": "Custom Audience", + "lookalike": "Lookalike Audience", + "retargeting": "Retargeting Audience", + "similar": "Similar Audience" + } + } + } + } + } + } + }, + "xdm:deviceTargeting": { + "type": "object", + "title": "Device Targeting", + "description": "Device and platform targeting", + "properties": { + "xdm:deviceTypes": { + "type": "array", + "title": "Device Types", + "description": "Targeted device types", + "items": { + "type": "string", + "enum": ["desktop", "mobile", "tablet", "tv", "other"], + "meta:enum": { + "desktop": "Desktop", + "mobile": "Mobile", + "tablet": "Tablet", + "tv": "Connected TV", + "other": "Other Device" + } + } + }, + "xdm:operatingSystems": { + "type": "array", + "title": "Operating Systems", + "description": "Targeted operating systems", + "items": { + "type": "string" + } + }, + "xdm:browsers": { + "type": "array", + "title": "Browsers", + "description": "Targeted browsers", + "items": { + "type": "string" + } + } + } + }, + "xdm:placementTargeting": { + "type": "object", + "title": "Placement Targeting", + "description": "Ad placement targeting", + "properties": { + "xdm:placements": { + "type": "array", + "title": "Placements", + "description": "Targeted ad placements", + "items": { + "type": "string" + } + }, + "xdm:publisherCategories": { + "type": "array", + "title": "Publisher Categories", + "description": "Targeted publisher categories", + "items": { + "type": "string" + } + } + } + } + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/targeting" + } + ], + "meta:status": "experimental" +} diff --git a/components/datatypes/paid-media/paid-media-url-tracking.example.1.json b/components/datatypes/paid-media/paid-media-url-tracking.example.1.json new file mode 100644 index 000000000..80e201b2e --- /dev/null +++ b/components/datatypes/paid-media/paid-media-url-tracking.example.1.json @@ -0,0 +1,18 @@ +{ + "xdm:trackingTemplate": "{lpurl}?s_kwcid=AL!{userid}!3!{creative}!{matchtype}!{network}!{keyword}", + "xdm:finalUrlSuffix": "utm_source=google&utm_medium=cpc", + "xdm:customParameters": [ + { + "xdm:key": "campaign_id", + "xdm:value": "{campaignid}" + }, + { + "xdm:key": "adgroup_id", + "xdm:value": "{adgroupid}" + }, + { + "xdm:key": "keyword", + "xdm:value": "{keyword}" + } + ] +} diff --git a/components/datatypes/paid-media/paid-media-url-tracking.example.2.json b/components/datatypes/paid-media/paid-media-url-tracking.example.2.json new file mode 100644 index 000000000..eea92317d --- /dev/null +++ b/components/datatypes/paid-media/paid-media-url-tracking.example.2.json @@ -0,0 +1,17 @@ +{ + "xdm:trackingTemplate": "https://example.com/track?url={lpurl}&campaign={campaignid}", + "xdm:customParameters": [ + { + "xdm:key": "utm_source", + "xdm:value": "facebook" + }, + { + "xdm:key": "utm_campaign", + "xdm:value": "{campaign.name}" + }, + { + "xdm:key": "utm_content", + "xdm:value": "{ad.id}" + } + ] +} diff --git a/components/datatypes/paid-media/paid-media-url-tracking.example.3.json b/components/datatypes/paid-media/paid-media-url-tracking.example.3.json new file mode 100644 index 000000000..18595bcfc --- /dev/null +++ b/components/datatypes/paid-media/paid-media-url-tracking.example.3.json @@ -0,0 +1,13 @@ +{ + "xdm:finalUrlSuffix": "gclid={gclid}&msclkid={msclkid}", + "xdm:customParameters": [ + { + "xdm:key": "source", + "xdm:value": "paid_search" + }, + { + "xdm:key": "placement", + "xdm:value": "{placement}" + } + ] +} diff --git a/components/datatypes/paid-media/paid-media-url-tracking.schema.json b/components/datatypes/paid-media/paid-media-url-tracking.schema.json new file mode 100644 index 000000000..4c31f7096 --- /dev/null +++ b/components/datatypes/paid-media/paid-media-url-tracking.schema.json @@ -0,0 +1,46 @@ +{ + "meta:license": [ + "Copyright 2025 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "https://ns.adobe.com/xdm/datatypes/paid-media-url-tracking", + "title": "Paid Media URL Tracking", + "type": "object", + "description": "URL tracking configuration for paid media campaigns, ad groups, and ads. Captures tracking templates and custom parameters used to track user clicks and conversions.", + "properties": { + "xdm:trackingTemplate": { + "type": "string", + "title": "Tracking URL Template", + "description": "URL tracking template with macros (e.g., {lpurl}?s_kwcid=AL!{userid}!3!{creative})" + }, + "xdm:finalUrlSuffix": { + "type": "string", + "title": "Final URL Suffix", + "description": "Parameters appended to the final URL" + }, + "xdm:customParameters": { + "type": "array", + "title": "Custom URL Parameters", + "description": "Custom tracking parameters configured for the entity", + "items": { + "type": "object", + "properties": { + "xdm:key": { + "type": "string", + "title": "Parameter Key", + "description": "Parameter name (e.g., 'utm_source', 'campaign_id')" + }, + "xdm:value": { + "type": "string", + "title": "Parameter Value", + "description": "Parameter value or macro (e.g., '{campaignid}')" + } + } + } + } + }, + "meta:status": "experimental" +} From 4ac58fcd99d9c339786b13d69da81a2cf4a2e97a Mon Sep 17 00:00:00 2001 From: Dan Bunker Date: Mon, 17 Nov 2025 14:53:26 -0800 Subject: [PATCH 02/22] Add space to description --- .../paid-media/paid-media-additional-field.schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/datatypes/paid-media/paid-media-additional-field.schema.json b/components/datatypes/paid-media/paid-media-additional-field.schema.json index 05451d80d..dcd3ec9e0 100644 --- a/components/datatypes/paid-media/paid-media-additional-field.schema.json +++ b/components/datatypes/paid-media/paid-media-additional-field.schema.json @@ -9,7 +9,7 @@ "$id": "https://ns.adobe.com/xdm/datatypes/paid-media-additional-field", "title": "Paid Media Additional Field", "type": "object", - "description": "Flexible field structure for storing platform-specific or custom fields not defined in core schema. Supports multiple value types to accommodate different data types from paid media network APIs.", + "description": "Flexible field structure for storing platform-specific or custom fields not defined in core schema. Supports multiple value types to accommodate different data types from paid media network APIs.", "properties": { "xdm:fieldName": { "title": "Field Name", From 0463359dd1f79f3735e590d8bf5a811154daf238 Mon Sep 17 00:00:00 2001 From: Dan Bunker Date: Wed, 19 Nov 2025 10:54:50 -0800 Subject: [PATCH 03/22] Switch number types of datatypes to xdm/data/measure refs --- .../paid-media/paid-media-additional-field.example.2.json | 4 +++- .../paid-media/paid-media-additional-field.schema.json | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/components/datatypes/paid-media/paid-media-additional-field.example.2.json b/components/datatypes/paid-media/paid-media-additional-field.example.2.json index 35b9e641e..18925da0c 100644 --- a/components/datatypes/paid-media/paid-media-additional-field.example.2.json +++ b/components/datatypes/paid-media/paid-media-additional-field.example.2.json @@ -1,4 +1,6 @@ { "xdm:fieldName": "custom_score", - "xdm:numberValue": 87.5 + "xdm:numberValue": { + "xdm:value": 87.5 + } } diff --git a/components/datatypes/paid-media/paid-media-additional-field.schema.json b/components/datatypes/paid-media/paid-media-additional-field.schema.json index dcd3ec9e0..c5432757e 100644 --- a/components/datatypes/paid-media/paid-media-additional-field.schema.json +++ b/components/datatypes/paid-media/paid-media-additional-field.schema.json @@ -23,7 +23,7 @@ }, "xdm:numberValue": { "title": "Number Value", - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "description": "Numeric value of the field" }, "xdm:booleanValue": { From 6bec014712ad87ed05ed761f6c3144bcc6ce7484 Mon Sep 17 00:00:00 2001 From: Dan Bunker Date: Wed, 19 Nov 2025 10:54:50 -0800 Subject: [PATCH 04/22] Switch number types of datatypes to xdm/data/measure refs --- components/datatypes/paid-media/paid-media-creative.schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/datatypes/paid-media/paid-media-creative.schema.json b/components/datatypes/paid-media/paid-media-creative.schema.json index d95875bd0..8ff2cc6bf 100644 --- a/components/datatypes/paid-media/paid-media-creative.schema.json +++ b/components/datatypes/paid-media/paid-media-creative.schema.json @@ -166,7 +166,7 @@ "minimum": 0 }, "xdm:duration": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Duration", "description": "Duration in seconds (for video/audio assets)" }, From 9bb2e5e662942fcc34a2c348067496c94141d805 Mon Sep 17 00:00:00 2001 From: Dan Bunker Date: Mon, 10 Nov 2025 11:13:49 -0800 Subject: [PATCH 05/22] Resolve conflicts --- CONTRIBUTING.md | 9 + bin/validate-schemas.js | 354 +++++++++++++ ...paid-media-additional-field.example.1.json | 4 +- ...paid-media-additional-field.example.3.json | 2 +- ...paid-media-additional-field.example.4.json | 4 +- .../paid-media-creative.example.1.json | 30 +- .../paid-media-creative.example.2.json | 43 +- .../paid-media-creative.example.3.json | 77 ++- .../paid-media-creative.schema.json | 5 - .../paid-media-targeting.example.1.json | 104 +++- .../paid-media-targeting.example.2.json | 62 ++- .../paid-media-targeting.example.3.json | 70 ++- .../paid-media-url-tracking.example.1.json | 50 +- .../paid-media-url-tracking.example.2.json | 25 +- .../paid-media-url-tracking.example.3.json | 30 +- ...-paid-media-account-details.example.1.json | 181 +++++++ ...ore-paid-media-account-details.schema.json | 253 ++++++++++ .../core-paid-media-ad-details.example.1.json | 158 ++++++ .../core-paid-media-ad-details.example.2.json | 162 ++++++ .../core-paid-media-ad-details.example.3.json | 166 +++++++ .../core-paid-media-ad-details.schema.json | 338 +++++++++++++ ...-paid-media-adgroup-details.example.1.json | 211 ++++++++ ...ore-paid-media-adgroup-details.schema.json | 323 ++++++++++++ ...re-paid-media-asset-details.example.1.json | 143 ++++++ ...re-paid-media-asset-details.example.2.json | 143 ++++++ ...re-paid-media-asset-details.example.3.json | 241 +++++++++ .../core-paid-media-asset-details.schema.json | 379 ++++++++++++++ ...d-media-attribution-metrics.example.1.json | 187 +++++++ ...paid-media-attribution-metrics.schema.json | 331 +++++++++++++ ...paid-media-campaign-details.example.1.json | 183 +++++++ ...re-paid-media-campaign-details.schema.json | 463 ++++++++++++++++++ ...id-media-conversion-metrics.example.1.json | 126 +++++ ...-paid-media-conversion-metrics.schema.json | 267 ++++++++++ ...ore-paid-media-cost-metrics.example.1.json | 113 +++++ .../core-paid-media-cost-metrics.schema.json | 321 ++++++++++++ ...edia-dimensional-breakdowns.example.1.json | 118 +++++ ...d-media-dimensional-breakdowns.schema.json | 160 ++++++ ...id-media-experience-details.example.1.json | 112 +++++ ...-paid-media-experience-details.schema.json | 315 ++++++++++++ ...paid-media-extended-metrics.example.1.json | 112 +++++ ...re-paid-media-extended-metrics.schema.json | 263 ++++++++++ ...core-paid-media-identifiers.example.1.json | 72 +++ .../core-paid-media-identifiers.schema.json | 255 ++++++++++ .../core-paid-media-metadata.example.1.json | 80 +++ .../core-paid-media-metadata.schema.json | 216 ++++++++ .../core-paid-media-metrics.example.1.json | 120 +++++ .../core-paid-media-metrics.schema.json | 169 +++++++ ...-paid-media-quality-metrics.example.1.json | 75 +++ ...ore-paid-media-quality-metrics.schema.json | 247 ++++++++++ ...re-paid-media-video-metrics.example.1.json | 95 ++++ .../core-paid-media-video-metrics.schema.json | 260 ++++++++++ package.json | 2 + 52 files changed, 8141 insertions(+), 88 deletions(-) create mode 100755 bin/validate-schemas.js create mode 100644 components/fieldgroups/paid-media/core-paid-media-account-details.example.1.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-account-details.schema.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-ad-details.example.1.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-ad-details.example.2.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-ad-details.example.3.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-ad-details.schema.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-adgroup-details.example.1.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-adgroup-details.schema.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-asset-details.example.1.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-asset-details.example.2.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-asset-details.example.3.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-asset-details.schema.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-attribution-metrics.example.1.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-attribution-metrics.schema.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-campaign-details.example.1.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-campaign-details.schema.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-conversion-metrics.example.1.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-conversion-metrics.schema.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-cost-metrics.example.1.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-cost-metrics.schema.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-dimensional-breakdowns.example.1.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-dimensional-breakdowns.schema.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-experience-details.example.1.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-experience-details.schema.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-extended-metrics.example.1.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-extended-metrics.schema.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-identifiers.example.1.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-identifiers.schema.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-metadata.example.1.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-metadata.schema.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-metrics.example.1.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-metrics.schema.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-quality-metrics.example.1.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-quality-metrics.schema.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-video-metrics.example.1.json create mode 100644 components/fieldgroups/paid-media/core-paid-media-video-metrics.schema.json diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5f6ccb26c..74ca321ee 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -404,6 +404,15 @@ Run `npm run lint` before committing. The `lint` command is able to fix some eas `npm lint` uses [Prettier](https://prettier.io), which offers integrations for consistent formatting for many editors and IDEs. +Run `npm run validate` to validate that all example files match their corresponding schemas. The validator: + +- Builds an in-memory map of all local schema files by their `$id` (useful for validating unpublished schemas in PRs) +- Automatically fetches remote/published schemas via HTTP/HTTPS when `$ref` references aren't found locally +- Caches fetched remote schemas to avoid duplicate requests +- Reports validation results including count of remote schemas fetched + +The command validates `components`, `extensions`, and `schemas` directories by default, or you can specify specific directories: `npm run validate components/datatypes/paid-media`. + ### Re-Use and Modularity In order to encourage re-use of definitions and modularity of schema files, avoid putting all property declarations into the root of the schema, instead use a `definitions` object with one sub-key for each semantic unit. Then, at the bottom of your schema definition, `$ref`erence them using the `allOf` construct. diff --git a/bin/validate-schemas.js b/bin/validate-schemas.js new file mode 100755 index 000000000..c571a6ee2 --- /dev/null +++ b/bin/validate-schemas.js @@ -0,0 +1,354 @@ +#!/usr/bin/env node + +const fs = require('fs'); +const path = require('path'); +const https = require('https'); +const http = require('http'); +const Ajv = require('ajv'); + +// Cache for fetched remote schemas +const remoteSchemaCache = new Map(); + +/** + * Fetch a remote schema via HTTP/HTTPS + */ +function fetchRemoteSchema(url) { + return new Promise((resolve, reject) => { + // Check cache first + if (remoteSchemaCache.has(url)) { + return resolve(remoteSchemaCache.get(url)); + } + + const protocol = url.startsWith('https:') ? https : http; + + protocol.get(url, (res) => { + if (res.statusCode !== 200) { + return reject(new Error(`Failed to fetch ${url}: HTTP ${res.statusCode}`)); + } + + let data = ''; + res.on('data', (chunk) => data += chunk); + res.on('end', () => { + try { + const schema = JSON.parse(data); + remoteSchemaCache.set(url, schema); + resolve(schema); + } catch (e) { + reject(new Error(`Failed to parse JSON from ${url}: ${e.message}`)); + } + }); + }).on('error', (e) => { + reject(new Error(`Failed to fetch ${url}: ${e.message}`)); + }); + }); +} + +/** + * Recursively find all JSON files in a directory + */ +function findJsonFiles(dir, fileList = []) { + const files = fs.readdirSync(dir); + + files.forEach(file => { + // Skip .git and docs directories + if (file === '.git' || file === 'docs') { + return; + } + + const filePath = path.join(dir, file); + const stat = fs.statSync(filePath); + + if (stat.isDirectory()) { + findJsonFiles(filePath, fileList); + } else if (file.endsWith('.json')) { + fileList.push(filePath); + } + }); + + return fileList; +} + +/** + * Build a map of $id to schema file paths by searching parent directories + */ +function buildSchemaMap(targetDir, searchRoot) { + const schemaMap = new Map(); + const allFiles = findJsonFiles(searchRoot); + + allFiles.forEach(filePath => { + if (filePath.endsWith('.schema.json')) { + try { + const content = fs.readFileSync(filePath, 'utf8'); + const schema = JSON.parse(content); + + if (schema.$id) { + schemaMap.set(schema.$id, { + path: filePath, + schema: schema + }); + } + } catch (error) { + console.error(`Error reading schema file ${filePath}:`, error.message); + } + } + }); + + return schemaMap; +} + +/** + * Find all example files recursively + */ +function findExampleFiles(dir, fileList = []) { + const files = fs.readdirSync(dir); + + files.forEach(file => { + const filePath = path.join(dir, file); + const stat = fs.statSync(filePath); + + if (stat.isDirectory()) { + findExampleFiles(filePath, fileList); + } else if (file.match(/\.example\.\d+\.json$/)) { + fileList.push(filePath); + } + }); + + return fileList; +} + +/** + * Validate examples against their schemas + */ +async function validateExamples(targetDir, schemaMap) { + const results = { + total: 0, + passed: 0, + failed: 0, + errors: [], + remoteFetches: 0 + }; + + // Find all example files recursively + const examplePaths = findExampleFiles(targetDir); + + for (const examplePath of examplePaths) { + // Find corresponding schema file + const exampleFile = path.basename(examplePath); + const schemaFile = exampleFile.replace(/\.example\.\d+\.json$/, '.schema.json'); + const schemaPath = path.join(path.dirname(examplePath), schemaFile); + + if (!fs.existsSync(schemaPath)) { + results.errors.push({ + file: exampleFile, + error: `Schema file not found: ${schemaFile}` + }); + results.total++; + results.failed++; + continue; + } + + try { + const schema = JSON.parse(fs.readFileSync(schemaPath, 'utf8')); + const example = JSON.parse(fs.readFileSync(examplePath, 'utf8')); + + // Create AJV instance with custom schema loader + const ajv = new Ajv({ + allErrors: true, + verbose: true, + v5: true, + loadSchema: async (uri) => { + // First check if it's in our local schema map + if (schemaMap.has(uri)) { + return schemaMap.get(uri).schema; + } + + // Try to fetch remotely + try { + console.log(` Fetching remote schema: ${uri}`); + results.remoteFetches++; + return await fetchRemoteSchema(uri); + } catch (e) { + throw new Error(`Cannot resolve schema ${uri}: ${e.message}`); + } + } + }); + + // Add all schemas from the map to AJV + schemaMap.forEach((value, key) => { + try { + ajv.addSchema(value.schema, key); + } catch (e) { + // Schema might already be added or have issues + } + }); + + // Compile and validate (use compileAsync to support loadSchema) + let validate; + try { + validate = await ajv.compileAsync(schema); + } catch (compileError) { + results.errors.push({ + file: exampleFile, + error: `Schema compilation error: ${compileError.message}`, + details: compileError + }); + results.total++; + results.failed++; + continue; + } + + const valid = validate(example); + results.total++; + + if (!valid) { + results.failed++; + + // Analyze errors to provide helpful information + const errorDetails = validate.errors.map(err => { + let message = ` - Path: ${err.dataPath || err.instancePath || '(root)'}`; + + if (err.keyword === 'required') { + message += `\n Missing required field: ${err.params.missingProperty}`; + message += `\n Schema path: ${err.schemaPath}`; + } else if (err.keyword === 'additionalProperties') { + message += `\n Additional property not allowed: ${err.params.additionalProperty}`; + message += `\n Schema path: ${err.schemaPath}`; + } else if (err.keyword === 'type') { + message += `\n Expected type: ${err.params.type}, got: ${typeof err.data}`; + if (err.data !== null && typeof err.data === 'object' && !Array.isArray(err.data)) { + message += `\n Actual value keys: ${Object.keys(err.data).slice(0, 5).join(', ')}${Object.keys(err.data).length > 5 ? '...' : ''}`; + } else if (typeof err.data === 'string') { + message += `\n Actual value: "${err.data.substring(0, 50)}${err.data.length > 50 ? '...' : ''}"`; + } + message += `\n Schema path: ${err.schemaPath}`; + } else if (err.keyword === 'enum') { + message += `\n Value "${err.data}" must be one of: ${err.params.allowedValues.join(', ')}`; + message += `\n Schema path: ${err.schemaPath}`; + } else { + message += `\n ${err.keyword}: ${err.message}`; + if (err.params) { + message += `\n Params: ${JSON.stringify(err.params, null, 2)}`; + } + message += `\n Schema path: ${err.schemaPath}`; + } + + return message; + }); + + results.errors.push({ + file: exampleFile, + schema: schemaFile, + errors: errorDetails, + errorCount: validate.errors.length + }); + } else { + results.passed++; + } + + } catch (error) { + results.errors.push({ + file: exampleFile, + error: `Error processing file: ${error.message}` + }); + results.total++; + results.failed++; + } + } + + return results; +} + +/** + * Main function + */ +async function main() { + const args = process.argv.slice(2); + + // Default to validating components, extensions, and schemas directories + const defaultDirs = ['components', 'extensions', 'schemas']; + const targetDirs = args.length > 0 ? args : defaultDirs; + + // Validate that all target directories exist + const validDirs = targetDirs.filter(dir => { + if (!fs.existsSync(dir)) { + console.warn(`Warning: Directory not found: ${dir}`); + return false; + } + return true; + }); + + if (validDirs.length === 0) { + console.error('Error: No valid directories to validate'); + process.exit(1); + } + + console.log(`\n${'='.repeat(80)}`); + console.log(`Validating schemas in: ${validDirs.join(', ')}`); + console.log(`${'='.repeat(80)}\n`); + + // Find the repository root (current directory when run as npm script) + const repoRoot = process.cwd(); + console.log(`Repository root: ${repoRoot}\n`); + + // Build schema map (always search entire repo for schema references) + console.log('Building schema map...'); + const schemaMap = buildSchemaMap(null, repoRoot); + console.log(`Found ${schemaMap.size} schemas\n`); + + // Validate examples in each directory + console.log('Validating examples...\n'); + const allResults = { + total: 0, + passed: 0, + failed: 0, + errors: [], + remoteFetches: 0 + }; + + for (const dir of validDirs) { + const results = await validateExamples(dir, schemaMap); + allResults.total += results.total; + allResults.passed += results.passed; + allResults.failed += results.failed; + allResults.errors.push(...results.errors); + allResults.remoteFetches += results.remoteFetches; + } + + // Print results + console.log(`\n${'='.repeat(80)}`); + console.log('VALIDATION RESULTS'); + console.log(`${'='.repeat(80)}\n`); + console.log(`Total examples: ${allResults.total}`); + console.log(`Passed: ${allResults.passed}`); + console.log(`Failed: ${allResults.failed}`); + if (allResults.remoteFetches > 0) { + console.log(`Remote schemas fetched: ${allResults.remoteFetches}`); + } + console.log(''); + + if (allResults.errors.length > 0) { + console.log(`${'='.repeat(80)}`); + console.log('ERRORS'); + console.log(`${'='.repeat(80)}\n`); + + allResults.errors.forEach((error, index) => { + console.log(`${index + 1}. ${error.file}`); + if (error.schema) { + console.log(` Schema: ${error.schema}`); + } + if (error.error) { + console.log(` Error: ${error.error}`); + } + if (error.errors) { + console.log(` Validation errors (${error.errorCount}):`); + error.errors.forEach(err => console.log(err)); + } + console.log(''); + }); + } + + process.exit(allResults.failed > 0 ? 1 : 0); +} + +main(); + diff --git a/components/datatypes/paid-media/paid-media-additional-field.example.1.json b/components/datatypes/paid-media/paid-media-additional-field.example.1.json index f54bb1bff..bab3648df 100644 --- a/components/datatypes/paid-media/paid-media-additional-field.example.1.json +++ b/components/datatypes/paid-media/paid-media-additional-field.example.1.json @@ -1,4 +1,4 @@ { - "xdm:fieldName": "platform_specific_metric", - "xdm:stringValue": "high_engagement" + "xdm:fieldName": "meta_campaign_objective", + "xdm:stringValue": "OUTCOME_TRAFFIC" } diff --git a/components/datatypes/paid-media/paid-media-additional-field.example.3.json b/components/datatypes/paid-media/paid-media-additional-field.example.3.json index 7c3df7a15..5b6902d98 100644 --- a/components/datatypes/paid-media/paid-media-additional-field.example.3.json +++ b/components/datatypes/paid-media/paid-media-additional-field.example.3.json @@ -1,4 +1,4 @@ { - "xdm:fieldName": "is_optimized", + "xdm:fieldName": "meta_campaign_budget_optimization_enabled", "xdm:booleanValue": true } diff --git a/components/datatypes/paid-media/paid-media-additional-field.example.4.json b/components/datatypes/paid-media/paid-media-additional-field.example.4.json index 326a38dc0..08cacce18 100644 --- a/components/datatypes/paid-media/paid-media-additional-field.example.4.json +++ b/components/datatypes/paid-media/paid-media-additional-field.example.4.json @@ -1,4 +1,4 @@ { - "xdm:fieldName": "last_updated", - "xdm:dateValue": "2025-01-15T10:30:00Z" + "xdm:fieldName": "meta_ad_review_date", + "xdm:dateValue": "2025-11-05T14:30:00Z" } diff --git a/components/datatypes/paid-media/paid-media-creative.example.1.json b/components/datatypes/paid-media/paid-media-creative.example.1.json index c0ab65816..19f63f83b 100644 --- a/components/datatypes/paid-media/paid-media-creative.example.1.json +++ b/components/datatypes/paid-media/paid-media-creative.example.1.json @@ -1,34 +1,38 @@ { - "xdm:creativeID": "creative-12345", + "xdm:creativeID": "creative_img_456789123", "xdm:creativeType": "image", - "xdm:title": "Summer Sale - 50% Off", - "xdm:body": "Don't miss our biggest sale of the season. Shop now and save big on all summer items.", + "xdm:title": "Fall Product Launch - Premium Wireless Headphones", + "xdm:body": "Experience crystal-clear sound with 40-hour battery life. Premium noise cancellation technology meets sleek design. Limited time offer - save 25% on your first order. Free shipping on orders over $50.", "xdm:callToAction": "Shop Now", - "xdm:destinationURL": "https://example.com/summer-sale?utm_source=facebook&utm_campaign=summer2025", - "xdm:displayURL": "https://example.com/summer-sale", + "xdm:destinationURL": "https://shop.acmecorp.com/products/headphones-premium?utm_source=facebook&utm_medium=paid_social&utm_campaign=fall_2025_launch&utm_content=image_ad&fbclid={{ad.id}}", + "xdm:displayURL": "shop.acmecorp.com/headphones-premium", "xdm:trackingURLs": [ { "xdm:eventType": "impression", - "xdm:url": "https://tracking.example.com/imp?id=12345" + "xdm:url": "https://tracking.acmecorp.com/pixel/imp?creative=creative_img_456789123&campaign=23851234567890789&placement=instagram_feed" }, { "xdm:eventType": "click", - "xdm:url": "https://tracking.example.com/click?id=12345" + "xdm:url": "https://tracking.acmecorp.com/pixel/click?creative=creative_img_456789123&campaign=23851234567890789&placement=instagram_feed" + }, + { + "xdm:eventType": "conversion", + "xdm:url": "https://tracking.acmecorp.com/pixel/conv?creative=creative_img_456789123&campaign=23851234567890789&event=purchase" } ], "xdm:assets": [ { - "xdm:assetID": "asset-001", + "xdm:assetID": "asset_img_789123456", "xdm:assetType": "image", - "xdm:name": "summer-sale-hero.jpg", - "xdm:url": "https://cdn.example.com/images/summer-sale-hero.jpg", - "xdm:thumbnailURL": "https://cdn.example.com/images/summer-sale-hero-thumb.jpg", + "xdm:name": "headphones-premium-lifestyle-1200x628.jpg", + "xdm:url": "https://cdn.acmecorp.com/creatives/fall2025/headphones-premium-lifestyle-1200x628.jpg", + "xdm:thumbnailURL": "https://cdn.acmecorp.com/creatives/fall2025/thumbs/headphones-premium-lifestyle-300x157.jpg", "xdm:dimensions": { "xdm:width": 1200, "xdm:height": 628 }, - "xdm:fileSize": 245760, - "xdm:hash": "a3f5c8d9e2b1f4a6c7d8e9f0a1b2c3d4" + "xdm:fileSize": 387456, + "xdm:hash": "f8a3c9d2e5b7f1a4c6d8e9f0a2b3c5d7" } ] } diff --git a/components/datatypes/paid-media/paid-media-creative.example.2.json b/components/datatypes/paid-media/paid-media-creative.example.2.json index e0e25f0b6..c0b49f760 100644 --- a/components/datatypes/paid-media/paid-media-creative.example.2.json +++ b/components/datatypes/paid-media/paid-media-creative.example.2.json @@ -1,24 +1,43 @@ { - "xdm:creativeID": "creative-67890", + "xdm:creativeID": "creative_vid_987654321", "xdm:creativeType": "video", - "xdm:title": "New Product Launch", - "xdm:body": "Introducing our revolutionary new product. Watch the video to learn more.", - "xdm:callToAction": "Learn More", - "xdm:destinationURL": "https://example.com/new-product", + "xdm:title": "Fall Product Launch - See Innovation in Action", + "xdm:body": "Discover the future of audio technology. Our new premium wireless headphones deliver studio-quality sound with industry-leading noise cancellation. Watch our 30-second showcase and experience the difference. Available now with exclusive launch pricing.", + "xdm:callToAction": "Watch Video", + "xdm:destinationURL": "https://shop.acmecorp.com/products/headphones-premium?utm_source=facebook&utm_medium=paid_social&utm_campaign=fall_2025_launch&utm_content=video_ad&fbclid={{ad.id}}", + "xdm:displayURL": "shop.acmecorp.com/headphones-premium", + "xdm:trackingURLs": [ + { + "xdm:eventType": "impression", + "xdm:url": "https://tracking.acmecorp.com/pixel/imp?creative=creative_vid_987654321&campaign=23851234567890789&placement=facebook_feed" + }, + { + "xdm:eventType": "click", + "xdm:url": "https://tracking.acmecorp.com/pixel/click?creative=creative_vid_987654321&campaign=23851234567890789&placement=facebook_feed" + }, + { + "xdm:eventType": "video_view", + "xdm:url": "https://tracking.acmecorp.com/pixel/video?creative=creative_vid_987654321&campaign=23851234567890789&event=3sec_view" + }, + { + "xdm:eventType": "video_complete", + "xdm:url": "https://tracking.acmecorp.com/pixel/video?creative=creative_vid_987654321&campaign=23851234567890789&event=complete" + } + ], "xdm:assets": [ { - "xdm:assetID": "asset-video-001", + "xdm:assetID": "video_987654321012345", "xdm:assetType": "video", - "xdm:name": "product-launch-video.mp4", - "xdm:url": "https://cdn.example.com/videos/product-launch.mp4", - "xdm:thumbnailURL": "https://cdn.example.com/videos/product-launch-thumb.jpg", + "xdm:name": "headphones-premium-showcase-30s-1920x1080.mp4", + "xdm:url": "https://cdn.acmecorp.com/creatives/fall2025/videos/headphones-premium-showcase-30s-1920x1080.mp4", + "xdm:thumbnailURL": "https://cdn.acmecorp.com/creatives/fall2025/videos/thumbs/headphones-premium-showcase-thumb.jpg", "xdm:dimensions": { "xdm:width": 1920, "xdm:height": 1080 }, - "xdm:fileSize": 15728640, - "xdm:duration": 30.5, - "xdm:hash": "b4e6d9f1a2c3e5d7f8a9b0c1d2e3f4a5" + "xdm:fileSize": 24576000, + "xdm:duration": 30.0, + "xdm:hash": "d7f2a9c4e6b8f3a5c7d9e1f0a3b5c7d9" } ] } diff --git a/components/datatypes/paid-media/paid-media-creative.example.3.json b/components/datatypes/paid-media/paid-media-creative.example.3.json index 5c8d12f0e..d181ee874 100644 --- a/components/datatypes/paid-media/paid-media-creative.example.3.json +++ b/components/datatypes/paid-media/paid-media-creative.example.3.json @@ -1,43 +1,86 @@ { - "xdm:creativeID": "creative-carousel-001", + "xdm:creativeID": "creative_car_789456123", "xdm:creativeType": "carousel", - "xdm:title": "Explore Our Collection", - "xdm:body": "Swipe through our latest products and find your favorites.", - "xdm:callToAction": "View Collection", - "xdm:destinationURL": "https://example.com/collection", + "xdm:title": "Explore Our Tech Collection", + "xdm:body": "Swipe through our latest premium tech products. From wireless headphones to smart watches, find everything you need to upgrade your digital lifestyle. Shop the collection and save up to 30%.", + "xdm:callToAction": "Shop Now", + "xdm:destinationURL": "https://shop.acmecorp.com/collections/tech?utm_source=facebook&utm_medium=paid_social&utm_campaign=fall_2025_launch&utm_content=carousel_ad&fbclid={{ad.id}}", + "xdm:displayURL": "shop.acmecorp.com/collections/tech", + "xdm:trackingURLs": [ + { + "xdm:eventType": "impression", + "xdm:url": "https://tracking.acmecorp.com/pixel/imp?creative=creative_car_789456123&campaign=23851234567890789&placement=instagram_feed" + }, + { + "xdm:eventType": "click", + "xdm:url": "https://tracking.acmecorp.com/pixel/click?creative=creative_car_789456123&campaign=23851234567890789&placement=instagram_feed" + } + ], "xdm:assets": [ { - "xdm:assetID": "asset-carousel-001", + "xdm:assetID": "asset_car_001_headphones", + "xdm:assetType": "image", + "xdm:name": "carousel-card-1-headphones-1080x1080.jpg", + "xdm:url": "https://cdn.acmecorp.com/creatives/fall2025/carousel/card-1-headphones-1080x1080.jpg", + "xdm:thumbnailURL": "https://cdn.acmecorp.com/creatives/fall2025/carousel/thumbs/card-1-headphones-300x300.jpg", + "xdm:dimensions": { + "xdm:width": 1080, + "xdm:height": 1080 + }, + "xdm:fileSize": 456789, + "xdm:hash": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6" + }, + { + "xdm:assetID": "asset_car_002_watch", + "xdm:assetType": "image", + "xdm:name": "carousel-card-2-smartwatch-1080x1080.jpg", + "xdm:url": "https://cdn.acmecorp.com/creatives/fall2025/carousel/card-2-smartwatch-1080x1080.jpg", + "xdm:thumbnailURL": "https://cdn.acmecorp.com/creatives/fall2025/carousel/thumbs/card-2-smartwatch-300x300.jpg", + "xdm:dimensions": { + "xdm:width": 1080, + "xdm:height": 1080 + }, + "xdm:fileSize": 423456, + "xdm:hash": "b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7" + }, + { + "xdm:assetID": "asset_car_003_speaker", "xdm:assetType": "image", - "xdm:name": "product-1.jpg", - "xdm:url": "https://cdn.example.com/carousel/product-1.jpg", + "xdm:name": "carousel-card-3-speaker-1080x1080.jpg", + "xdm:url": "https://cdn.acmecorp.com/creatives/fall2025/carousel/card-3-speaker-1080x1080.jpg", + "xdm:thumbnailURL": "https://cdn.acmecorp.com/creatives/fall2025/carousel/thumbs/card-3-speaker-300x300.jpg", "xdm:dimensions": { "xdm:width": 1080, "xdm:height": 1080 }, - "xdm:fileSize": 180224 + "xdm:fileSize": 398765, + "xdm:hash": "c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8" }, { - "xdm:assetID": "asset-carousel-002", + "xdm:assetID": "asset_car_004_charger", "xdm:assetType": "image", - "xdm:name": "product-2.jpg", - "xdm:url": "https://cdn.example.com/carousel/product-2.jpg", + "xdm:name": "carousel-card-4-charger-1080x1080.jpg", + "xdm:url": "https://cdn.acmecorp.com/creatives/fall2025/carousel/card-4-charger-1080x1080.jpg", + "xdm:thumbnailURL": "https://cdn.acmecorp.com/creatives/fall2025/carousel/thumbs/card-4-charger-300x300.jpg", "xdm:dimensions": { "xdm:width": 1080, "xdm:height": 1080 }, - "xdm:fileSize": 195584 + "xdm:fileSize": 367890, + "xdm:hash": "d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9" }, { - "xdm:assetID": "asset-carousel-003", + "xdm:assetID": "asset_car_005_hub", "xdm:assetType": "image", - "xdm:name": "product-3.jpg", - "xdm:url": "https://cdn.example.com/carousel/product-3.jpg", + "xdm:name": "carousel-card-5-hub-1080x1080.jpg", + "xdm:url": "https://cdn.acmecorp.com/creatives/fall2025/carousel/card-5-hub-1080x1080.jpg", + "xdm:thumbnailURL": "https://cdn.acmecorp.com/creatives/fall2025/carousel/thumbs/card-5-hub-300x300.jpg", "xdm:dimensions": { "xdm:width": 1080, "xdm:height": 1080 }, - "xdm:fileSize": 172032 + "xdm:fileSize": 389012, + "xdm:hash": "e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0" } ] } diff --git a/components/datatypes/paid-media/paid-media-creative.schema.json b/components/datatypes/paid-media/paid-media-creative.schema.json index 8ff2cc6bf..bcf45d0d8 100644 --- a/components/datatypes/paid-media/paid-media-creative.schema.json +++ b/components/datatypes/paid-media/paid-media-creative.schema.json @@ -62,13 +62,11 @@ }, "xdm:destinationURL": { "type": "string", - "format": "uri", "title": "Destination URL", "description": "Landing page URL where users are directed" }, "xdm:displayURL": { "type": "string", - "format": "uri", "title": "Display URL", "description": "URL displayed in the ad" }, @@ -86,7 +84,6 @@ }, "xdm:url": { "type": "string", - "format": "uri", "title": "Tracking URL", "description": "The tracking URL" } @@ -130,13 +127,11 @@ }, "xdm:url": { "type": "string", - "format": "uri", "title": "Asset URL", "description": "URL where the asset can be accessed" }, "xdm:thumbnailURL": { "type": "string", - "format": "uri", "title": "Thumbnail URL", "description": "URL for asset thumbnail" }, diff --git a/components/datatypes/paid-media/paid-media-targeting.example.1.json b/components/datatypes/paid-media/paid-media-targeting.example.1.json index 063a8e690..d063ffc31 100644 --- a/components/datatypes/paid-media/paid-media-targeting.example.1.json +++ b/components/datatypes/paid-media/paid-media-targeting.example.1.json @@ -1,8 +1,32 @@ { "xdm:geoTargeting": { - "xdm:countries": ["US", "CA", "GB"], - "xdm:regions": ["California", "New York", "Ontario"], - "xdm:cities": ["San Francisco", "New York", "Toronto"] + "xdm:countries": ["US", "CA"], + "xdm:regions": [ + "California", + "New York", + "Texas", + "Florida", + "Ontario", + "British Columbia" + ], + "xdm:cities": [ + "San Francisco", + "Los Angeles", + "New York", + "Austin", + "Miami", + "Toronto", + "Vancouver" + ], + "xdm:postalCodes": [ + "94105", + "90001", + "10001", + "78701", + "33101", + "M5H", + "V6B" + ] }, "xdm:demographicTargeting": { "xdm:ageRanges": [ @@ -13,29 +37,87 @@ { "xdm:minAge": 35, "xdm:maxAge": 44 + }, + { + "xdm:minAge": 45, + "xdm:maxAge": 54 } ], "xdm:genders": ["all"], - "xdm:languages": ["en-US", "en-CA", "en-GB"] + "xdm:languages": ["en-US", "en-CA", "es-US"] }, "xdm:interestTargeting": { - "xdm:interests": ["Technology", "E-commerce", "Fashion"], - "xdm:behaviors": ["Online Shoppers", "Frequent Travelers"], + "xdm:interests": [ + "Technology", + "Consumer Electronics", + "Audio Equipment", + "Gadgets & Tech News", + "Music", + "Fitness & Wellness", + "Online Shopping", + "Premium Brands" + ], + "xdm:behaviors": [ + "Online Shoppers", + "Engaged Shoppers", + "Early Technology Adopters", + "Premium Product Buyers", + "Mobile Device Users", + "Frequent International Travelers" + ], "xdm:customAudiences": [ { - "xdm:audienceID": "aud-12345", + "xdm:audienceID": "23851234567890111", "xdm:audienceName": "Website Visitors - Last 30 Days", "xdm:audienceType": "retargeting" + }, + { + "xdm:audienceID": "23851234567890222", + "xdm:audienceName": "Product Page Viewers - Headphones", + "xdm:audienceType": "retargeting" + }, + { + "xdm:audienceID": "23851234567890333", + "xdm:audienceName": "Cart Abandoners - Last 14 Days", + "xdm:audienceType": "retargeting" + }, + { + "xdm:audienceID": "23851234567890444", + "xdm:audienceName": "Lookalike - High Value Customers (1%)", + "xdm:audienceType": "lookalike" + }, + { + "xdm:audienceID": "23851234567890555", + "xdm:audienceName": "Email Subscribers - Tech Enthusiasts", + "xdm:audienceType": "custom" } ] }, "xdm:deviceTargeting": { - "xdm:deviceTypes": ["mobile", "desktop"], + "xdm:deviceTypes": ["mobile", "desktop", "tablet"], "xdm:operatingSystems": ["iOS", "Android", "Windows", "macOS"], - "xdm:browsers": ["Chrome", "Safari", "Firefox"] + "xdm:browsers": ["Chrome", "Safari", "Firefox", "Edge", "Samsung Internet"] }, "xdm:placementTargeting": { - "xdm:placements": ["feed", "stories", "search"], - "xdm:publisherCategories": ["News", "Entertainment", "Technology"] + "xdm:placements": [ + "facebook_feed", + "instagram_feed", + "instagram_stories", + "instagram_reels", + "facebook_marketplace", + "facebook_video_feeds", + "facebook_right_column", + "messenger_inbox", + "messenger_stories", + "audience_network" + ], + "xdm:publisherCategories": [ + "Technology & Computing", + "Consumer Electronics", + "Music & Audio", + "Lifestyle", + "Entertainment", + "News & Media" + ] } } diff --git a/components/datatypes/paid-media/paid-media-targeting.example.2.json b/components/datatypes/paid-media/paid-media-targeting.example.2.json index 3d3800b4d..208ee63f8 100644 --- a/components/datatypes/paid-media/paid-media-targeting.example.2.json +++ b/components/datatypes/paid-media/paid-media-targeting.example.2.json @@ -1,10 +1,18 @@ { "xdm:geoTargeting": { "xdm:countries": ["US"], + "xdm:regions": ["California"], + "xdm:cities": [ + "San Francisco", + "Oakland", + "San Jose", + "Berkeley", + "Palo Alto" + ], "xdm:radius": { "xdm:latitude": 37.7749, "xdm:longitude": -122.4194, - "xdm:radiusKm": 25 + "xdm:radiusKm": 40 } }, "xdm:demographicTargeting": { @@ -12,20 +20,64 @@ { "xdm:minAge": 18, "xdm:maxAge": 24 + }, + { + "xdm:minAge": 25, + "xdm:maxAge": 34 } ], - "xdm:genders": ["female"] + "xdm:genders": ["female"], + "xdm:languages": ["en-US", "es-US", "zh-CN"] }, "xdm:interestTargeting": { + "xdm:interests": [ + "Fashion & Style", + "Beauty & Cosmetics", + "Health & Wellness", + "Fitness", + "Yoga & Meditation", + "Sustainable Living" + ], + "xdm:behaviors": [ + "Online Shoppers", + "Fashion-Forward Shoppers", + "Health & Wellness Enthusiasts", + "Mobile App Users" + ], "xdm:customAudiences": [ { - "xdm:audienceID": "aud-lookalike-001", - "xdm:audienceName": "Lookalike - High Value Customers", + "xdm:audienceID": "23851234567890666", + "xdm:audienceName": "Lookalike - High Value Customers (1%)", "xdm:audienceType": "lookalike" + }, + { + "xdm:audienceID": "23851234567890777", + "xdm:audienceName": "Instagram Engagers - Last 90 Days", + "xdm:audienceType": "custom" + }, + { + "xdm:audienceID": "23851234567890888", + "xdm:audienceName": "Video Viewers - 75% Completion", + "xdm:audienceType": "retargeting" } ] }, "xdm:deviceTargeting": { - "xdm:deviceTypes": ["mobile"] + "xdm:deviceTypes": ["mobile"], + "xdm:operatingSystems": ["iOS", "Android"], + "xdm:browsers": ["in_app", "mobile_web"] + }, + "xdm:placementTargeting": { + "xdm:placements": [ + "instagram_feed", + "instagram_stories", + "instagram_reels", + "instagram_explore" + ], + "xdm:publisherCategories": [ + "Fashion & Beauty", + "Lifestyle", + "Health & Wellness" + ] } } diff --git a/components/datatypes/paid-media/paid-media-targeting.example.3.json b/components/datatypes/paid-media/paid-media-targeting.example.3.json index 1a89e5f4b..c8f3c75b2 100644 --- a/components/datatypes/paid-media/paid-media-targeting.example.3.json +++ b/components/datatypes/paid-media/paid-media-targeting.example.3.json @@ -1,18 +1,80 @@ { "xdm:geoTargeting": { - "xdm:countries": ["DE", "FR", "IT", "ES"], - "xdm:postalCodes": ["10115", "75001", "00100", "28001"] + "xdm:countries": ["US"], + "xdm:regions": ["New York", "New Jersey", "Connecticut", "Pennsylvania"], + "xdm:cities": [ + "New York", + "Newark", + "Jersey City", + "Stamford", + "Philadelphia" + ], + "xdm:postalCodes": ["10001", "10002", "10003", "07102", "06901", "19102"] }, "xdm:demographicTargeting": { "xdm:ageRanges": [ + { + "xdm:minAge": 35, + "xdm:maxAge": 44 + }, { "xdm:minAge": 45, + "xdm:maxAge": 54 + }, + { + "xdm:minAge": 55, "xdm:maxAge": 65 } ], - "xdm:languages": ["de-DE", "fr-FR", "it-IT", "es-ES"] + "xdm:genders": ["male"], + "xdm:languages": ["en-US"] + }, + "xdm:interestTargeting": { + "xdm:interests": [ + "Business & Finance", + "Technology", + "Professional Development", + "Leadership & Management", + "Entrepreneurship", + "Investment & Trading" + ], + "xdm:behaviors": [ + "Business Decision Makers", + "High Income Earners", + "Frequent Business Travelers", + "Premium Product Buyers", + "Desktop Users" + ], + "xdm:customAudiences": [ + { + "xdm:audienceID": "23851234567890999", + "xdm:audienceName": "LinkedIn Professional Network", + "xdm:audienceType": "custom" + }, + { + "xdm:audienceID": "23851234567891000", + "xdm:audienceName": "B2B Website Visitors", + "xdm:audienceType": "retargeting" + } + ] }, "xdm:deviceTargeting": { - "xdm:deviceTypes": ["desktop", "tablet"] + "xdm:deviceTypes": ["desktop", "tablet"], + "xdm:operatingSystems": ["Windows", "macOS", "iOS"], + "xdm:browsers": ["Chrome", "Safari", "Edge", "Firefox"] + }, + "xdm:placementTargeting": { + "xdm:placements": [ + "facebook_feed", + "facebook_right_column", + "facebook_marketplace", + "audience_network" + ], + "xdm:publisherCategories": [ + "Business & Finance", + "Technology & Computing", + "News & Media", + "Professional Services" + ] } } diff --git a/components/datatypes/paid-media/paid-media-url-tracking.example.1.json b/components/datatypes/paid-media/paid-media-url-tracking.example.1.json index 80e201b2e..cf802ded7 100644 --- a/components/datatypes/paid-media/paid-media-url-tracking.example.1.json +++ b/components/datatypes/paid-media/paid-media-url-tracking.example.1.json @@ -1,18 +1,54 @@ { - "xdm:trackingTemplate": "{lpurl}?s_kwcid=AL!{userid}!3!{creative}!{matchtype}!{network}!{keyword}", - "xdm:finalUrlSuffix": "utm_source=google&utm_medium=cpc", + "xdm:trackingTemplate": "https://shop.acmecorp.com/products/headphones-premium?fbclid={{ad.id}}&campaign_id={{campaign.id}}&adset_id={{adset.id}}&creative_id={{ad.creative}}", + "xdm:finalUrlSuffix": "utm_source=facebook&utm_medium=paid_social&utm_campaign={{campaign.name}}&utm_content={{ad.name}}&utm_term={{placement}}&fbclid={{ad.id}}", "xdm:customParameters": [ + { + "xdm:key": "utm_source", + "xdm:value": "facebook" + }, + { + "xdm:key": "utm_medium", + "xdm:value": "paid_social" + }, + { + "xdm:key": "utm_campaign", + "xdm:value": "{{campaign.name}}" + }, + { + "xdm:key": "utm_content", + "xdm:value": "{{ad.name}}" + }, + { + "xdm:key": "utm_term", + "xdm:value": "{{placement}}" + }, + { + "xdm:key": "fbclid", + "xdm:value": "{{ad.id}}" + }, { "xdm:key": "campaign_id", - "xdm:value": "{campaignid}" + "xdm:value": "{{campaign.id}}" + }, + { + "xdm:key": "adset_id", + "xdm:value": "{{adset.id}}" + }, + { + "xdm:key": "ad_id", + "xdm:value": "{{ad.id}}" + }, + { + "xdm:key": "creative_id", + "xdm:value": "{{ad.creative}}" }, { - "xdm:key": "adgroup_id", - "xdm:value": "{adgroupid}" + "xdm:key": "placement", + "xdm:value": "{{placement}}" }, { - "xdm:key": "keyword", - "xdm:value": "{keyword}" + "xdm:key": "site_source_name", + "xdm:value": "{{site_source_name}}" } ] } diff --git a/components/datatypes/paid-media/paid-media-url-tracking.example.2.json b/components/datatypes/paid-media/paid-media-url-tracking.example.2.json index eea92317d..df1c4dfcb 100644 --- a/components/datatypes/paid-media/paid-media-url-tracking.example.2.json +++ b/components/datatypes/paid-media/paid-media-url-tracking.example.2.json @@ -1,17 +1,34 @@ { - "xdm:trackingTemplate": "https://example.com/track?url={lpurl}&campaign={campaignid}", + "xdm:trackingTemplate": "https://tracking.acmecorp.com/redirect?destination={{url}}&network=meta&campaign={{campaign.id}}&adset={{adset.id}}&ad={{ad.id}}&placement={{placement}}", + "xdm:finalUrlSuffix": "utm_source=instagram&utm_medium=paid_social&utm_campaign={{campaign.name}}&fbclid={{ad.id}}", "xdm:customParameters": [ { "xdm:key": "utm_source", - "xdm:value": "facebook" + "xdm:value": "instagram" + }, + { + "xdm:key": "utm_medium", + "xdm:value": "paid_social" }, { "xdm:key": "utm_campaign", - "xdm:value": "{campaign.name}" + "xdm:value": "{{campaign.name}}" }, { "xdm:key": "utm_content", - "xdm:value": "{ad.id}" + "xdm:value": "{{ad.name}}" + }, + { + "xdm:key": "utm_term", + "xdm:value": "instagram_{{placement}}" + }, + { + "xdm:key": "fbclid", + "xdm:value": "{{ad.id}}" + }, + { + "xdm:key": "ig_placement", + "xdm:value": "{{placement}}" } ] } diff --git a/components/datatypes/paid-media/paid-media-url-tracking.example.3.json b/components/datatypes/paid-media/paid-media-url-tracking.example.3.json index 18595bcfc..1df629c5d 100644 --- a/components/datatypes/paid-media/paid-media-url-tracking.example.3.json +++ b/components/datatypes/paid-media/paid-media-url-tracking.example.3.json @@ -1,13 +1,33 @@ { - "xdm:finalUrlSuffix": "gclid={gclid}&msclkid={msclkid}", + "xdm:finalUrlSuffix": "utm_source=facebook&utm_medium=messenger&utm_campaign={{campaign.name}}&utm_content={{ad.name}}&fbclid={{ad.id}}", "xdm:customParameters": [ { - "xdm:key": "source", - "xdm:value": "paid_search" + "xdm:key": "utm_source", + "xdm:value": "facebook" }, { - "xdm:key": "placement", - "xdm:value": "{placement}" + "xdm:key": "utm_medium", + "xdm:value": "messenger" + }, + { + "xdm:key": "utm_campaign", + "xdm:value": "{{campaign.name}}" + }, + { + "xdm:key": "utm_content", + "xdm:value": "{{ad.name}}" + }, + { + "xdm:key": "fbclid", + "xdm:value": "{{ad.id}}" + }, + { + "xdm:key": "messenger_placement", + "xdm:value": "{{placement}}" + }, + { + "xdm:key": "network", + "xdm:value": "meta" } ] } diff --git a/components/fieldgroups/paid-media/core-paid-media-account-details.example.1.json b/components/fieldgroups/paid-media/core-paid-media-account-details.example.1.json new file mode 100644 index 000000000..a7917efc8 --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-account-details.example.1.json @@ -0,0 +1,181 @@ +{ + "xdm:paidMedia": { + "xdm:accountDetails": { + "xdm:accountName": "Acme Corp - Meta Business Account", + "xdm:accountType": "business", + "xdm:businessName": "Acme Corporation", + "xdm:industry": "Technology", + "xdm:country": "US", + "xdm:isTestAccount": false, + "xdm:businessInfo": { + "xdm:businessID": "123456789012345", + "xdm:businessManagerID": "987654321098765", + "xdm:legalEntityName": "Acme Corporation Inc.", + "xdm:taxID": "12-3456789", + "xdm:businessAddress": { + "xdm:street1": "123 Innovation Drive", + "xdm:street2": "Suite 500", + "xdm:city": "San Francisco", + "xdm:region": "CA", + "xdm:postalCode": "94105", + "xdm:country": "US" + }, + "xdm:businessPhone": "+1-415-555-0100", + "xdm:businessEmail": "advertising@acmecorp.com", + "xdm:businessWebsite": "https://www.acmecorp.com", + "xdm:businessCategory": "Technology Company", + "xdm:businessVertical": "Software as a Service", + "xdm:employeeCount": "1001-5000", + "xdm:annualRevenue": "50000000-100000000", + "xdm:yearEstablished": 2010, + "xdm:publiclyTraded": true, + "xdm:stockSymbol": "ACME", + "xdm:parentCompany": "Acme Holdings LLC" + }, + "xdm:billingInfo": { + "xdm:billingType": "credit_card", + "xdm:paymentMethodID": "pm_1234567890abcdef", + "xdm:billingCurrency": "USD", + "xdm:billingAddress": { + "xdm:street1": "123 Innovation Drive", + "xdm:street2": "Finance Department", + "xdm:city": "San Francisco", + "xdm:region": "CA", + "xdm:postalCode": "94105", + "xdm:country": "US" + }, + "xdm:billingEmail": "billing@acmecorp.com", + "xdm:billingContact": "Jane Smith", + "xdm:billingPhone": "+1-415-555-0150", + "xdm:invoiceDelivery": "email", + "xdm:paymentTerms": "immediate", + "xdm:creditLimit": 500000, + "xdm:currentBalance": 125000, + "xdm:availableCredit": 375000, + "xdm:lastPaymentDate": "2025-11-03T10:30:00Z", + "xdm:lastPaymentAmount": 45000, + "xdm:nextBillingDate": "2025-12-01T00:00:00Z", + "xdm:autoPayEnabled": true, + "xdm:billingThreshold": 10000, + "xdm:taxExempt": false + }, + "xdm:contactInfo": { + "xdm:primaryContact": { + "xdm:name": "John Doe", + "xdm:email": "john.doe@acmecorp.com", + "xdm:phone": "+1-415-555-0120", + "xdm:title": "Director of Digital Marketing", + "xdm:userID": "user_abc123xyz" + }, + "xdm:technicalContact": { + "xdm:name": "Sarah Johnson", + "xdm:email": "sarah.johnson@acmecorp.com", + "xdm:phone": "+1-415-555-0130", + "xdm:title": "Marketing Technology Manager", + "xdm:userID": "user_def456uvw" + }, + "xdm:billingContact": { + "xdm:name": "Jane Smith", + "xdm:email": "jane.smith@acmecorp.com", + "xdm:phone": "+1-415-555-0150", + "xdm:title": "Finance Manager", + "xdm:userID": "user_ghi789rst" + }, + "xdm:notificationEmails": [ + "marketing-alerts@acmecorp.com", + "performance-reports@acmecorp.com", + "billing-notifications@acmecorp.com" + ] + }, + "xdm:spendingLimits": { + "xdm:dailySpendLimit": 5000, + "xdm:monthlySpendLimit": 150000, + "xdm:lifetimeSpendLimit": 1000000, + "xdm:currentDailySpend": 3250, + "xdm:currentMonthlySpend": 87500, + "xdm:lifetimeSpend": 425000, + "xdm:spendLimitResetDay": 1, + "xdm:alertThreshold": 0.8, + "xdm:alertsEnabled": true, + "xdm:pauseOnLimitReached": false + }, + "xdm:accountPermissions": { + "xdm:canCreateCampaigns": true, + "xdm:canEditCampaigns": true, + "xdm:canDeleteCampaigns": true, + "xdm:canViewReports": true, + "xdm:canManageBilling": true, + "xdm:canManageUsers": true, + "xdm:canAccessAPI": true, + "xdm:canUseAdvancedFeatures": true, + "xdm:restrictedPlacements": [], + "xdm:allowedCountries": ["US", "CA", "GB", "AU", "DE", "FR"], + "xdm:blockedCategories": ["gambling", "alcohol"], + "xdm:requiresApproval": false + }, + "xdm:accountSettings": { + "xdm:timezone": "America/Los_Angeles", + "xdm:language": "en_US", + "xdm:currency": "USD", + "xdm:attributionWindow": "28d_click_1d_view", + "xdm:conversionTracking": true, + "xdm:pixelID": "pixel_123456789", + "xdm:catalogID": "catalog_987654321", + "xdm:appID": "app_456789123", + "xdm:domainVerification": true, + "xdm:verifiedDomains": ["acmecorp.com", "shop.acmecorp.com"], + "xdm:brandSafetyEnabled": true, + "xdm:adReviewEnabled": true, + "xdm:autoOptimizationEnabled": true + }, + "xdm:accountStatus": { + "xdm:status": "active", + "xdm:accountHealth": "good", + "xdm:complianceStatus": "compliant", + "xdm:verificationStatus": "verified", + "xdm:riskLevel": "low", + "xdm:restrictions": [], + "xdm:warnings": [], + "xdm:lastReviewDate": "2025-10-15T14:30:00Z", + "xdm:nextReviewDate": "2026-01-15T00:00:00Z" + }, + "xdm:partnerIntegrations": { + "xdm:crmIntegration": true, + "xdm:crmProvider": "Salesforce", + "xdm:analyticsIntegration": true, + "xdm:analyticsProvider": "Adobe Analytics", + "xdm:cdpIntegration": true, + "xdm:cdpProvider": "Adobe Real-Time CDP", + "xdm:attributionProvider": "Adobe Attribution AI", + "xdm:dataWarehouseIntegration": true, + "xdm:dataWarehouseProvider": "Snowflake" + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "meta_business_verification_status", + "xdm:stringValue": "verified" + }, + { + "xdm:fieldName": "meta_ad_account_id", + "xdm:stringValue": "act_123456789012345" + }, + { + "xdm:fieldName": "meta_business_manager_name", + "xdm:stringValue": "Acme Corp Business Manager" + }, + { + "xdm:fieldName": "meta_account_creation_date", + "xdm:stringValue": "2020-03-15T08:00:00Z" + }, + { + "xdm:fieldName": "meta_two_factor_enabled", + "xdm:stringValue": "true" + }, + { + "xdm:fieldName": "meta_agency_relationship", + "xdm:stringValue": "direct" + } + ] + } + } +} diff --git a/components/fieldgroups/paid-media/core-paid-media-account-details.schema.json b/components/fieldgroups/paid-media/core-paid-media-account-details.schema.json new file mode 100644 index 000000000..2af52c458 --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-account-details.schema.json @@ -0,0 +1,253 @@ +{ + "meta:license": [ + "Copyright 2025 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "https://ns.adobe.com/xdm/mixins/paid-media/account-details", + "title": "Core Paid Media Account Details", + "type": "object", + "meta:extensible": true, + "meta:abstract": true, + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/context/record"], + "description": "Account-specific details and configuration fields for paid media accounts", + "definitions": { + "account-details": { + "properties": { + "xdm:paidMedia": { + "type": "object", + "properties": { + "xdm:accountDetails": { + "type": "object", + "title": "Account Details", + "description": "Specific details for paid media accounts", + "properties": { + "xdm:accountName": { + "type": "string", + "title": "Account Name", + "description": "Display name of the ad account" + }, + "xdm:accountType": { + "type": "string", + "title": "Account Type", + "description": "Type of account", + "enum": ["business", "personal", "agency", "brand", "other"], + "meta:enum": { + "business": "Business Account", + "personal": "Personal Account", + "agency": "Agency Account", + "brand": "Brand Account", + "other": "Other Account Type" + } + }, + "xdm:businessName": { + "type": "string", + "title": "Business Name", + "description": "Name of the business associated with the account" + }, + "xdm:industry": { + "type": "string", + "title": "Industry", + "description": "Industry category of the business" + }, + "xdm:country": { + "type": "string", + "title": "Country", + "description": "Country where the account is registered (ISO country code)" + }, + "xdm:isTestAccount": { + "type": "boolean", + "title": "Is Test Account", + "description": "Whether this is a test/sandbox account" + }, + "xdm:parentAccountID": { + "type": "string", + "title": "Parent Account ID", + "description": "ID of parent account (for sub-accounts or managed accounts)" + }, + "xdm:agencyID": { + "type": "string", + "title": "Agency ID", + "description": "ID of managing agency (if applicable)" + }, + "xdm:permissions": { + "type": "array", + "title": "Account Permissions", + "description": "User permissions for this account", + "items": { + "type": "string", + "enum": [ + "owner", + "admin", + "analyst", + "campaign_manager", + "creative_manager", + "finance_manager", + "viewer" + ], + "meta:enum": { + "owner": "Account Owner", + "admin": "Administrator", + "analyst": "Analyst", + "campaign_manager": "Campaign Manager", + "creative_manager": "Creative Manager", + "finance_manager": "Finance Manager", + "viewer": "Viewer" + } + } + }, + "xdm:spendingLimits": { + "type": "object", + "title": "Spending Limits", + "description": "Account-level spending limits", + "properties": { + "xdm:dailyLimit": { + "type": "number", + "title": "Daily Spending Limit", + "description": "Daily spending limit in account currency", + "minimum": 0 + }, + "xdm:monthlyLimit": { + "type": "number", + "title": "Monthly Spending Limit", + "description": "Monthly spending limit in account currency", + "minimum": 0 + }, + "xdm:totalLimit": { + "type": "number", + "title": "Total Spending Limit", + "description": "Total account spending limit", + "minimum": 0 + } + } + }, + "xdm:billingInfo": { + "type": "object", + "title": "Billing Information", + "description": "Account billing details", + "properties": { + "xdm:billingType": { + "type": "string", + "title": "Billing Type", + "enum": [ + "prepaid", + "postpaid", + "credit_line", + "credit_card" + ], + "meta:enum": { + "prepaid": "Prepaid", + "postpaid": "Postpaid", + "credit_line": "Credit Line", + "credit_card": "Credit Card" + } + }, + "xdm:paymentMethod": { + "type": "string", + "title": "Payment Method", + "description": "Primary payment method" + }, + "xdm:creditLimit": { + "type": "number", + "title": "Credit Limit", + "description": "Account credit limit", + "minimum": 0 + }, + "xdm:currentBalance": { + "type": "number", + "title": "Current Balance", + "description": "Current account balance", + "minimum": 0 + } + } + }, + "xdm:contactInfo": { + "type": "object", + "title": "Contact Information", + "description": "Account contact details", + "properties": { + "xdm:primaryEmail": { + "type": "string", + "format": "email", + "title": "Primary Email", + "description": "Primary contact email" + }, + "xdm:phone": { + "type": "string", + "title": "Phone Number", + "description": "Primary contact phone number" + }, + "xdm:website": { + "type": "string", + "title": "Website URL", + "description": "Business website URL" + }, + "xdm:address": { + "type": "object", + "title": "Business Address", + "properties": { + "xdm:street1": { + "type": "string", + "title": "Street Address Line 1", + "description": "First line of street address" + }, + "xdm:street2": { + "type": "string", + "title": "Street Address Line 2", + "description": "Second line of street address (suite, apt, etc.)" + }, + "xdm:street3": { + "type": "string", + "title": "Street Address Line 3", + "description": "Third line of street address" + }, + "xdm:city": { + "type": "string", + "title": "City" + }, + "xdm:state": { + "type": "string", + "title": "State/Province", + "description": "State or province" + }, + "xdm:region": { + "type": "string", + "title": "Region", + "description": "State, province, or region" + }, + "xdm:postalCode": { + "type": "string", + "title": "Postal Code" + }, + "xdm:country": { + "type": "string", + "title": "Country" + } + } + } + } + }, + "xdm:additionalDetails": { + "title": "Additional Account Details", + "description": "Platform-specific account details not defined in core schema. Allows ingestion of arbitrary fields from paid media network APIs without requiring schema changes.", + "type": "array", + "items": { + "$ref": "https://ns.adobe.com/xdm/datatypes/paid-media-additional-field" + } + } + } + } + } + } + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/account-details" + } + ], + "meta:status": "experimental" +} diff --git a/components/fieldgroups/paid-media/core-paid-media-ad-details.example.1.json b/components/fieldgroups/paid-media/core-paid-media-ad-details.example.1.json new file mode 100644 index 000000000..c88c9c85f --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-ad-details.example.1.json @@ -0,0 +1,158 @@ +{ + "xdm:paidMedia": { + "xdm:adDetails": { + "xdm:adType": "video", + "xdm:adFormat": "single_video", + "xdm:reviewStatus": "approved", + "xdm:deliveryStatus": "active", + "xdm:isPinDeleted": false, + "xdm:isRemovable": true, + "xdm:creativeDetails": { + "xdm:creativeID": "creative_vid_987654321", + "xdm:creativeName": "Fall Product Launch - 30s Video", + "xdm:creativeType": "video", + "xdm:creativeFormat": "feed_video", + "xdm:creativeVersion": "v2.1", + "xdm:creativeTemplate": "video_standard", + "xdm:dynamicCreative": false, + "xdm:personalized": true, + "xdm:localized": true, + "xdm:locale": "en_US", + "xdm:brandID": "brand_acme_123", + "xdm:campaignTheme": "fall_2025_launch" + }, + "xdm:adReviewDetails": { + "xdm:reviewStatus": "approved", + "xdm:reviewDate": "2025-11-05T14:30:00Z", + "xdm:reviewerID": "meta_reviewer_456", + "xdm:reviewNotes": "Approved - complies with all advertising policies", + "xdm:policyViolations": [], + "xdm:appealStatus": "not_applicable", + "xdm:lastModifiedDate": "2025-11-05T10:15:00Z", + "xdm:autoApproved": false, + "xdm:requiresManualReview": false + }, + "xdm:deliveryDetails": { + "xdm:deliveryStatus": "active", + "xdm:effectiveStatus": "active", + "xdm:servingStatus": "CAMPAIGN_STATUS_ENABLED", + "xdm:pacing": "standard", + "xdm:deliveryEstimate": "good", + "xdm:learningPhase": "completed", + "xdm:lastDeliveryCheck": "2025-11-10T08:00:00Z", + "xdm:estimatedDailyReach": 125000, + "xdm:saturationLevel": "low" + }, + "xdm:socialMediaProperties": { + "xdm:postID": "post_123456789_987654321", + "xdm:pageID": "page_acmecorp_official", + "xdm:instagramAccountID": "ig_acmecorp", + "xdm:allowComments": true, + "xdm:allowSharing": true, + "xdm:allowLikes": true, + "xdm:commentCount": 1247, + "xdm:shareCount": 892, + "xdm:likeCount": 8934, + "xdm:reactionCount": 9876, + "xdm:saveCount": 456, + "xdm:hideCount": 23, + "xdm:reportCount": 2, + "xdm:organicImpressions": 45000, + "xdm:organicReach": 32000, + "xdm:viralImpressions": 12000, + "xdm:viralReach": 8500 + }, + "xdm:callToAction": { + "xdm:type": "learn_more", + "xdm:text": "Learn More", + "xdm:url": "https://www.acmecorp.com/fall-launch?utm_source=facebook&utm_medium=video&utm_campaign=fall2025", + "xdm:displayUrl": "acmecorp.com/fall-launch", + "xdm:deepLink": "acmecorp://products/fall-launch", + "xdm:trackingTemplate": "https://track.acmecorp.com/click?ad={ad_id}&placement={placement}", + "xdm:utmParameters": { + "xdm:source": "facebook", + "xdm:medium": "video", + "xdm:campaign": "fall2025", + "xdm:content": "30s_video", + "xdm:term": "product_launch" + } + }, + "xdm:linkProperties": { + "xdm:destinationURL": "https://www.acmecorp.com/fall-launch", + "xdm:displayURL": "acmecorp.com", + "xdm:urlTags": "utm_source=facebook&utm_medium=video&utm_campaign=fall2025", + "xdm:trackingPixels": [ + "https://track.acmecorp.com/impression?ad=vid_987654321", + "https://analytics.acmecorp.com/pixel?type=view&id=fall2025" + ], + "xdm:clickTrackers": [ + "https://track.acmecorp.com/click?ad=vid_987654321", + "https://analytics.acmecorp.com/pixel?type=click&id=fall2025" + ], + "xdm:conversionTracking": true, + "xdm:conversionPixelID": "pixel_123456789" + }, + "xdm:appProperties": { + "xdm:appID": "app_456789123", + "xdm:appName": "Acme Shopping", + "xdm:appPlatform": "ios", + "xdm:appStoreURL": "https://apps.apple.com/app/acme-shopping/id123456789", + "xdm:appDeepLink": "acmecorp://products/fall-launch", + "xdm:appEventTracking": true, + "xdm:appEventName": "product_view", + "xdm:sdkVersion": "9.2.1" + }, + "xdm:leadGenProperties": { + "xdm:formID": "form_not_applicable", + "xdm:formType": "not_applicable", + "xdm:instantForm": false, + "xdm:privacyPolicyURL": "https://www.acmecorp.com/privacy", + "xdm:customDisclaimer": "By submitting, you agree to receive marketing communications from Acme Corp." + }, + "xdm:interactionProperties": { + "xdm:allowInteraction": true, + "xdm:interactionType": "video_engagement", + "xdm:swipeUpEnabled": false, + "xdm:pollEnabled": false, + "xdm:quizEnabled": false, + "xdm:gamificationEnabled": false, + "xdm:arEnabled": false, + "xdm:threeDEnabled": false + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "meta_ad_id", + "xdm:stringValue": "23851234567890123" + }, + { + "xdm:fieldName": "meta_adset_id", + "xdm:stringValue": "23851234567890456" + }, + { + "xdm:fieldName": "meta_campaign_id", + "xdm:stringValue": "23851234567890789" + }, + { + "xdm:fieldName": "meta_video_id", + "xdm:stringValue": "987654321012345" + }, + { + "xdm:fieldName": "meta_placement_optimization", + "xdm:stringValue": "automatic" + }, + { + "xdm:fieldName": "meta_objective", + "xdm:stringValue": "OUTCOME_TRAFFIC" + }, + { + "xdm:fieldName": "meta_buying_type", + "xdm:stringValue": "AUCTION" + }, + { + "xdm:fieldName": "meta_bid_strategy", + "xdm:stringValue": "LOWEST_COST_WITHOUT_CAP" + } + ] + } + } +} diff --git a/components/fieldgroups/paid-media/core-paid-media-ad-details.example.2.json b/components/fieldgroups/paid-media/core-paid-media-ad-details.example.2.json new file mode 100644 index 000000000..49054e197 --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-ad-details.example.2.json @@ -0,0 +1,162 @@ +{ + "xdm:paidMedia": { + "xdm:adDetails": { + "xdm:adType": "image", + "xdm:adFormat": "single_image", + "xdm:reviewStatus": "approved", + "xdm:deliveryStatus": "active", + "xdm:isPinDeleted": false, + "xdm:isRemovable": true, + "xdm:creativeDetails": { + "xdm:creativeID": "creative_img_456789123", + "xdm:creativeName": "Holiday Sale - Hero Image", + "xdm:creativeType": "image", + "xdm:creativeFormat": "feed_image", + "xdm:creativeVersion": "v1.0", + "xdm:creativeTemplate": "image_standard", + "xdm:dynamicCreative": true, + "xdm:personalized": true, + "xdm:localized": true, + "xdm:locale": "en_US", + "xdm:brandID": "brand_acme_123", + "xdm:campaignTheme": "holiday_2025" + }, + "xdm:adReviewDetails": { + "xdm:reviewStatus": "approved", + "xdm:reviewDate": "2025-11-08T09:15:00Z", + "xdm:reviewerID": "meta_reviewer_789", + "xdm:reviewNotes": "Approved - meets all policy requirements", + "xdm:policyViolations": [], + "xdm:appealStatus": "not_applicable", + "xdm:lastModifiedDate": "2025-11-08T08:00:00Z", + "xdm:autoApproved": true, + "xdm:requiresManualReview": false + }, + "xdm:deliveryDetails": { + "xdm:deliveryStatus": "active", + "xdm:effectiveStatus": "active", + "xdm:servingStatus": "CAMPAIGN_STATUS_ENABLED", + "xdm:pacing": "standard", + "xdm:deliveryEstimate": "excellent", + "xdm:learningPhase": "learning", + "xdm:lastDeliveryCheck": "2025-11-10T08:30:00Z", + "xdm:estimatedDailyReach": 85000, + "xdm:saturationLevel": "low" + }, + "xdm:socialMediaProperties": { + "xdm:postID": "post_123456789_111222333", + "xdm:pageID": "page_acmecorp_official", + "xdm:instagramAccountID": "ig_acmecorp", + "xdm:allowComments": true, + "xdm:allowSharing": true, + "xdm:allowLikes": true, + "xdm:commentCount": 543, + "xdm:shareCount": 234, + "xdm:likeCount": 4567, + "xdm:reactionCount": 5123, + "xdm:saveCount": 789, + "xdm:hideCount": 12, + "xdm:reportCount": 1, + "xdm:organicImpressions": 23000, + "xdm:organicReach": 18000, + "xdm:viralImpressions": 8000, + "xdm:viralReach": 6000 + }, + "xdm:callToAction": { + "xdm:type": "shop_now", + "xdm:text": "Shop Now", + "xdm:url": "https://shop.acmecorp.com/holiday-sale?utm_source=facebook&utm_medium=image&utm_campaign=holiday2025", + "xdm:displayUrl": "shop.acmecorp.com/holiday-sale", + "xdm:deepLink": "acmecorp://shop/holiday-sale", + "xdm:trackingTemplate": "https://track.acmecorp.com/click?ad={ad_id}&placement={placement}&creative={creative_id}", + "xdm:utmParameters": { + "xdm:source": "facebook", + "xdm:medium": "image", + "xdm:campaign": "holiday2025", + "xdm:content": "hero_image", + "xdm:term": "holiday_sale" + } + }, + "xdm:linkProperties": { + "xdm:destinationURL": "https://shop.acmecorp.com/holiday-sale", + "xdm:displayURL": "shop.acmecorp.com", + "xdm:urlTags": "utm_source=facebook&utm_medium=image&utm_campaign=holiday2025", + "xdm:trackingPixels": [ + "https://track.acmecorp.com/impression?ad=img_456789123", + "https://analytics.acmecorp.com/pixel?type=view&id=holiday2025" + ], + "xdm:clickTrackers": [ + "https://track.acmecorp.com/click?ad=img_456789123", + "https://analytics.acmecorp.com/pixel?type=click&id=holiday2025" + ], + "xdm:conversionTracking": true, + "xdm:conversionPixelID": "pixel_123456789" + }, + "xdm:appProperties": { + "xdm:appID": "app_456789123", + "xdm:appName": "Acme Shopping", + "xdm:appPlatform": "android", + "xdm:appStoreURL": "https://play.google.com/store/apps/details?id=com.acmecorp.shopping", + "xdm:appDeepLink": "acmecorp://shop/holiday-sale", + "xdm:appEventTracking": true, + "xdm:appEventName": "add_to_cart", + "xdm:sdkVersion": "9.2.1" + }, + "xdm:leadGenProperties": { + "xdm:formID": "form_not_applicable", + "xdm:formType": "not_applicable", + "xdm:instantForm": false, + "xdm:privacyPolicyURL": "https://www.acmecorp.com/privacy", + "xdm:customDisclaimer": "By submitting, you agree to receive promotional emails from Acme Corp." + }, + "xdm:interactionProperties": { + "xdm:allowInteraction": true, + "xdm:interactionType": "click_to_website", + "xdm:swipeUpEnabled": false, + "xdm:pollEnabled": false, + "xdm:quizEnabled": false, + "xdm:gamificationEnabled": false, + "xdm:arEnabled": false, + "xdm:threeDEnabled": false + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "meta_ad_id", + "xdm:stringValue": "23851234567891111" + }, + { + "xdm:fieldName": "meta_adset_id", + "xdm:stringValue": "23851234567892222" + }, + { + "xdm:fieldName": "meta_campaign_id", + "xdm:stringValue": "23851234567893333" + }, + { + "xdm:fieldName": "meta_image_hash", + "xdm:stringValue": "abc123def456ghi789jkl012" + }, + { + "xdm:fieldName": "meta_placement_optimization", + "xdm:stringValue": "automatic" + }, + { + "xdm:fieldName": "meta_objective", + "xdm:stringValue": "OUTCOME_SALES" + }, + { + "xdm:fieldName": "meta_buying_type", + "xdm:stringValue": "AUCTION" + }, + { + "xdm:fieldName": "meta_bid_strategy", + "xdm:stringValue": "LOWEST_COST_WITH_BID_CAP" + }, + { + "xdm:fieldName": "meta_dynamic_creative", + "xdm:stringValue": "true" + } + ] + } + } +} diff --git a/components/fieldgroups/paid-media/core-paid-media-ad-details.example.3.json b/components/fieldgroups/paid-media/core-paid-media-ad-details.example.3.json new file mode 100644 index 000000000..fb3ad64a0 --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-ad-details.example.3.json @@ -0,0 +1,166 @@ +{ + "xdm:paidMedia": { + "xdm:adDetails": { + "xdm:adType": "carousel", + "xdm:adFormat": "carousel_ad", + "xdm:reviewStatus": "approved", + "xdm:deliveryStatus": "active", + "xdm:isPinDeleted": false, + "xdm:isRemovable": true, + "xdm:creativeDetails": { + "xdm:creativeID": "creative_car_789456123", + "xdm:creativeName": "Product Showcase - 5 Card Carousel", + "xdm:creativeType": "carousel", + "xdm:creativeFormat": "carousel_feed", + "xdm:creativeVersion": "v3.2", + "xdm:creativeTemplate": "carousel_product", + "xdm:dynamicCreative": false, + "xdm:personalized": true, + "xdm:localized": true, + "xdm:locale": "en_US", + "xdm:brandID": "brand_acme_123", + "xdm:campaignTheme": "product_showcase_2025" + }, + "xdm:adReviewDetails": { + "xdm:reviewStatus": "approved", + "xdm:reviewDate": "2025-11-07T16:45:00Z", + "xdm:reviewerID": "meta_reviewer_321", + "xdm:reviewNotes": "All carousel cards approved - complies with commerce policies", + "xdm:policyViolations": [], + "xdm:appealStatus": "not_applicable", + "xdm:lastModifiedDate": "2025-11-07T15:30:00Z", + "xdm:autoApproved": false, + "xdm:requiresManualReview": true + }, + "xdm:deliveryDetails": { + "xdm:deliveryStatus": "active", + "xdm:effectiveStatus": "active", + "xdm:servingStatus": "CAMPAIGN_STATUS_ENABLED", + "xdm:pacing": "accelerated", + "xdm:deliveryEstimate": "good", + "xdm:learningPhase": "completed", + "xdm:lastDeliveryCheck": "2025-11-10T09:00:00Z", + "xdm:estimatedDailyReach": 95000, + "xdm:saturationLevel": "medium" + }, + "xdm:socialMediaProperties": { + "xdm:postID": "post_123456789_444555666", + "xdm:pageID": "page_acmecorp_official", + "xdm:instagramAccountID": "ig_acmecorp", + "xdm:allowComments": true, + "xdm:allowSharing": true, + "xdm:allowLikes": true, + "xdm:commentCount": 892, + "xdm:shareCount": 456, + "xdm:likeCount": 6789, + "xdm:reactionCount": 7234, + "xdm:saveCount": 1234, + "xdm:hideCount": 18, + "xdm:reportCount": 3, + "xdm:organicImpressions": 34000, + "xdm:organicReach": 26000, + "xdm:viralImpressions": 15000, + "xdm:viralReach": 11000 + }, + "xdm:callToAction": { + "xdm:type": "shop_now", + "xdm:text": "Shop Now", + "xdm:url": "https://shop.acmecorp.com/products?utm_source=facebook&utm_medium=carousel&utm_campaign=showcase2025", + "xdm:displayUrl": "shop.acmecorp.com/products", + "xdm:deepLink": "acmecorp://products/showcase", + "xdm:trackingTemplate": "https://track.acmecorp.com/click?ad={ad_id}&card={card_id}&placement={placement}", + "xdm:utmParameters": { + "xdm:source": "facebook", + "xdm:medium": "carousel", + "xdm:campaign": "showcase2025", + "xdm:content": "5_card_carousel", + "xdm:term": "product_showcase" + } + }, + "xdm:linkProperties": { + "xdm:destinationURL": "https://shop.acmecorp.com/products", + "xdm:displayURL": "shop.acmecorp.com", + "xdm:urlTags": "utm_source=facebook&utm_medium=carousel&utm_campaign=showcase2025", + "xdm:trackingPixels": [ + "https://track.acmecorp.com/impression?ad=car_789456123", + "https://analytics.acmecorp.com/pixel?type=view&id=showcase2025" + ], + "xdm:clickTrackers": [ + "https://track.acmecorp.com/click?ad=car_789456123", + "https://analytics.acmecorp.com/pixel?type=click&id=showcase2025" + ], + "xdm:conversionTracking": true, + "xdm:conversionPixelID": "pixel_123456789" + }, + "xdm:appProperties": { + "xdm:appID": "app_456789123", + "xdm:appName": "Acme Shopping", + "xdm:appPlatform": "ios", + "xdm:appStoreURL": "https://apps.apple.com/app/acme-shopping/id123456789", + "xdm:appDeepLink": "acmecorp://products/showcase", + "xdm:appEventTracking": true, + "xdm:appEventName": "view_content", + "xdm:sdkVersion": "9.2.1" + }, + "xdm:leadGenProperties": { + "xdm:formID": "form_not_applicable", + "xdm:formType": "not_applicable", + "xdm:instantForm": false, + "xdm:privacyPolicyURL": "https://www.acmecorp.com/privacy", + "xdm:customDisclaimer": "By submitting, you agree to receive product updates from Acme Corp." + }, + "xdm:interactionProperties": { + "xdm:allowInteraction": true, + "xdm:interactionType": "carousel_swipe", + "xdm:swipeUpEnabled": false, + "xdm:pollEnabled": false, + "xdm:quizEnabled": false, + "xdm:gamificationEnabled": false, + "xdm:arEnabled": false, + "xdm:threeDEnabled": false + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "meta_ad_id", + "xdm:stringValue": "23851234567894444" + }, + { + "xdm:fieldName": "meta_adset_id", + "xdm:stringValue": "23851234567895555" + }, + { + "xdm:fieldName": "meta_campaign_id", + "xdm:stringValue": "23851234567896666" + }, + { + "xdm:fieldName": "meta_carousel_card_count", + "xdm:stringValue": "5" + }, + { + "xdm:fieldName": "meta_placement_optimization", + "xdm:stringValue": "automatic" + }, + { + "xdm:fieldName": "meta_objective", + "xdm:stringValue": "OUTCOME_SALES" + }, + { + "xdm:fieldName": "meta_buying_type", + "xdm:stringValue": "AUCTION" + }, + { + "xdm:fieldName": "meta_bid_strategy", + "xdm:stringValue": "COST_CAP" + }, + { + "xdm:fieldName": "meta_catalog_id", + "xdm:stringValue": "catalog_987654321" + }, + { + "xdm:fieldName": "meta_product_set_id", + "xdm:stringValue": "product_set_123456" + } + ] + } + } +} diff --git a/components/fieldgroups/paid-media/core-paid-media-ad-details.schema.json b/components/fieldgroups/paid-media/core-paid-media-ad-details.schema.json new file mode 100644 index 000000000..c66fd575f --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-ad-details.schema.json @@ -0,0 +1,338 @@ +{ + "meta:license": [ + "Copyright 2025 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "https://ns.adobe.com/xdm/mixins/paid-media/ad-details", + "title": "Core Paid Media Ad Details", + "type": "object", + "meta:extensible": true, + "meta:abstract": true, + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/context/record"], + "description": "Ad-specific details and configuration fields for paid media ads", + "definitions": { + "ad-details": { + "properties": { + "xdm:paidMedia": { + "type": "object", + "properties": { + "xdm:adDetails": { + "type": "object", + "title": "Ad Details", + "description": "Specific details for individual paid media ads", + "properties": { + "xdm:adType": { + "type": "string", + "title": "Ad Type", + "description": "Type of ad creative", + "enum": [ + "text", + "image", + "video", + "carousel", + "collection", + "dynamic", + "responsive", + "shopping", + "app_install", + "lead_form", + "playable", + "interactive", + "other" + ], + "meta:enum": { + "text": "Text Ad", + "image": "Image Ad", + "video": "Video Ad", + "carousel": "Carousel Ad", + "collection": "Collection Ad", + "dynamic": "Dynamic Ad", + "responsive": "Responsive Ad", + "shopping": "Shopping Ad", + "app_install": "App Install Ad", + "lead_form": "Lead Form Ad", + "playable": "Playable Ad", + "interactive": "Interactive Ad", + "other": "Other Ad Type" + } + }, + "xdm:creative": { + "$ref": "https://ns.adobe.com/xdm/datatypes/paid-media-creative", + "title": "Creative Details", + "description": "Creative content and assets for the ad" + }, + "xdm:reviewStatus": { + "type": "string", + "title": "Review Status", + "description": "Ad review/approval status", + "enum": [ + "pending", + "approved", + "rejected", + "under_review", + "needs_attention", + "not_reviewed" + ], + "meta:enum": { + "pending": "Pending Review", + "approved": "Approved", + "rejected": "Rejected", + "under_review": "Under Review", + "needs_attention": "Needs Attention", + "not_reviewed": "Not Reviewed" + } + }, + "xdm:reviewStatusReasons": { + "type": "array", + "title": "Review Status Reasons", + "description": "Reasons for review rejection or issues", + "items": { + "type": "string" + } + }, + "xdm:deliveryStatus": { + "type": "string", + "title": "Delivery Status", + "description": "Current delivery status of the ad", + "enum": [ + "active", + "inactive", + "pending", + "learning", + "limited", + "not_delivering", + "completed" + ], + "meta:enum": { + "active": "Actively Delivering", + "inactive": "Not Delivering", + "pending": "Pending Delivery", + "learning": "In Learning Phase", + "limited": "Limited Delivery", + "not_delivering": "Not Delivering", + "completed": "Delivery Completed" + } + }, + "xdm:isPinDeleted": { + "type": "boolean", + "title": "Is Pin Deleted", + "description": "Whether the original pin/post is deleted (for social platforms)" + }, + "xdm:isRemovable": { + "type": "boolean", + "title": "Is Removable", + "description": "Whether the ad can be removed" + }, + "xdm:payingAdvertiserName": { + "type": "string", + "title": "Paying Advertiser Name", + "description": "Name of the paying advertiser (for political/regulated ads)" + }, + "xdm:creativeAssetGroupsSpec": { + "type": "object", + "title": "Creative Asset Groups Spec", + "description": "Specification for dynamic creative or asset customization", + "properties": { + "xdm:isDynamic": { + "type": "boolean", + "title": "Is Dynamic Creative", + "description": "Whether this uses dynamic creative assembly" + }, + "xdm:assetGroups": { + "type": "array", + "title": "Asset Groups", + "description": "Groups of creative assets", + "items": { + "type": "object", + "properties": { + "xdm:groupName": { + "type": "string", + "title": "Group Name" + }, + "xdm:assetIDs": { + "type": "array", + "title": "Asset IDs", + "items": { + "type": "string" + } + } + } + } + } + } + }, + "xdm:degreesOfFreedomSpec": { + "type": "object", + "title": "Degrees of Freedom Spec", + "description": "Specification for automated creative features (AI enhancements)", + "properties": { + "xdm:enabled": { + "type": "boolean", + "title": "AI Enhancement Enabled", + "description": "Whether AI creative enhancements are enabled" + }, + "xdm:features": { + "type": "array", + "title": "AI Features", + "description": "Specific AI features enabled", + "items": { + "type": "string" + } + } + } + }, + "xdm:socialMediaProperties": { + "type": "object", + "title": "Social Media Properties", + "description": "Properties specific to social media ads", + "properties": { + "xdm:effectiveObjectStoryID": { + "type": "string", + "title": "Effective Object Story ID", + "description": "Links to the social media post used as the ad" + }, + "xdm:sourceInstagramMediaID": { + "type": "string", + "title": "Source Instagram Media ID", + "description": "Instagram media ID for Instagram-originated creatives" + }, + "xdm:objectStorySpec": { + "type": "object", + "title": "Object Story Spec", + "description": "Full story specification for complex ad types" + }, + "xdm:isShareable": { + "type": "boolean", + "title": "Is Shareable", + "description": "Whether users can share the ad with friends" + }, + "xdm:favoriteDisplayMode": { + "type": "string", + "title": "Favorite Display Mode", + "description": "How users can favorite the creative within the app" + } + } + }, + "xdm:appProperties": { + "type": "object", + "title": "App Properties", + "description": "Properties for app install/engagement ads", + "properties": { + "xdm:appInstallProperties": { + "type": "object", + "title": "App Install Properties", + "description": "Properties for app install ads" + }, + "xdm:deepLinkProperties": { + "type": "object", + "title": "Deep Link Properties", + "description": "Properties for deep link ads" + } + } + }, + "xdm:leadGenerationProperties": { + "type": "object", + "title": "Lead Generation Properties", + "description": "Properties for lead generation ads", + "properties": { + "xdm:leadGenerationFormID": { + "type": "string", + "title": "Lead Generation Form ID", + "description": "ID of the lead generation form" + }, + "xdm:offerDisclaimerID": { + "type": "string", + "title": "Offer Disclaimer ID", + "description": "ID of offer disclaimer associated with the creative" + } + } + }, + "xdm:partnershipProperties": { + "type": "object", + "title": "Partnership Properties", + "description": "Properties for partnership/creator ads", + "properties": { + "xdm:creatorPartnershipType": { + "type": "string", + "title": "Creator Partnership Type", + "description": "Type of creator partnership" + }, + "xdm:profileProperties": { + "type": "object", + "title": "Profile Properties", + "description": "Profile properties for partnership ads", + "properties": { + "xdm:profileID": { + "type": "string", + "title": "Profile ID", + "description": "ID of the associated profile" + } + } + } + } + }, + "xdm:interactionProperties": { + "type": "object", + "title": "Interaction Properties", + "description": "Properties for interactive ad features", + "properties": { + "xdm:chatProperties": { + "type": "object", + "title": "Chat Properties", + "description": "Properties for chat-enabled ads" + }, + "xdm:webViewProperties": { + "type": "object", + "title": "Web View Properties", + "description": "Properties for web view ads" + }, + "xdm:adToLensProperties": { + "type": "object", + "title": "Ad to Lens Properties", + "description": "Properties for AR lens ads" + }, + "xdm:adToCallProperties": { + "type": "object", + "title": "Ad to Call Properties", + "description": "Properties for call-to-action ads" + }, + "xdm:adToMessageProperties": { + "type": "object", + "title": "Ad to Message Properties", + "description": "Properties for message ads" + }, + "xdm:reminderProperties": { + "type": "object", + "title": "Reminder Properties", + "description": "Properties for reminder ads" + } + } + }, + "xdm:urlTracking": { + "$ref": "https://ns.adobe.com/xdm/datatypes/paid-media-url-tracking" + }, + "xdm:additionalDetails": { + "title": "Additional Ad Details", + "description": "Platform-specific ad details not defined in core schema. Allows ingestion of arbitrary fields from paid media network APIs without requiring schema changes.", + "type": "array", + "items": { + "$ref": "https://ns.adobe.com/xdm/datatypes/paid-media-additional-field" + } + } + } + } + } + } + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/ad-details" + } + ], + "meta:status": "experimental" +} diff --git a/components/fieldgroups/paid-media/core-paid-media-adgroup-details.example.1.json b/components/fieldgroups/paid-media/core-paid-media-adgroup-details.example.1.json new file mode 100644 index 000000000..33d1ae819 --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-adgroup-details.example.1.json @@ -0,0 +1,211 @@ +{ + "xdm:paidMedia": { + "xdm:adGroupDetails": { + "xdm:adGroupType": "standard", + "xdm:childAdType": "video", + "xdm:budgetSettings": { + "xdm:budgetType": "daily", + "xdm:dailyBudget": 500, + "xdm:lifetimeBudget": 0, + "xdm:budgetRemaining": 350, + "xdm:budgetSpent": 150, + "xdm:budgetUtilization": 0.3, + "xdm:pacing": "standard", + "xdm:pacingType": "standard", + "xdm:budgetOptimization": false, + "xdm:sharedBudget": false, + "xdm:budgetResetTime": "00:00:00", + "xdm:budgetTimezone": "America/Los_Angeles" + }, + "xdm:targetingSettings": { + "xdm:geoTargeting": { + "xdm:countries": ["US"], + "xdm:regions": ["California", "New York", "Texas", "Florida"], + "xdm:cities": [ + "San Francisco", + "Los Angeles", + "New York", + "Austin", + "Miami" + ], + "xdm:postalCodes": [], + "xdm:dmas": ["807", "501", "803"], + "xdm:radius": 0, + "xdm:radiusUnit": "mile", + "xdm:locationType": "home" + }, + "xdm:demographicTargeting": { + "xdm:ageMin": 25, + "xdm:ageMax": 54, + "xdm:genders": ["male", "female"], + "xdm:languages": ["en"], + "xdm:education": ["college", "grad_school"], + "xdm:relationshipStatus": [], + "xdm:workEmployers": [], + "xdm:workPositions": ["manager", "director", "executive"] + }, + "xdm:interestTargeting": { + "xdm:interests": [ + "Technology", + "Business", + "Innovation", + "Entrepreneurship" + ], + "xdm:behaviors": [ + "Early technology adopters", + "Business decision makers" + ], + "xdm:lifeEvents": [] + }, + "xdm:audienceTargeting": { + "xdm:customAudiences": [ + "audience_website_visitors_30d", + "audience_app_users" + ], + "xdm:lookalikeSources": ["audience_purchasers_90d"], + "xdm:lookalikeSimilarity": 0.05, + "xdm:excludedAudiences": ["audience_existing_customers"], + "xdm:audienceExpansion": true, + "xdm:detailedTargeting": "expansion_all" + }, + "xdm:deviceTargeting": { + "xdm:devices": ["mobile", "desktop"], + "xdm:platforms": ["ios", "android", "windows", "mac"], + "xdm:osVersions": [], + "xdm:deviceModels": [], + "xdm:connectionTypes": ["wifi", "cellular"] + } + }, + "xdm:optimizationSettings": { + "xdm:optimizationGoal": "link_clicks", + "xdm:billingEvent": "impressions", + "xdm:bidStrategy": "lowest_cost_without_cap", + "xdm:bidAmount": 0, + "xdm:bidCap": 0, + "xdm:costCap": 0, + "xdm:roas": 0, + "xdm:optimizationEvent": "LINK_CLICK", + "xdm:conversionWindow": "7d_click_1d_view", + "xdm:attributionSetting": "7_day_click_1_day_view", + "xdm:deliveryType": "standard", + "xdm:campaignBudgetOptimization": false + }, + "xdm:placementSettings": { + "xdm:placementType": "automatic", + "xdm:placements": [ + "facebook_feed", + "instagram_feed", + "facebook_marketplace", + "facebook_video_feeds", + "facebook_right_column", + "instagram_explore", + "instagram_reels", + "messenger_inbox", + "audience_network_native", + "audience_network_banner", + "audience_network_interstitial", + "audience_network_rewarded_video" + ], + "xdm:excludedPlacements": [], + "xdm:publisherPlatforms": [ + "facebook", + "instagram", + "messenger", + "audience_network" + ], + "xdm:devicePlatforms": ["mobile", "desktop"], + "xdm:facebookPositions": [ + "feed", + "marketplace", + "video_feeds", + "right_column", + "instant_article", + "instream_video" + ], + "xdm:instagramPositions": ["stream", "story", "explore", "reels"], + "xdm:messengerPositions": ["messenger_home", "sponsored_messages"], + "xdm:audienceNetworkPositions": [ + "classic", + "instream_video", + "rewarded_video" + ] + }, + "xdm:deliverySettings": { + "xdm:startTime": "2025-11-01T00:00:00Z", + "xdm:endTime": "2025-11-30T23:59:59Z", + "xdm:scheduleType": "continuous", + "xdm:dayParting": false, + "xdm:dayPartingSchedule": [], + "xdm:frequencyCap": { + "xdm:enabled": true, + "xdm:impressions": 3, + "xdm:period": "day" + }, + "xdm:deliveryEstimate": "good", + "xdm:learningPhase": "learning", + "xdm:minimumRoas": 0 + }, + "xdm:trackingSettings": { + "xdm:pixelID": "pixel_123456789", + "xdm:conversionTracking": true, + "xdm:offlineConversionTracking": false, + "xdm:appEventTracking": true, + "xdm:urlParameters": "utm_source=facebook&utm_medium=paid&utm_campaign=fall2025&utm_content=video_adset", + "xdm:trackingSpecs": [ + { + "xdm:eventType": "LINK_CLICK", + "xdm:eventSource": "pixel", + "xdm:eventID": "pixel_123456789" + }, + { + "xdm:eventType": "PAGE_VIEW", + "xdm:eventSource": "pixel", + "xdm:eventID": "pixel_123456789" + } + ] + }, + "xdm:brandSafetySettings": { + "xdm:blockLists": ["block_list_sensitive_content"], + "xdm:inventoryFilter": "standard", + "xdm:contentCategories": ["news", "entertainment", "technology"], + "xdm:excludedCategories": ["mature_content", "political"], + "xdm:publisherBlockLists": [], + "xdm:appBlockLists": [] + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "meta_adset_id", + "xdm:stringValue": "23851234567890456" + }, + { + "xdm:fieldName": "meta_campaign_id", + "xdm:stringValue": "23851234567890789" + }, + { + "xdm:fieldName": "meta_adset_name", + "xdm:stringValue": "Fall Launch - Video - 25-54 - Tech Enthusiasts" + }, + { + "xdm:fieldName": "meta_optimization_goal", + "xdm:stringValue": "LINK_CLICKS" + }, + { + "xdm:fieldName": "meta_billing_event", + "xdm:stringValue": "IMPRESSIONS" + }, + { + "xdm:fieldName": "meta_bid_strategy", + "xdm:stringValue": "LOWEST_COST_WITHOUT_CAP" + }, + { + "xdm:fieldName": "meta_destination_type", + "xdm:stringValue": "WEBSITE" + }, + { + "xdm:fieldName": "meta_promoted_object_type", + "xdm:stringValue": "PAGE" + } + ] + } + } +} diff --git a/components/fieldgroups/paid-media/core-paid-media-adgroup-details.schema.json b/components/fieldgroups/paid-media/core-paid-media-adgroup-details.schema.json new file mode 100644 index 000000000..3fadee044 --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-adgroup-details.schema.json @@ -0,0 +1,323 @@ +{ + "meta:license": [ + "Copyright 2025 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "https://ns.adobe.com/xdm/mixins/paid-media/adgroup-details", + "title": "Core Paid Media Ad Group Details", + "type": "object", + "meta:extensible": true, + "meta:abstract": true, + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/context/record"], + "description": "Ad group-specific details and configuration fields for paid media ad groups/ad sets/ad squads", + "definitions": { + "adgroup-details": { + "properties": { + "xdm:paidMedia": { + "type": "object", + "properties": { + "xdm:adGroupDetails": { + "type": "object", + "title": "Ad Group Details", + "description": "Specific details for paid media ad groups/ad sets/ad squads", + "properties": { + "xdm:adGroupType": { + "type": "string", + "title": "Ad Group Type", + "description": "Type of ad group", + "enum": [ + "standard", + "dynamic", + "smart", + "shopping", + "video", + "app_install", + "lead_generation", + "reach_frequency", + "other" + ], + "meta:enum": { + "standard": "Standard Ad Group", + "dynamic": "Dynamic Ad Group", + "smart": "Smart/Automated Ad Group", + "shopping": "Shopping Ad Group", + "video": "Video Ad Group", + "app_install": "App Install Ad Group", + "lead_generation": "Lead Generation Ad Group", + "reach_frequency": "Reach & Frequency Ad Group", + "other": "Other Ad Group Type" + } + }, + "xdm:childAdType": { + "type": "string", + "title": "Child Ad Type", + "description": "Type of ads contained in this ad group" + }, + "xdm:promotedObject": { + "type": "object", + "title": "Promoted Object", + "description": "Object being promoted at ad group level", + "properties": { + "xdm:objectType": { + "type": "string", + "title": "Object Type" + }, + "xdm:objectID": { + "type": "string", + "title": "Object ID" + }, + "xdm:productSetID": { + "type": "string", + "title": "Product Set ID", + "description": "Product catalog set ID for shopping campaigns" + } + } + }, + "xdm:budgetSettings": { + "type": "object", + "title": "Budget Settings", + "description": "Ad group budget configuration", + "properties": { + "xdm:budgetInMicroCurrency": { + "type": "integer", + "title": "Budget (Micro Currency)", + "description": "Budget amount in micro currency units" + }, + "xdm:bidInMicroCurrency": { + "type": "integer", + "title": "Bid (Micro Currency)", + "description": "Bid amount in micro currency units" + }, + "xdm:bidStrategyType": { + "type": "string", + "title": "Bid Strategy Type", + "enum": [ + "manual_cpc", + "enhanced_cpc", + "maximize_clicks", + "maximize_conversions", + "target_cpa", + "target_roas", + "target_impression_share", + "automatic", + "lowest_cost", + "cost_cap", + "bid_cap", + "min_roas" + ], + "meta:enum": { + "manual_cpc": "Manual CPC", + "enhanced_cpc": "Enhanced CPC", + "maximize_clicks": "Maximize Clicks", + "maximize_conversions": "Maximize Conversions", + "target_cpa": "Target CPA", + "target_roas": "Target ROAS", + "target_impression_share": "Target Impression Share", + "automatic": "Automatic Bidding", + "lowest_cost": "Lowest Cost", + "cost_cap": "Cost Cap", + "bid_cap": "Bid Cap", + "min_roas": "Minimum ROAS" + } + }, + "xdm:targetCpa": { + "type": "number", + "title": "Target CPA", + "description": "Target cost per acquisition" + }, + "xdm:targetRoas": { + "type": "number", + "title": "Target ROAS", + "description": "Target return on ad spend" + }, + "xdm:roasValueMicro": { + "type": "integer", + "title": "ROAS Value (Micro)", + "description": "Desired ROAS value in micro currency" + } + } + }, + "xdm:targeting": { + "$ref": "https://ns.adobe.com/xdm/datatypes/paid-media-targeting", + "title": "Ad Group Targeting", + "description": "Targeting specifications for the ad group" + }, + "xdm:optimizationSettings": { + "type": "object", + "title": "Optimization Settings", + "description": "Ad group optimization configuration", + "properties": { + "xdm:optimizationGoalMetadata": { + "type": "object", + "title": "Optimization Goal Metadata", + "description": "Metadata for optimization goals" + }, + "xdm:conversionWindow": { + "type": "string", + "title": "Conversion Window", + "description": "Delivery optimization window" + }, + "xdm:isAutoTargetingEnabled": { + "type": "boolean", + "title": "Auto Targeting Enabled", + "description": "Whether auto-targeting is enabled" + }, + "xdm:isCampaignOptimization": { + "type": "boolean", + "title": "Campaign Optimization", + "description": "Whether creative optimization is enabled" + } + } + }, + "xdm:placementSettings": { + "type": "object", + "title": "Placement Settings", + "description": "Ad placement configuration", + "properties": { + "xdm:placementGroup": { + "type": "string", + "title": "Placement Group", + "description": "Campaign placement group type" + }, + "xdm:placements": { + "type": "array", + "title": "Placements", + "description": "Specific ad placements", + "items": { + "type": "string" + } + }, + "xdm:deviceTypes": { + "type": "array", + "title": "Device Types", + "description": "Targeted device types", + "items": { + "type": "string" + } + } + } + }, + "xdm:deliverySettings": { + "type": "object", + "title": "Delivery Settings", + "description": "Ad delivery configuration", + "properties": { + "xdm:pacingDeliveryType": { + "type": "string", + "title": "Pacing Delivery Type", + "enum": ["standard", "accelerated"], + "meta:enum": { + "standard": "Standard Delivery", + "accelerated": "Accelerated Delivery" + } + }, + "xdm:deliveryConstraint": { + "type": "string", + "title": "Delivery Constraint", + "description": "Type of delivery constraint" + }, + "xdm:deliveryStatus": { + "type": "string", + "title": "Delivery Status", + "description": "Current delivery status" + }, + "xdm:reachGoal": { + "type": "integer", + "title": "Reach Goal", + "description": "Target reach goal" + }, + "xdm:impressionGoal": { + "type": "integer", + "title": "Impression Goal", + "description": "Target impression goal" + } + } + }, + "xdm:trackingSettings": { + "type": "object", + "title": "Tracking Settings", + "description": "Tracking and measurement configuration", + "properties": { + "xdm:pixelID": { + "type": "string", + "title": "Pixel ID", + "description": "Pixel associated with the ad group" + }, + "xdm:measurementProviderNames": { + "type": "array", + "title": "Measurement Provider Names", + "description": "Approved measurement providers", + "items": { + "type": "string" + } + }, + "xdm:eventSources": { + "type": "array", + "title": "Event Sources", + "description": "Event sources for tracking", + "items": { + "type": "string" + } + }, + "xdm:skadnetworkProperties": { + "type": "object", + "title": "SKAdNetwork Properties", + "description": "SKAdNetwork configuration for iOS", + "properties": { + "xdm:status": { + "type": "string", + "title": "SKAdNetwork Status", + "description": "SKAdNetwork enrollment status" + } + } + }, + "xdm:urlTracking": { + "$ref": "https://ns.adobe.com/xdm/datatypes/paid-media-url-tracking" + } + } + }, + "xdm:brandSafetyConfig": { + "type": "object", + "title": "Brand Safety Configuration", + "description": "Brand safety and content filtering settings", + "properties": { + "xdm:inventoryFilter": { + "type": "string", + "title": "Inventory Filter", + "description": "Brand safety inventory filter level" + }, + "xdm:blockedCategories": { + "type": "array", + "title": "Blocked Categories", + "description": "Content categories to avoid", + "items": { + "type": "string" + } + } + } + }, + "xdm:additionalDetails": { + "title": "Additional Ad Group Details", + "description": "Platform-specific ad group details not defined in core schema. Allows ingestion of arbitrary fields from paid media network APIs without requiring schema changes.", + "type": "array", + "items": { + "$ref": "https://ns.adobe.com/xdm/datatypes/paid-media-additional-field" + } + } + } + } + } + } + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/adgroup-details" + } + ], + "meta:status": "experimental" +} diff --git a/components/fieldgroups/paid-media/core-paid-media-asset-details.example.1.json b/components/fieldgroups/paid-media/core-paid-media-asset-details.example.1.json new file mode 100644 index 000000000..746bf1216 --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-asset-details.example.1.json @@ -0,0 +1,143 @@ +{ + "xdm:paidMedia": { + "xdm:assetDetails": { + "xdm:assetType": "video", + "xdm:title": "Fall Product Launch - 30 Second Hero Video", + "xdm:description": "Introducing our latest product innovation with stunning visuals and compelling storytelling. Features product benefits, customer testimonials, and call-to-action.", + "xdm:mediaProperties": { + "xdm:url": "https://cdn.acmecorp.com/videos/fall-launch-hero-30s.mp4", + "xdm:thumbnailUrl": "https://cdn.acmecorp.com/videos/thumbnails/fall-launch-hero-30s.jpg", + "xdm:previewUrl": "https://cdn.acmecorp.com/videos/previews/fall-launch-hero-30s-preview.mp4", + "xdm:mimeType": "video/mp4", + "xdm:fileSize": 45678912, + "xdm:width": 1920, + "xdm:height": 1080, + "xdm:aspectRatio": "16:9", + "xdm:orientation": "landscape", + "xdm:duration": 30, + "xdm:bitrate": 12000, + "xdm:frameRate": 30, + "xdm:codec": "h264", + "xdm:colorSpace": "sRGB", + "xdm:hasAudio": true, + "xdm:audioCodec": "aac", + "xdm:audioChannels": 2, + "xdm:audioBitrate": 128 + }, + "xdm:fileProperties": { + "xdm:fileName": "fall-launch-hero-30s.mp4", + "xdm:fileHash": "sha256:abc123def456ghi789jkl012mno345pqr678stu901vwx234yz", + "xdm:uploadDate": "2025-10-28T14:30:00Z", + "xdm:lastModifiedDate": "2025-10-28T14:30:00Z", + "xdm:version": "1.0", + "xdm:source": "professional_production", + "xdm:uploadedBy": "user_creative_team_lead" + }, + "xdm:videoProperties": { + "xdm:videoID": "video_987654321012345", + "xdm:videoFormat": "mp4", + "xdm:videoQuality": "hd", + "xdm:videoLength": 30, + "xdm:videoResolution": "1080p", + "xdm:videoOrientation": "landscape", + "xdm:hasSubtitles": true, + "xdm:subtitleLanguages": ["en", "es", "fr"], + "xdm:hasCaptions": true, + "xdm:captionLanguages": ["en"], + "xdm:soundOn": true, + "xdm:autoPlay": true, + "xdm:looping": false, + "xdm:thumbnailTimestamp": 5, + "xdm:videoStyle": "cinematic", + "xdm:videoTone": "inspirational", + "xdm:videoPacing": "fast", + "xdm:sceneCount": 8, + "xdm:transitionStyle": "smooth_cuts", + "xdm:colorGrading": "warm_vibrant", + "xdm:musicTrack": "upbeat_corporate", + "xdm:voiceOver": true, + "xdm:voiceOverLanguage": "en", + "xdm:textOverlays": true, + "xdm:brandLogoPresent": true, + "xdm:productShown": true, + "xdm:peopleShown": true, + "xdm:locationShown": false + }, + "xdm:creativeMetadata": { + "xdm:creativeID": "creative_vid_987654321", + "xdm:creativeName": "Fall Product Launch - 30s Video", + "xdm:creativeVersion": "v2.1", + "xdm:creativeStatus": "approved", + "xdm:creativeCategory": "product_video", + "xdm:creativeTheme": "fall_2025_launch", + "xdm:creativeConcept": "Innovation meets simplicity", + "xdm:targetAudience": "tech_enthusiasts_25_54", + "xdm:brandGuidelines": "compliant", + "xdm:legalApproval": true, + "xdm:legalApprovalDate": "2025-10-30T10:00:00Z", + "xdm:copyrightOwner": "Acme Corporation", + "xdm:licenseType": "owned", + "xdm:rightsExpiration": "perpetual", + "xdm:creativeAgency": "Acme In-House Creative", + "xdm:productionCompany": "Acme Studios", + "xdm:director": "Jane Creative", + "xdm:producer": "John Producer" + }, + "xdm:performanceHints": { + "xdm:recommendedPlacements": [ + "facebook_feed", + "instagram_feed", + "instagram_reels" + ], + "xdm:recommendedDevices": ["mobile", "desktop"], + "xdm:recommendedAudiences": ["tech_enthusiasts", "early_adopters"], + "xdm:estimatedEngagementRate": 0.08, + "xdm:estimatedCompletionRate": 0.65, + "xdm:qualityScore": 8.5, + "xdm:relevanceScore": 9.0, + "xdm:creativeFatigueRisk": "low", + "xdm:seasonality": "fall_winter" + }, + "xdm:accessibilityFeatures": { + "xdm:altText": "30-second video showcasing Acme's new product with dynamic visuals and customer testimonials", + "xdm:closedCaptions": true, + "xdm:audioDescription": false, + "xdm:transcriptAvailable": true, + "xdm:transcriptUrl": "https://cdn.acmecorp.com/videos/transcripts/fall-launch-hero-30s.txt", + "xdm:signLanguage": false, + "xdm:highContrast": false, + "xdm:wcagCompliance": "AA" + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "meta_video_id", + "xdm:stringValue": "987654321012345" + }, + { + "xdm:fieldName": "meta_video_status", + "xdm:stringValue": "ready" + }, + { + "xdm:fieldName": "meta_video_upload_date", + "xdm:stringValue": "2025-10-28T14:30:00Z" + }, + { + "xdm:fieldName": "meta_video_thumbnail_url", + "xdm:stringValue": "https://scontent.xx.fbcdn.net/v/t15.5256-10/video_thumb.jpg" + }, + { + "xdm:fieldName": "meta_video_format_support", + "xdm:stringValue": "feed,story,reels" + }, + { + "xdm:fieldName": "meta_video_captions_auto_generated", + "xdm:stringValue": "false" + }, + { + "xdm:fieldName": "meta_video_sound_collection_id", + "xdm:stringValue": "sound_collection_123456" + } + ] + } + } +} diff --git a/components/fieldgroups/paid-media/core-paid-media-asset-details.example.2.json b/components/fieldgroups/paid-media/core-paid-media-asset-details.example.2.json new file mode 100644 index 000000000..64b534ab0 --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-asset-details.example.2.json @@ -0,0 +1,143 @@ +{ + "xdm:paidMedia": { + "xdm:assetDetails": { + "xdm:assetType": "image", + "xdm:title": "Holiday Sale - Hero Banner Image", + "xdm:description": "Eye-catching hero banner featuring holiday sale messaging with product showcase and promotional offer. Optimized for feed and story placements.", + "xdm:mediaProperties": { + "xdm:url": "https://cdn.acmecorp.com/images/holiday-sale-hero-banner.jpg", + "xdm:thumbnailUrl": "https://cdn.acmecorp.com/images/thumbnails/holiday-sale-hero-banner-thumb.jpg", + "xdm:previewUrl": "https://cdn.acmecorp.com/images/previews/holiday-sale-hero-banner-preview.jpg", + "xdm:mimeType": "image/jpeg", + "xdm:fileSize": 2456789, + "xdm:width": 1200, + "xdm:height": 628, + "xdm:aspectRatio": "1.91:1", + "xdm:orientation": "landscape", + "xdm:duration": 0, + "xdm:bitrate": 0, + "xdm:frameRate": 0, + "xdm:codec": "jpeg", + "xdm:colorSpace": "sRGB", + "xdm:hasAudio": false, + "xdm:audioCodec": "", + "xdm:audioChannels": 0, + "xdm:audioBitrate": 0 + }, + "xdm:fileProperties": { + "xdm:fileName": "holiday-sale-hero-banner.jpg", + "xdm:fileHash": "sha256:xyz789abc456def123ghi890jkl567mno234pqr901stu678vwx345", + "xdm:uploadDate": "2025-11-01T09:00:00Z", + "xdm:lastModifiedDate": "2025-11-01T09:00:00Z", + "xdm:version": "1.0", + "xdm:source": "professional_design", + "xdm:uploadedBy": "user_design_team_lead" + }, + "xdm:imageProperties": { + "xdm:imageID": "image_456789123456789", + "xdm:imageFormat": "jpeg", + "xdm:imageQuality": "high", + "xdm:imageResolution": "1200x628", + "xdm:imageOrientation": "landscape", + "xdm:dpi": 72, + "xdm:colorProfile": "sRGB IEC61966-2.1", + "xdm:hasTransparency": false, + "xdm:isAnimated": false, + "xdm:frameCount": 1, + "xdm:compressionQuality": 90, + "xdm:imageStyle": "modern_clean", + "xdm:imageComposition": "rule_of_thirds", + "xdm:dominantColors": ["#FF6B35", "#004E89", "#FFFFFF"], + "xdm:colorPalette": "warm_vibrant", + "xdm:textOverlay": true, + "xdm:textPercentage": 15, + "xdm:brandLogoPresent": true, + "xdm:productShown": true, + "xdm:peopleShown": false, + "xdm:faceCount": 0, + "xdm:backgroundType": "solid_color", + "xdm:lightingStyle": "bright_even", + "xdm:photographyStyle": "product_photography" + }, + "xdm:creativeMetadata": { + "xdm:creativeID": "creative_img_456789123", + "xdm:creativeName": "Holiday Sale - Hero Banner", + "xdm:creativeVersion": "v1.0", + "xdm:creativeStatus": "approved", + "xdm:creativeCategory": "promotional_image", + "xdm:creativeTheme": "holiday_2025", + "xdm:creativeConcept": "Festive savings celebration", + "xdm:targetAudience": "value_shoppers_all_ages", + "xdm:brandGuidelines": "compliant", + "xdm:legalApproval": true, + "xdm:legalApprovalDate": "2025-11-01T08:00:00Z", + "xdm:copyrightOwner": "Acme Corporation", + "xdm:licenseType": "owned", + "xdm:rightsExpiration": "perpetual", + "xdm:creativeAgency": "Acme In-House Design", + "xdm:productionCompany": "Acme Creative Studio", + "xdm:director": "", + "xdm:producer": "Sarah Designer" + }, + "xdm:performanceHints": { + "xdm:recommendedPlacements": [ + "facebook_feed", + "instagram_feed", + "facebook_marketplace" + ], + "xdm:recommendedDevices": ["mobile", "desktop"], + "xdm:recommendedAudiences": [ + "shoppers", + "deal_seekers", + "holiday_shoppers" + ], + "xdm:estimatedEngagementRate": 0.06, + "xdm:estimatedCompletionRate": 1.0, + "xdm:qualityScore": 9.0, + "xdm:relevanceScore": 8.5, + "xdm:creativeFatigueRisk": "medium", + "xdm:seasonality": "holiday_season" + }, + "xdm:accessibilityFeatures": { + "xdm:altText": "Holiday sale banner featuring 40% off promotion with festive red and blue color scheme and product images", + "xdm:closedCaptions": false, + "xdm:audioDescription": false, + "xdm:transcriptAvailable": false, + "xdm:transcriptUrl": "", + "xdm:signLanguage": false, + "xdm:highContrast": false, + "xdm:wcagCompliance": "AA" + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "meta_image_hash", + "xdm:stringValue": "abc123def456ghi789jkl012" + }, + { + "xdm:fieldName": "meta_image_status", + "xdm:stringValue": "active" + }, + { + "xdm:fieldName": "meta_image_upload_date", + "xdm:stringValue": "2025-11-01T09:00:00Z" + }, + { + "xdm:fieldName": "meta_image_url", + "xdm:stringValue": "https://scontent.xx.fbcdn.net/v/t45.1600-4/image_hash.jpg" + }, + { + "xdm:fieldName": "meta_image_format_support", + "xdm:stringValue": "feed,story,marketplace" + }, + { + "xdm:fieldName": "meta_text_overlay_percentage", + "xdm:stringValue": "15" + }, + { + "xdm:fieldName": "meta_image_quality_score", + "xdm:stringValue": "9.0" + } + ] + } + } +} diff --git a/components/fieldgroups/paid-media/core-paid-media-asset-details.example.3.json b/components/fieldgroups/paid-media/core-paid-media-asset-details.example.3.json new file mode 100644 index 000000000..395e115cc --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-asset-details.example.3.json @@ -0,0 +1,241 @@ +{ + "xdm:paidMedia": { + "xdm:assetDetails": { + "xdm:assetType": "lead_form", + "xdm:title": "Product Demo Request - Instant Form", + "xdm:description": "Lead generation form for product demo requests. Collects contact information and company details for sales follow-up.", + "xdm:mediaProperties": { + "xdm:url": "", + "xdm:thumbnailUrl": "", + "xdm:previewUrl": "", + "xdm:mimeType": "application/json", + "xdm:fileSize": 0, + "xdm:width": 0, + "xdm:height": 0, + "xdm:aspectRatio": "", + "xdm:orientation": "", + "xdm:duration": 0, + "xdm:bitrate": 0, + "xdm:frameRate": 0, + "xdm:codec": "", + "xdm:colorSpace": "", + "xdm:hasAudio": false, + "xdm:audioCodec": "", + "xdm:audioChannels": 0, + "xdm:audioBitrate": 0 + }, + "xdm:fileProperties": { + "xdm:fileName": "product-demo-request-form.json", + "xdm:fileHash": "", + "xdm:uploadDate": "2025-10-25T11:00:00Z", + "xdm:lastModifiedDate": "2025-11-02T14:30:00Z", + "xdm:version": "2.3", + "xdm:source": "meta_lead_ads", + "xdm:uploadedBy": "user_marketing_ops" + }, + "xdm:leadFormProperties": { + "xdm:formID": "form_lead_789123456", + "xdm:formName": "Product Demo Request Form", + "xdm:formType": "instant_form", + "xdm:formVersion": "2.3", + "xdm:formStatus": "active", + "xdm:formLanguage": "en_US", + "xdm:formFields": [ + { + "xdm:fieldName": "full_name", + "xdm:fieldType": "text", + "xdm:fieldLabel": "Full Name", + "xdm:required": true, + "xdm:prefilled": true + }, + { + "xdm:fieldName": "email", + "xdm:fieldType": "email", + "xdm:fieldLabel": "Email Address", + "xdm:required": true, + "xdm:prefilled": true + }, + { + "xdm:fieldName": "phone_number", + "xdm:fieldType": "phone", + "xdm:fieldLabel": "Phone Number", + "xdm:required": true, + "xdm:prefilled": true + }, + { + "xdm:fieldName": "company_name", + "xdm:fieldType": "text", + "xdm:fieldLabel": "Company Name", + "xdm:required": true, + "xdm:prefilled": false + }, + { + "xdm:fieldName": "job_title", + "xdm:fieldType": "text", + "xdm:fieldLabel": "Job Title", + "xdm:required": true, + "xdm:prefilled": false + }, + { + "xdm:fieldName": "company_size", + "xdm:fieldType": "select", + "xdm:fieldLabel": "Company Size", + "xdm:required": true, + "xdm:prefilled": false, + "xdm:options": [ + "1-10", + "11-50", + "51-200", + "201-500", + "501-1000", + "1000+" + ] + }, + { + "xdm:fieldName": "industry", + "xdm:fieldType": "select", + "xdm:fieldLabel": "Industry", + "xdm:required": false, + "xdm:prefilled": false, + "xdm:options": [ + "Technology", + "Healthcare", + "Finance", + "Retail", + "Manufacturing", + "Other" + ] + }, + { + "xdm:fieldName": "timeline", + "xdm:fieldType": "select", + "xdm:fieldLabel": "When are you looking to implement?", + "xdm:required": false, + "xdm:prefilled": false, + "xdm:options": [ + "Immediately", + "1-3 months", + "3-6 months", + "6+ months", + "Just researching" + ] + } + ], + "xdm:customQuestions": [ + { + "xdm:questionText": "What is your primary business challenge?", + "xdm:questionType": "multiple_choice", + "xdm:required": false, + "xdm:options": [ + "Scaling operations", + "Improving efficiency", + "Reducing costs", + "Increasing revenue", + "Other" + ] + } + ], + "xdm:privacyPolicy": { + "xdm:url": "https://www.acmecorp.com/privacy", + "xdm:text": "By submitting this form, you agree to our Privacy Policy and Terms of Service." + }, + "xdm:customDisclaimer": "We respect your privacy. Your information will only be used to contact you about our products and services.", + "xdm:thankYouScreen": { + "xdm:headline": "Thank you for your interest!", + "xdm:description": "A member of our team will contact you within 24 hours to schedule your personalized demo.", + "xdm:ctaButton": { + "xdm:text": "Visit Our Website", + "xdm:url": "https://www.acmecorp.com" + } + }, + "xdm:completionTracking": true, + "xdm:partialSubmissionTracking": false, + "xdm:fieldValidation": true, + "xdm:spamProtection": true, + "xdm:duplicateDetection": true + }, + "xdm:creativeMetadata": { + "xdm:creativeID": "creative_form_789123456", + "xdm:creativeName": "Product Demo Request Form", + "xdm:creativeVersion": "v2.3", + "xdm:creativeStatus": "approved", + "xdm:creativeCategory": "lead_generation_form", + "xdm:creativeTheme": "b2b_lead_gen", + "xdm:creativeConcept": "Frictionless demo request", + "xdm:targetAudience": "b2b_decision_makers", + "xdm:brandGuidelines": "compliant", + "xdm:legalApproval": true, + "xdm:legalApprovalDate": "2025-10-25T10:00:00Z", + "xdm:copyrightOwner": "Acme Corporation", + "xdm:licenseType": "owned", + "xdm:rightsExpiration": "perpetual", + "xdm:creativeAgency": "Acme Marketing Ops", + "xdm:productionCompany": "", + "xdm:director": "", + "xdm:producer": "Mike Marketing" + }, + "xdm:performanceHints": { + "xdm:recommendedPlacements": [ + "facebook_feed", + "instagram_feed", + "messenger_inbox" + ], + "xdm:recommendedDevices": ["mobile", "desktop"], + "xdm:recommendedAudiences": [ + "b2b_decision_makers", + "enterprise_buyers" + ], + "xdm:estimatedEngagementRate": 0.12, + "xdm:estimatedCompletionRate": 0.75, + "xdm:qualityScore": 8.0, + "xdm:relevanceScore": 9.0, + "xdm:creativeFatigueRisk": "low", + "xdm:seasonality": "year_round" + }, + "xdm:accessibilityFeatures": { + "xdm:altText": "Lead generation form for requesting a product demo", + "xdm:closedCaptions": false, + "xdm:audioDescription": false, + "xdm:transcriptAvailable": false, + "xdm:transcriptUrl": "", + "xdm:signLanguage": false, + "xdm:highContrast": false, + "xdm:wcagCompliance": "AA" + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "meta_form_id", + "xdm:stringValue": "789123456789012" + }, + { + "xdm:fieldName": "meta_form_status", + "xdm:stringValue": "ACTIVE" + }, + { + "xdm:fieldName": "meta_form_type", + "xdm:stringValue": "LEAD_GENERATION" + }, + { + "xdm:fieldName": "meta_form_created_date", + "xdm:stringValue": "2025-10-25T11:00:00Z" + }, + { + "xdm:fieldName": "meta_form_updated_date", + "xdm:stringValue": "2025-11-02T14:30:00Z" + }, + { + "xdm:fieldName": "meta_crm_integration", + "xdm:stringValue": "salesforce" + }, + { + "xdm:fieldName": "meta_lead_delivery_method", + "xdm:stringValue": "webhook" + }, + { + "xdm:fieldName": "meta_webhook_url", + "xdm:stringValue": "https://api.acmecorp.com/leads/webhook" + } + ] + } + } +} diff --git a/components/fieldgroups/paid-media/core-paid-media-asset-details.schema.json b/components/fieldgroups/paid-media/core-paid-media-asset-details.schema.json new file mode 100644 index 000000000..c5c674701 --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-asset-details.schema.json @@ -0,0 +1,379 @@ +{ + "meta:license": [ + "Copyright 2025 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "https://ns.adobe.com/xdm/mixins/paid-media/asset-details", + "title": "Core Paid Media Asset Details", + "type": "object", + "meta:extensible": true, + "meta:abstract": true, + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/context/record"], + "description": "Asset-specific details and configuration fields for paid media creative assets", + "definitions": { + "asset-details": { + "properties": { + "xdm:paidMedia": { + "type": "object", + "properties": { + "xdm:assetDetails": { + "type": "object", + "title": "Asset Details", + "description": "Specific details for paid media creative assets", + "properties": { + "xdm:assetType": { + "type": "string", + "title": "Asset Type", + "description": "Type of creative asset", + "enum": [ + "image", + "video", + "audio", + "text", + "html5", + "document", + "lead_form", + "dynamic_education", + "youtube_video", + "other" + ], + "meta:enum": { + "image": "Image Asset", + "video": "Video Asset", + "audio": "Audio Asset", + "text": "Text Asset", + "html5": "HTML5 Asset", + "document": "Document Asset", + "lead_form": "Lead Form Asset", + "dynamic_education": "Dynamic Education Asset", + "youtube_video": "YouTube Video Asset", + "other": "Other Asset Type" + } + }, + "xdm:assetSubType": { + "type": "string", + "title": "Asset Sub-type", + "description": "More specific asset sub-type or format" + }, + "title": { + "type": "string", + "title": "Asset Title", + "description": "Title or name of the asset" + }, + "description": { + "type": "string", + "title": "Asset Description", + "description": "Description of the asset content" + }, + "xdm:content": { + "type": "string", + "title": "Asset Content", + "description": "Text content of the asset (for text assets)" + }, + "xdm:mediaProperties": { + "type": "object", + "title": "Media Properties", + "description": "Properties specific to media assets", + "properties": { + "xdm:url": { + "type": "string", + "title": "Asset URL", + "description": "Direct URL to access the asset" + }, + "xdm:permalinkURL": { + "type": "string", + "title": "Permalink URL", + "description": "Permanent link to the asset" + }, + "xdm:thumbnailURL": { + "type": "string", + "title": "Thumbnail URL", + "description": "URL for asset thumbnail" + }, + "xdm:source": { + "type": "string", + "title": "Source URL", + "description": "Original source URL of the asset" + }, + "xdm:hash": { + "type": "string", + "title": "Asset Hash", + "description": "Unique hash identifier for the asset content" + } + } + }, + "xdm:dimensions": { + "type": "object", + "title": "Asset Dimensions", + "description": "Dimensional properties of the asset", + "properties": { + "xdm:width": { + "type": "integer", + "title": "Width", + "description": "Width in pixels" + }, + "xdm:height": { + "type": "integer", + "title": "Height", + "description": "Height in pixels" + }, + "xdm:aspectRatio": { + "type": "string", + "title": "Aspect Ratio", + "description": "Aspect ratio of the asset (e.g., 16:9, 1:1)" + }, + "xdm:orientation": { + "type": "string", + "title": "Orientation", + "enum": ["landscape", "portrait", "square"], + "meta:enum": { + "landscape": "Landscape", + "portrait": "Portrait", + "square": "Square" + } + } + } + }, + "xdm:fileProperties": { + "type": "object", + "title": "File Properties", + "description": "File-specific properties", + "properties": { + "xdm:fileSize": { + "type": "integer", + "title": "File Size", + "description": "File size in bytes" + }, + "xdm:fileSizeFormatted": { + "type": "string", + "title": "File Size Formatted", + "description": "Human-readable file size (e.g., 2.5 MB)" + }, + "xdm:mimeType": { + "type": "string", + "title": "MIME Type", + "description": "MIME type of the file" + }, + "xdm:fileExtension": { + "type": "string", + "title": "File Extension", + "description": "File extension (e.g., jpg, mp4, pdf)" + }, + "xdm:encoding": { + "type": "string", + "title": "Encoding", + "description": "File encoding format" + } + } + }, + "xdm:videoProperties": { + "type": "object", + "title": "Video Properties", + "description": "Properties specific to video assets", + "properties": { + "xdm:duration": { + "type": "number", + "title": "Duration", + "description": "Video duration in seconds" + }, + "xdm:frameRate": { + "type": "number", + "title": "Frame Rate", + "description": "Video frame rate (fps)" + }, + "xdm:bitrate": { + "type": "integer", + "title": "Bitrate", + "description": "Video bitrate in kbps" + }, + "xdm:codec": { + "type": "string", + "title": "Video Codec", + "description": "Video codec used" + }, + "xdm:hasAudio": { + "type": "boolean", + "title": "Has Audio", + "description": "Whether the video contains audio" + }, + "xdm:youtubeVideoID": { + "type": "string", + "title": "YouTube Video ID", + "description": "YouTube video ID (for YouTube video assets)" + } + } + }, + "xdm:imageProperties": { + "type": "object", + "title": "Image Properties", + "description": "Properties specific to image assets", + "properties": { + "xdm:colorSpace": { + "type": "string", + "title": "Color Space", + "description": "Color space of the image (e.g., RGB, CMYK)" + }, + "xdm:hasTransparency": { + "type": "boolean", + "title": "Has Transparency", + "description": "Whether the image has transparency/alpha channel" + }, + "xdm:isAnimated": { + "type": "boolean", + "title": "Is Animated", + "description": "Whether the image is animated (e.g., GIF)" + }, + "xdm:dominantColors": { + "type": "array", + "title": "Dominant Colors", + "description": "Dominant colors in the image", + "items": { + "type": "string" + } + } + } + }, + "xdm:interactionProperties": { + "type": "object", + "title": "Interaction Properties", + "description": "Properties for interactive assets", + "properties": { + "xdm:interactionType": { + "type": "string", + "title": "Interaction Type", + "description": "Type of interaction supported by the asset" + }, + "xdm:buttonProperties": { + "type": "object", + "title": "Button Properties", + "description": "Properties for interactive buttons" + }, + "xdm:webViewProperties": { + "type": "object", + "title": "Web View Properties", + "description": "Properties for web view interactions", + "properties": { + "xdm:url": { + "type": "string", + "title": "Web View URL", + "description": "URL for web view interaction" + } + } + }, + "xdm:deepLinkProperties": { + "type": "object", + "title": "Deep Link Properties", + "description": "Properties for deep link interactions" + } + } + }, + "xdm:leadFormProperties": { + "type": "object", + "title": "Lead Form Properties", + "description": "Properties specific to lead form assets", + "properties": { + "xdm:backgroundImageAsset": { + "type": "string", + "title": "Background Image Asset", + "description": "Background image asset for lead forms" + }, + "xdm:formFields": { + "type": "array", + "title": "Form Fields", + "description": "Fields included in the lead form", + "items": { + "type": "object", + "properties": { + "xdm:fieldType": { + "type": "string", + "title": "Field Type" + }, + "xdm:fieldLabel": { + "type": "string", + "title": "Field Label" + }, + "xdm:isRequired": { + "type": "boolean", + "title": "Is Required" + } + } + } + } + } + }, + "xdm:dynamicEducationProperties": { + "type": "object", + "title": "Dynamic Education Properties", + "description": "Properties for dynamic education assets", + "properties": { + "xdm:imageURL": { + "type": "string", + "title": "Image URL", + "description": "Main image URL for dynamic education asset" + }, + "xdm:thumbnailImageURL": { + "type": "string", + "title": "Thumbnail Image URL", + "description": "Thumbnail image URL for dynamic education asset" + } + } + }, + "xdm:usageMetadata": { + "type": "object", + "title": "Usage Metadata", + "description": "Metadata about asset usage", + "properties": { + "xdm:usageCount": { + "type": "integer", + "title": "Usage Count", + "description": "Number of times this asset has been used" + }, + "xdm:lastUsedDate": { + "type": "string", + "format": "date-time", + "title": "Last Used Date", + "description": "When the asset was last used" + }, + "xdm:associatedCampaigns": { + "type": "array", + "title": "Associated Campaigns", + "description": "Campaigns that use this asset", + "items": { + "type": "string" + } + }, + "xdm:associatedAds": { + "type": "array", + "title": "Associated Ads", + "description": "Ads that use this asset", + "items": { + "type": "string" + } + } + } + }, + "xdm:additionalDetails": { + "title": "Additional Asset Details", + "description": "Platform-specific asset details not defined in core schema. Allows ingestion of arbitrary fields from paid media network APIs without requiring schema changes.", + "type": "array", + "items": { + "$ref": "https://ns.adobe.com/xdm/datatypes/paid-media-additional-field" + } + } + } + } + } + } + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/asset-details" + } + ], + "meta:status": "experimental" +} diff --git a/components/fieldgroups/paid-media/core-paid-media-attribution-metrics.example.1.json b/components/fieldgroups/paid-media/core-paid-media-attribution-metrics.example.1.json new file mode 100644 index 000000000..a7d0b0ed4 --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-attribution-metrics.example.1.json @@ -0,0 +1,187 @@ +{ + "xdm:paidMedia": { + "xdm:attributionMetrics": { + "xdm:attributionModel": "DATA_DRIVEN", + "xdm:clickAttributionWindow": "30_DAY", + "xdm:viewAttributionWindow": "1_DAY", + "xdm:crossDeviceAttribution": { + "xdm:enabled": true, + "xdm:crossDeviceConversions": 425, + "xdm:crossDeviceConversionRate": 0.34, + "xdm:deviceSwitchRate": 0.42, + "xdm:averageDevicesPerPath": 1.8, + "xdm:devicePathBreakdown": { + "xdm:mobileToDesktop": 245, + "xdm:desktopToMobile": 125, + "xdm:mobileToMobileApp": 55 + } + }, + "xdm:attributionSettings": { + "xdm:primaryModel": "data_driven", + "xdm:comparisonModels": [ + "last_click", + "first_click", + "linear", + "time_decay", + "position_based" + ], + "xdm:clickWindow": "30d", + "xdm:viewWindow": "1d", + "xdm:engagementWindow": "7d", + "xdm:conversionLagDays": 3, + "xdm:crossDevice": true, + "xdm:crossChannel": true, + "xdm:deduplication": true, + "xdm:deduplicationWindow": "24h" + }, + "xdm:attributionBreakdown": { + "xdm:dataDrivernAttribution": { + "xdm:conversions": 1250, + "xdm:conversionValue": 187500, + "xdm:attributedRevenue": 187500, + "xdm:attributionPercentage": 1.0 + }, + "xdm:lastClickAttribution": { + "xdm:conversions": 980, + "xdm:conversionValue": 147000, + "xdm:attributedRevenue": 147000, + "xdm:attributionPercentage": 0.784 + }, + "xdm:firstClickAttribution": { + "xdm:conversions": 1450, + "xdm:conversionValue": 217500, + "xdm:attributedRevenue": 217500, + "xdm:attributionPercentage": 1.16 + }, + "xdm:linearAttribution": { + "xdm:conversions": 1180, + "xdm:conversionValue": 177000, + "xdm:attributedRevenue": 177000, + "xdm:attributionPercentage": 0.944 + }, + "xdm:timeDecayAttribution": { + "xdm:conversions": 1100, + "xdm:conversionValue": 165000, + "xdm:attributedRevenue": 165000, + "xdm:attributionPercentage": 0.88 + }, + "xdm:positionBasedAttribution": { + "xdm:conversions": 1220, + "xdm:conversionValue": 183000, + "xdm:attributedRevenue": 183000, + "xdm:attributionPercentage": 0.976 + } + }, + "xdm:touchpointAnalysis": { + "xdm:averageTouchpoints": 4.2, + "xdm:medianTouchpoints": 3, + "xdm:maxTouchpoints": 15, + "xdm:singleTouchConversions": 180, + "xdm:multiTouchConversions": 1070, + "xdm:assistedConversions": 890, + "xdm:directConversions": 360, + "xdm:touchpointDistribution": { + "xdm:firstTouch": 0.28, + "xdm:midTouch": 0.45, + "xdm:lastTouch": 0.27 + }, + "xdm:averageTimeBetweenTouchpoints": 2.5, + "xdm:averageTimeToConversion": 8.3 + }, + "xdm:channelAttribution": { + "xdm:paidSocial": { + "xdm:touchpoints": 3250, + "xdm:conversions": 625, + "xdm:conversionValue": 93750, + "xdm:attributionCredit": 0.5, + "xdm:assistedConversions": 445, + "xdm:lastTouchConversions": 180 + }, + "xdm:paidSearch": { + "xdm:touchpoints": 2100, + "xdm:conversions": 375, + "xdm:conversionValue": 56250, + "xdm:attributionCredit": 0.3, + "xdm:assistedConversions": 265, + "xdm:lastTouchConversions": 110 + }, + "xdm:display": { + "xdm:touchpoints": 1850, + "xdm:conversions": 125, + "xdm:conversionValue": 18750, + "xdm:attributionCredit": 0.1, + "xdm:assistedConversions": 95, + "xdm:lastTouchConversions": 30 + }, + "xdm:email": { + "xdm:touchpoints": 950, + "xdm:conversions": 125, + "xdm:conversionValue": 18750, + "xdm:attributionCredit": 0.1, + "xdm:assistedConversions": 85, + "xdm:lastTouchConversions": 40 + } + }, + "xdm:conversionPath": { + "xdm:topPaths": [ + { + "xdm:pathSequence": "Paid Social > Paid Search > Email > Paid Social", + "xdm:conversions": 145, + "xdm:conversionValue": 21750, + "xdm:averageTimeToConversion": 12.5, + "xdm:pathLength": 4 + }, + { + "xdm:pathSequence": "Paid Social > Display > Paid Social", + "xdm:conversions": 120, + "xdm:conversionValue": 18000, + "xdm:averageTimeToConversion": 8.2, + "xdm:pathLength": 3 + }, + { + "xdm:pathSequence": "Paid Social > Paid Social", + "xdm:conversions": 95, + "xdm:conversionValue": 14250, + "xdm:averageTimeToConversion": 5.1, + "xdm:pathLength": 2 + } + ], + "xdm:pathComplexity": "medium", + "xdm:averagePathLength": 4.2, + "xdm:mostCommonFirstTouch": "paid_social", + "xdm:mostCommonLastTouch": "paid_social" + }, + "xdm:incrementalityMetrics": { + "xdm:incrementalConversions": 875, + "xdm:incrementalityRate": 0.7, + "xdm:baselineConversions": 375, + "xdm:liftPercentage": 2.33, + "xdm:incrementalROAS": 4.2, + "xdm:controlGroupSize": 50000, + "xdm:testGroupSize": 50000 + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "meta_attribution_setting", + "xdm:stringValue": "7_day_click_1_day_view" + }, + { + "xdm:fieldName": "meta_conversion_tracking_pixel", + "xdm:stringValue": "pixel_123456789" + }, + { + "xdm:fieldName": "meta_attribution_model_version", + "xdm:stringValue": "v3.2" + }, + { + "xdm:fieldName": "meta_cross_device_enabled", + "xdm:stringValue": "true" + }, + { + "xdm:fieldName": "meta_attribution_data_freshness", + "xdm:stringValue": "2025-11-10T08:00:00Z" + } + ] + } + } +} diff --git a/components/fieldgroups/paid-media/core-paid-media-attribution-metrics.schema.json b/components/fieldgroups/paid-media/core-paid-media-attribution-metrics.schema.json new file mode 100644 index 000000000..9b660bb37 --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-attribution-metrics.schema.json @@ -0,0 +1,331 @@ +{ + "meta:license": [ + "Copyright 2025 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "https://ns.adobe.com/xdm/mixins/paid-media/attribution-metrics", + "title": "Core Paid Media Attribution Metrics", + "type": "object", + "meta:extensible": true, + "meta:abstract": true, + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/classes/summarymetrics"], + "description": "Attribution window and methodology details for paid media campaigns", + "definitions": { + "attribution-metrics": { + "properties": { + "xdm:paidMedia": { + "type": "object", + "properties": { + "xdm:attributionMetrics": { + "type": "object", + "title": "Attribution Metrics", + "description": "Attribution window and methodology details", + "properties": { + "xdm:attributionModel": { + "type": "string", + "title": "Attribution Model", + "description": "Attribution model used for conversions", + "enum": [ + "LAST_CLICK", + "FIRST_CLICK", + "LINEAR", + "TIME_DECAY", + "POSITION_BASED", + "DATA_DRIVEN", + "EVEN_CREDIT", + "CUSTOM" + ], + "meta:enum": { + "LAST_CLICK": "Last Click", + "FIRST_CLICK": "First Click", + "LINEAR": "Linear", + "TIME_DECAY": "Time Decay", + "POSITION_BASED": "Position Based", + "DATA_DRIVEN": "Data Driven", + "EVEN_CREDIT": "Even Credit", + "CUSTOM": "Custom Model" + } + }, + "xdm:clickAttributionWindow": { + "type": "string", + "title": "Click Attribution Window", + "description": "Click attribution window (e.g., '7_DAY', '30_DAY', or number of days as string)", + "enum": [ + "1_DAY", + "7_DAY", + "14_DAY", + "28_DAY", + "30_DAY", + "60_DAY", + "90_DAY", + "CUSTOM" + ], + "meta:enum": { + "1_DAY": "1 Day", + "7_DAY": "7 Days", + "14_DAY": "14 Days", + "28_DAY": "28 Days", + "30_DAY": "30 Days", + "60_DAY": "60 Days", + "90_DAY": "90 Days", + "CUSTOM": "Custom Window" + } + }, + "xdm:viewAttributionWindow": { + "type": "string", + "title": "View Attribution Window", + "description": "View attribution window (e.g., '1_DAY', '7_DAY', or number of days as string)", + "enum": [ + "1_DAY", + "7_DAY", + "14_DAY", + "28_DAY", + "30_DAY", + "CUSTOM" + ], + "meta:enum": { + "1_DAY": "1 Day", + "7_DAY": "7 Days", + "14_DAY": "14 Days", + "28_DAY": "28 Days", + "30_DAY": "30 Days", + "CUSTOM": "Custom Window" + } + }, + "xdm:engagementAttributionWindow": { + "type": "string", + "title": "Engagement Attribution Window", + "description": "Engagement attribution window (e.g., '1_DAY', '7_DAY', or number of days as string)", + "enum": [ + "1_DAY", + "7_DAY", + "14_DAY", + "28_DAY", + "30_DAY", + "CUSTOM" + ], + "meta:enum": { + "1_DAY": "1 Day", + "7_DAY": "7 Days", + "14_DAY": "14 Days", + "28_DAY": "28 Days", + "30_DAY": "30 Days", + "CUSTOM": "Custom Window" + } + }, + "xdm:crossDeviceAttribution": { + "type": "object", + "title": "Cross-Device Attribution Metrics", + "description": "Detailed cross-device attribution metrics", + "properties": { + "xdm:enabled": { + "type": "boolean", + "title": "Enabled" + }, + "xdm:crossDeviceConversions": { + "type": "number", + "title": "Cross Device Conversions", + "minimum": 0 + }, + "xdm:crossDeviceConversionRate": { + "type": "number", + "title": "Cross Device Conversion Rate", + "minimum": 0, + "maximum": 1 + }, + "xdm:deviceSwitchRate": { + "type": "number", + "title": "Device Switch Rate", + "minimum": 0, + "maximum": 1 + }, + "xdm:averageDevicesPerPath": { + "type": "number", + "title": "Average Devices Per Path", + "minimum": 0 + }, + "xdm:devicePathBreakdown": { + "type": "object", + "title": "Device Path Breakdown", + "properties": { + "xdm:mobileToDesktop": { + "type": "number", + "minimum": 0 + }, + "xdm:desktopToMobile": { + "type": "number", + "minimum": 0 + }, + "xdm:mobileToMobileApp": { + "type": "number", + "minimum": 0 + } + } + } + } + }, + "xdm:attributionWeight": { + "type": "number", + "title": "Attribution Weight", + "description": "Weight assigned to this touchpoint in attribution", + "minimum": 0, + "maximum": 1 + }, + "xdm:touchpointPosition": { + "type": "string", + "title": "Touchpoint Position", + "description": "Position of this touchpoint in the customer journey", + "enum": ["first", "middle", "last", "only"], + "meta:enum": { + "first": "First Touchpoint", + "middle": "Middle Touchpoint", + "last": "Last Touchpoint", + "only": "Only Touchpoint" + } + }, + "xdm:touchpointSequence": { + "type": "integer", + "title": "Touchpoint Sequence", + "description": "Sequence number of this touchpoint in the journey", + "minimum": 1 + }, + "xdm:totalTouchpoints": { + "type": "integer", + "title": "Total Touchpoints", + "description": "Total number of touchpoints in the conversion path", + "minimum": 1 + }, + "xdm:pathLength": { + "type": "integer", + "title": "Path Length", + "description": "Length of the conversion path in days", + "minimum": 0 + }, + "xdm:timeToConversion": { + "type": "number", + "title": "Time to Conversion", + "description": "Time from this touchpoint to conversion in hours", + "minimum": 0 + }, + "xdm:attributionConfidence": { + "type": "number", + "title": "Attribution Confidence", + "description": "Confidence score for the attribution", + "minimum": 0, + "maximum": 1 + }, + "xdm:incrementalImpact": { + "type": "number", + "title": "Incremental Impact", + "description": "Incremental impact of this touchpoint on conversion", + "minimum": 0, + "maximum": 1 + }, + "xdm:baselineConversions": { + "type": "number", + "title": "Baseline Conversions", + "description": "Expected conversions without this touchpoint", + "minimum": 0 + }, + "xdm:incrementalConversions": { + "type": "number", + "title": "Incremental Conversions", + "description": "Additional conversions attributed to this touchpoint", + "minimum": 0 + }, + "xdm:liftPercentage": { + "type": "number", + "title": "Lift Percentage", + "description": "Percentage lift in conversions due to this touchpoint", + "minimum": 0 + }, + "xdm:attributionMethodology": { + "type": "object", + "title": "Attribution Methodology", + "description": "Details about the attribution methodology used", + "properties": { + "xdm:algorithmType": { + "type": "string", + "title": "Algorithm Type", + "description": "Type of attribution algorithm used" + }, + "xdm:modelVersion": { + "type": "string", + "title": "Model Version", + "description": "Version of the attribution model" + }, + "xdm:trainingPeriod": { + "type": "string", + "title": "Training Period", + "description": "Period used to train the attribution model" + }, + "xdm:dataQuality": { + "type": "number", + "title": "Data Quality", + "description": "Quality score of data used for attribution", + "minimum": 0, + "maximum": 1 + }, + "xdm:sampleSize": { + "type": "integer", + "title": "Sample Size", + "description": "Sample size used for attribution modeling", + "minimum": 0 + } + } + }, + "xdm:crossChannelAttribution": { + "type": "object", + "title": "Cross-Channel Attribution", + "description": "Attribution across different marketing channels", + "properties": { + "xdm:channelContribution": { + "type": "number", + "title": "Channel Contribution", + "description": "This channel's contribution to the conversion", + "minimum": 0, + "maximum": 1 + }, + "xdm:channelSequence": { + "type": "array", + "title": "Channel Sequence", + "description": "Sequence of channels in the conversion path", + "items": { + "type": "object", + "properties": { + "xdm:channel": { + "type": "string" + }, + "xdm:position": { + "type": "integer" + }, + "xdm:weight": { + "type": "number" + } + } + } + }, + "xdm:dominantChannel": { + "type": "string", + "title": "Dominant Channel", + "description": "Channel with the highest attribution weight" + } + } + } + } + } + } + } + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/attribution-metrics" + } + ], + "meta:status": "experimental" +} diff --git a/components/fieldgroups/paid-media/core-paid-media-campaign-details.example.1.json b/components/fieldgroups/paid-media/core-paid-media-campaign-details.example.1.json new file mode 100644 index 000000000..6d36b6494 --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-campaign-details.example.1.json @@ -0,0 +1,183 @@ +{ + "xdm:paidMedia": { + "xdm:campaignDetails": { + "xdm:campaignType": "traffic", + "xdm:subType": "link_clicks", + "xdm:isAutomatedCampaign": false, + "xdm:promotedObject": { + "xdm:objectType": "page", + "xdm:objectID": "page_acmecorp_official", + "xdm:pageID": "123456789012345", + "xdm:pixelID": "pixel_123456789", + "xdm:customEventType": "LINK_CLICK", + "xdm:applicationID": "app_456789123", + "xdm:productCatalogID": "catalog_987654321", + "xdm:productSetID": "product_set_123456", + "xdm:offlineConversionDataSetID": "", + "xdm:destinationURL": "https://www.acmecorp.com/fall-launch" + }, + "xdm:budgetSettings": { + "xdm:budgetType": "daily", + "xdm:dailyBudget": 2000, + "xdm:lifetimeBudget": 0, + "xdm:totalBudget": 60000, + "xdm:budgetRemaining": 42500, + "xdm:budgetSpent": 17500, + "xdm:budgetUtilization": 0.292, + "xdm:pacing": "standard", + "xdm:pacingType": "standard", + "xdm:campaignBudgetOptimization": true, + "xdm:cboEnabled": true, + "xdm:budgetRebalancing": true, + "xdm:spendCap": 2500, + "xdm:bidCap": 0, + "xdm:costCap": 0 + }, + "xdm:targetingStrategy": { + "xdm:targetingExpansion": true, + "xdm:detailedTargetingExpansion": "expansion_all", + "xdm:advantagePlusAudience": false, + "xdm:advantagePlusCreative": false, + "xdm:advantagePlusCatalog": false, + "xdm:lookalikExpansion": true, + "xdm:automaticPlacements": true, + "xdm:dynamicCreative": false + }, + "xdm:schedulingSettings": { + "xdm:startDate": "2025-11-01T00:00:00Z", + "xdm:endDate": "2025-11-30T23:59:59Z", + "xdm:scheduleType": "continuous", + "xdm:runContinuously": false, + "xdm:dayParting": false, + "xdm:dayPartingSchedule": [], + "xdm:timezone": "America/Los_Angeles", + "xdm:flightDates": [ + { + "xdm:startDate": "2025-11-01T00:00:00Z", + "xdm:endDate": "2025-11-30T23:59:59Z" + } + ] + }, + "xdm:frequencyCapping": { + "xdm:enabled": true, + "xdm:impressionCap": 5, + "xdm:timePeriod": "week", + "xdm:timePeriodDays": 7, + "xdm:applyToAllAdSets": true, + "xdm:resetFrequency": "weekly" + }, + "xdm:conversionTracking": { + "xdm:pixelID": "pixel_123456789", + "xdm:conversionEvents": [ + "PageView", + "ViewContent", + "AddToCart", + "InitiateCheckout", + "Purchase" + ], + "xdm:customConversions": [ + { + "xdm:eventName": "ProductPageView", + "xdm:eventID": "custom_event_001", + "xdm:eventValue": 0 + }, + { + "xdm:eventName": "DemoRequest", + "xdm:eventID": "custom_event_002", + "xdm:eventValue": 50 + } + ], + "xdm:offlineConversions": false, + "xdm:serverSideTracking": true, + "xdm:conversionAPI": true, + "xdm:deduplication": true, + "xdm:attributionWindow": "7d_click_1d_view" + }, + "xdm:optimizationSettings": { + "xdm:objective": "OUTCOME_TRAFFIC", + "xdm:optimizationGoal": "LINK_CLICKS", + "xdm:billingEvent": "IMPRESSIONS", + "xdm:bidStrategy": "LOWEST_COST_WITHOUT_CAP", + "xdm:pacing": "standard", + "xdm:deliveryType": "standard", + "xdm:learningPhase": "learning", + "xdm:autoOptimization": true + }, + "xdm:ios14Settings": { + "xdm:campaignOptedIn": true, + "xdm:attOptimization": true, + "xdm:aggregatedEventMeasurement": true, + "xdm:prioritizedEvents": ["Purchase", "AddToCart", "ViewContent"], + "xdm:domainVerification": true, + "xdm:verifiedDomain": "acmecorp.com", + "xdm:skadnetworkEnabled": true, + "xdm:conversionValueSchema": "default" + }, + "xdm:brandSafety": { + "xdm:inventoryFilter": "standard", + "xdm:blockLists": ["block_list_sensitive_content"], + "xdm:contentCategories": [ + "news", + "entertainment", + "technology", + "business" + ], + "xdm:excludedCategories": ["mature_content", "political", "gambling"], + "xdm:publisherBlockLists": [], + "xdm:appBlockLists": [], + "xdm:brandSuitability": "standard" + }, + "xdm:creativeSettings": { + "xdm:dynamicCreative": false, + "xdm:multiAdvertiserAds": false, + "xdm:catalogAds": false, + "xdm:collectionAds": false, + "xdm:instantExperience": false, + "xdm:videoPolling": false, + "xdm:playableAds": false + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "meta_campaign_id", + "xdm:stringValue": "23851234567890789" + }, + { + "xdm:fieldName": "meta_campaign_name", + "xdm:stringValue": "Fall 2025 Product Launch - Traffic Campaign" + }, + { + "xdm:fieldName": "meta_objective", + "xdm:stringValue": "OUTCOME_TRAFFIC" + }, + { + "xdm:fieldName": "meta_buying_type", + "xdm:stringValue": "AUCTION" + }, + { + "xdm:fieldName": "meta_special_ad_categories", + "xdm:stringValue": "NONE" + }, + { + "xdm:fieldName": "meta_campaign_budget_optimization", + "xdm:stringValue": "true" + }, + { + "xdm:fieldName": "meta_bid_strategy", + "xdm:stringValue": "LOWEST_COST_WITHOUT_CAP" + }, + { + "xdm:fieldName": "meta_campaign_spending_limit", + "xdm:stringValue": "2500" + }, + { + "xdm:fieldName": "meta_campaign_status", + "xdm:stringValue": "ACTIVE" + }, + { + "xdm:fieldName": "meta_effective_status", + "xdm:stringValue": "ACTIVE" + } + ] + } + } +} diff --git a/components/fieldgroups/paid-media/core-paid-media-campaign-details.schema.json b/components/fieldgroups/paid-media/core-paid-media-campaign-details.schema.json new file mode 100644 index 000000000..51c068bfb --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-campaign-details.schema.json @@ -0,0 +1,463 @@ +{ + "meta:license": [ + "Copyright 2025 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "https://ns.adobe.com/xdm/mixins/paid-media/campaign-details", + "title": "Core Paid Media Campaign Details", + "type": "object", + "meta:extensible": true, + "meta:abstract": true, + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/context/record"], + "description": "Campaign-specific details and configuration fields for paid media campaigns", + "definitions": { + "campaign-details": { + "properties": { + "xdm:paidMedia": { + "type": "object", + "properties": { + "xdm:campaignDetails": { + "type": "object", + "title": "Campaign Details", + "description": "Specific details for paid media campaigns", + "properties": { + "xdm:campaignType": { + "type": "string", + "title": "Campaign Type", + "description": "Type of campaign", + "enum": [ + "search", + "display", + "video", + "shopping", + "social", + "mobile_app", + "connected_tv", + "audio", + "native", + "lead_generation", + "catalog_sales", + "sponsored_products", + "sponsored_brands", + "sponsored_display", + "sponsored_tv", + "traffic", + "other" + ], + "meta:enum": { + "search": "Search Campaign", + "display": "Display Campaign", + "video": "Video Campaign", + "shopping": "Shopping Campaign", + "social": "Social Media Campaign", + "mobile_app": "Mobile App Campaign", + "connected_tv": "Connected TV Campaign", + "audio": "Audio Campaign", + "native": "Native Campaign", + "lead_generation": "Lead Generation Campaign", + "catalog_sales": "Catalog Sales Campaign", + "sponsored_products": "Sponsored Products (Amazon)", + "sponsored_brands": "Sponsored Brands (Amazon)", + "sponsored_display": "Sponsored Display (Amazon)", + "sponsored_tv": "Sponsored TV (Amazon)", + "traffic": "Traffic Campaign", + "other": "Other Campaign Type" + } + }, + "xdm:subType": { + "type": "string", + "title": "Campaign Sub-type", + "description": "More specific campaign sub-type or format" + }, + "xdm:promotedObject": { + "type": "object", + "title": "Promoted Object", + "description": "Object being promoted by the campaign", + "properties": { + "xdm:objectType": { + "type": "string", + "title": "Object Type", + "enum": [ + "page", + "app", + "product", + "event", + "website", + "catalog", + "other" + ], + "meta:enum": { + "page": "Social Media Page", + "app": "Mobile App", + "product": "Product/Service", + "event": "Event", + "website": "Website", + "catalog": "Product Catalog", + "other": "Other Object" + } + }, + "xdm:objectID": { + "type": "string", + "title": "Object ID", + "description": "ID of the promoted object" + }, + "xdm:objectName": { + "type": "string", + "title": "Object Name", + "description": "Name of the promoted object" + }, + "xdm:objectURL": { + "type": "string", + "title": "Object URL", + "description": "URL of the promoted object" + } + } + }, + "xdm:budgetSettings": { + "type": "object", + "title": "Budget Settings", + "description": "Campaign budget configuration", + "properties": { + "xdm:isCampaignBudgetOptimization": { + "type": "boolean", + "title": "Campaign Budget Optimization", + "description": "Whether campaign uses automatic budget optimization" + }, + "xdm:spendCap": { + "type": "number", + "title": "Spend Cap", + "description": "Maximum amount that can be spent", + "minimum": 0 + }, + "xdm:bidStrategy": { + "type": "string", + "title": "Bid Strategy", + "description": "Bidding strategy for the campaign" + }, + "xdm:bidAmount": { + "type": "number", + "title": "Bid Amount", + "description": "Bid amount or target cost" + } + } + }, + "xdm:targeting": { + "$ref": "https://ns.adobe.com/xdm/datatypes/paid-media-targeting", + "title": "Campaign Targeting", + "description": "Targeting specifications for the campaign" + }, + "xdm:scheduling": { + "type": "object", + "title": "Campaign Scheduling", + "description": "Campaign scheduling settings", + "properties": { + "xdm:isAlwaysOn": { + "type": "boolean", + "title": "Always On", + "description": "Whether campaign runs continuously" + }, + "xdm:flightDates": { + "type": "array", + "title": "Flight Dates", + "description": "Campaign flight periods", + "items": { + "type": "object", + "properties": { + "xdm:startDate": { + "type": "string", + "format": "date-time", + "title": "Flight Start Date" + }, + "xdm:endDate": { + "type": "string", + "format": "date-time", + "title": "Flight End Date" + }, + "xdm:budget": { + "type": "number", + "title": "Flight Budget", + "minimum": 0 + } + } + } + }, + "xdm:dayParting": { + "type": "object", + "title": "Day Parting", + "description": "Time-of-day scheduling", + "properties": { + "xdm:enabled": { + "type": "boolean", + "title": "Day Parting Enabled" + }, + "xdm:schedule": { + "type": "array", + "title": "Schedule", + "items": { + "type": "object", + "properties": { + "xdm:dayOfWeek": { + "type": "string", + "enum": [ + "monday", + "tuesday", + "wednesday", + "thursday", + "friday", + "saturday", + "sunday" + ] + }, + "xdm:startHour": { + "type": "integer", + "minimum": 0, + "maximum": 23 + }, + "xdm:endHour": { + "type": "integer", + "minimum": 0, + "maximum": 23 + } + } + } + } + } + } + } + }, + "xdm:frequencyCapping": { + "type": "object", + "title": "Frequency Capping", + "description": "Frequency cap settings", + "properties": { + "xdm:enabled": { + "type": "boolean", + "title": "Frequency Capping Enabled" + }, + "xdm:impressionCap": { + "type": "integer", + "title": "Impression Cap", + "description": "Maximum impressions per user" + }, + "xdm:timePeriod": { + "type": "string", + "title": "Time Period", + "enum": ["hour", "day", "week", "month"], + "meta:enum": { + "hour": "Per Hour", + "day": "Per Day", + "week": "Per Week", + "month": "Per Month" + } + } + } + }, + "xdm:conversionTracking": { + "type": "object", + "title": "Conversion Tracking", + "description": "Conversion tracking configuration", + "properties": { + "xdm:pixelIDs": { + "type": "array", + "title": "Pixel IDs", + "description": "Tracking pixel IDs associated with campaign", + "items": { + "type": "string" + } + }, + "xdm:conversionEvents": { + "type": "array", + "title": "Conversion Events", + "description": "Events being tracked for conversions", + "items": { + "type": "string" + } + }, + "xdm:attributionWindow": { + "type": "string", + "title": "Attribution Window", + "description": "Attribution window as a string (e.g., '7d_click_1d_view')" + }, + "xdm:urlTracking": { + "$ref": "https://ns.adobe.com/xdm/datatypes/paid-media-url-tracking" + } + } + }, + "xdm:ios14CampaignType": { + "type": "string", + "title": "iOS 14 Campaign Type", + "description": "Campaign type for iOS 14+ attribution handling", + "enum": [ + "REGULAR_CAMPAIGN", + "IOS14_CAMPAIGN", + "ADVANCED_DEDICATED_CAMPAIGN" + ], + "meta:enum": { + "REGULAR_CAMPAIGN": "Regular Campaign", + "IOS14_CAMPAIGN": "iOS 14 Dedicated Campaign", + "ADVANCED_DEDICATED_CAMPAIGN": "Advanced Dedicated Campaign" + } + }, + "xdm:skanEnabled": { + "type": "boolean", + "title": "SKAN Enabled", + "description": "Whether SKAdNetwork (Apple's attribution framework) is enabled for this campaign" + }, + "xdm:skanPostbackWindow": { + "type": "string", + "title": "SKAN Postback Window", + "description": "SKAN 4.0 postback window mode selection", + "enum": [ + "POSTBACK_WINDOW_MODE1", + "POSTBACK_WINDOW_MODE2", + "POSTBACK_WINDOW_MODE3" + ], + "meta:enum": { + "POSTBACK_WINDOW_MODE1": "Postback Window 1 (0-2 days)", + "POSTBACK_WINDOW_MODE2": "Postback Window 2 (3-7 days)", + "POSTBACK_WINDOW_MODE3": "Postback Window 3 (8-35 days)" + } + }, + "xdm:appProfilePageEnabled": { + "type": "boolean", + "title": "App Profile Page Enabled", + "description": "Whether App Profile Page is enabled for the campaign" + }, + "xdm:isAutomatedCampaign": { + "type": "boolean", + "title": "Is Automated Campaign", + "description": "Whether this is an automated/smart campaign with machine learning optimization" + }, + "xdm:automatedCampaignType": { + "type": "string", + "title": "Automated Campaign Type", + "description": "Specific type of automated campaign", + "enum": [ + "SMART_PLUS", + "SMART_PERFORMANCE_WEB", + "PERFORMANCE_MAX", + "MAXIMUM_DELIVERY", + "AUTO_CAMPAIGN", + "DYNAMIC_CREATIVE", + "GMV_MAX", + "OTHER" + ], + "meta:enum": { + "SMART_PLUS": "Smart+ Campaign (TikTok)", + "SMART_PERFORMANCE_WEB": "Smart Performance Web Campaign (TikTok)", + "PERFORMANCE_MAX": "Performance Max (Google)", + "MAXIMUM_DELIVERY": "Maximum Delivery (LinkedIn)", + "AUTO_CAMPAIGN": "Auto Campaign (Amazon)", + "DYNAMIC_CREATIVE": "Dynamic Creative Optimization", + "GMV_MAX": "GMV Max Campaign (TikTok)", + "OTHER": "Other Automated Type" + } + }, + "xdm:catalogId": { + "type": "string", + "title": "Catalog ID", + "description": "Product catalog identifier for catalog-based campaigns" + }, + "xdm:catalogAuthorizedBusinessCenterId": { + "type": "string", + "title": "Catalog Authorized Business Center ID", + "description": "Business Center ID that authorized the catalog access" + }, + "xdm:productSource": { + "type": "string", + "title": "Product Source", + "description": "Source of products for the campaign", + "enum": [ + "CATALOG", + "STORE", + "TIKTOK_SHOP", + "AMAZON", + "SHOPIFY", + "MANUAL", + "OTHER" + ], + "meta:enum": { + "CATALOG": "Product Catalog", + "STORE": "Online Store", + "TIKTOK_SHOP": "TikTok Shop", + "AMAZON": "Amazon Store", + "SHOPIFY": "Shopify Store", + "MANUAL": "Manually Selected Products", + "OTHER": "Other Product Source" + } + }, + "xdm:productSetId": { + "type": "string", + "title": "Product Set ID", + "description": "Specific product set within catalog" + }, + "xdm:storeId": { + "type": "string", + "title": "Store ID", + "description": "Online store identifier (e.g., TikTok Shop ID, Amazon Store ID)" + }, + "xdm:storeAuthorizedBusinessCenterId": { + "type": "string", + "title": "Store Authorized Business Center ID", + "description": "Business Center ID that authorized the store access" + }, + "xdm:placementBidAdjustments": { + "type": "array", + "title": "Placement Bid Adjustments", + "description": "Bid adjustment percentages by ad placement", + "items": { + "type": "object", + "properties": { + "xdm:placement": { + "type": "string", + "title": "Placement", + "description": "Placement identifier (e.g., TOP_OF_SEARCH, PRODUCT_PAGE, HOME, DETAIL_PAGE)" + }, + "xdm:placementType": { + "type": "string", + "title": "Placement Type", + "description": "Type of placement", + "enum": [ + "SEARCH", + "PRODUCT_PAGE", + "HOME", + "FEED", + "STORIES", + "REELS", + "OTHER" + ] + }, + "xdm:adjustmentPercentage": { + "type": "number", + "title": "Adjustment Percentage", + "description": "Bid adjustment percentage (e.g., 50 for +50%, -25 for -25%)" + } + }, + "required": ["xdm:placement", "xdm:adjustmentPercentage"] + } + }, + "xdm:additionalDetails": { + "title": "Additional Campaign Details", + "description": "Platform-specific campaign details not defined in core schema. Allows ingestion of arbitrary fields from paid media network APIs without requiring schema changes.", + "type": "array", + "items": { + "$ref": "https://ns.adobe.com/xdm/datatypes/paid-media-additional-field" + } + } + } + } + } + } + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/campaign-details" + } + ], + "meta:status": "experimental" +} diff --git a/components/fieldgroups/paid-media/core-paid-media-conversion-metrics.example.1.json b/components/fieldgroups/paid-media/core-paid-media-conversion-metrics.example.1.json new file mode 100644 index 000000000..e40610098 --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-conversion-metrics.example.1.json @@ -0,0 +1,126 @@ +{ + "xdm:paidMedia": { + "xdm:conversionMetrics": { + "xdm:postClickConversions": 1250, + "xdm:postViewConversions": 385, + "xdm:postEngagementConversions": 125, + "xdm:totalConversions": 1760, + "xdm:conversionRate": 0.0352, + "xdm:costPerAction": 10.23, + "xdm:conversionsByType": { + "xdm:purchases": 875, + "xdm:addToCart": 2340, + "xdm:initiateCheckout": 1450, + "xdm:leads": 245, + "xdm:registrations": 180, + "xdm:downloads": 320, + "xdm:subscriptions": 95, + "xdm:customEvents": 125 + }, + "xdm:conversionValue": { + "xdm:totalValue": 187500, + "xdm:averageOrderValue": 214.29, + "xdm:purchaseValue": 187500, + "xdm:leadValue": 12250, + "xdm:registrationValue": 9000, + "xdm:subscriptionValue": 28500, + "xdm:customEventValue": 6250 + }, + "xdm:conversionTiming": { + "xdm:averageTimeToConversion": 8.3, + "xdm:medianTimeToConversion": 5.2, + "xdm:conversionsWithin1Day": 425, + "xdm:conversionsWithin3Days": 780, + "xdm:conversionsWithin7Days": 1250, + "xdm:conversionsWithin14Days": 1520, + "xdm:conversionsWithin30Days": 1760, + "xdm:conversionLag": 8.3 + }, + "xdm:conversionPath": { + "xdm:averagePathLength": 4.2, + "xdm:medianPathLength": 3, + "xdm:singleTouchConversions": 180, + "xdm:multiTouchConversions": 1580, + "xdm:averageTouchpoints": 4.2, + "xdm:assistedConversions": 890, + "xdm:directConversions": 870 + }, + "xdm:conversionQuality": { + "xdm:repeatPurchaseRate": 0.32, + "xdm:customerLifetimeValue": 642.5, + "xdm:averageSessionDuration": 245, + "xdm:bounceRate": 0.18, + "xdm:pagesPerSession": 5.8, + "xdm:engagementScore": 7.5, + "xdm:qualityScore": 8.2 + }, + "xdm:leadMetrics": { + "xdm:totalLeads": 245, + "xdm:qualifiedLeads": 185, + "xdm:leadQualificationRate": 0.755, + "xdm:salesQualifiedLeads": 125, + "xdm:marketingQualifiedLeads": 185, + "xdm:leadToOpportunityRate": 0.51, + "xdm:leadToCustomerRate": 0.28, + "xdm:averageLeadScore": 72, + "xdm:costPerLead": 73.47, + "xdm:costPerQualifiedLead": 97.3 + }, + "xdm:microConversions": { + "xdm:pageViews": 45000, + "xdm:productViews": 12500, + "xdm:videoViews": 8900, + "xdm:formStarts": 890, + "xdm:formCompletions": 245, + "xdm:emailSignups": 320, + "xdm:socialShares": 456, + "xdm:wishlistAdds": 678, + "xdm:storeLocatorSearches": 234 + }, + "xdm:conversionFunnel": { + "xdm:impressions": 50000, + "xdm:clicks": 2500, + "xdm:landingPageViews": 2340, + "xdm:productViews": 1850, + "xdm:addToCart": 980, + "xdm:initiateCheckout": 625, + "xdm:purchases": 875, + "xdm:clickToLandingRate": 0.936, + "xdm:landingToProductRate": 0.791, + "xdm:productToCartRate": 0.53, + "xdm:cartToCheckoutRate": 0.638, + "xdm:checkoutToPurchaseRate": 1.4 + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "meta_conversion_tracking_pixel", + "xdm:stringValue": "pixel_123456789" + }, + { + "xdm:fieldName": "meta_attribution_window", + "xdm:stringValue": "7_day_click_1_day_view" + }, + { + "xdm:fieldName": "meta_conversion_api_enabled", + "xdm:stringValue": "true" + }, + { + "xdm:fieldName": "meta_deduplication_enabled", + "xdm:stringValue": "true" + }, + { + "xdm:fieldName": "meta_server_side_tracking", + "xdm:stringValue": "true" + }, + { + "xdm:fieldName": "meta_conversion_value_currency", + "xdm:stringValue": "USD" + }, + { + "xdm:fieldName": "meta_offline_conversions_enabled", + "xdm:stringValue": "false" + } + ] + } + } +} diff --git a/components/fieldgroups/paid-media/core-paid-media-conversion-metrics.schema.json b/components/fieldgroups/paid-media/core-paid-media-conversion-metrics.schema.json new file mode 100644 index 000000000..2b28d41f2 --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-conversion-metrics.schema.json @@ -0,0 +1,267 @@ +{ + "meta:license": [ + "Copyright 2025 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "https://ns.adobe.com/xdm/mixins/paid-media/conversion-metrics", + "title": "Core Paid Media Conversion Metrics", + "type": "object", + "meta:extensible": true, + "meta:abstract": true, + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/classes/summarymetrics"], + "description": "Detailed conversion tracking metrics for paid media campaigns", + "definitions": { + "conversion-metrics": { + "properties": { + "xdm:paidMedia": { + "type": "object", + "properties": { + "xdm:conversionMetrics": { + "type": "object", + "title": "Conversion Metrics", + "description": "Detailed conversion tracking metrics", + "properties": { + "xdm:postClickConversions": { + "type": "number", + "title": "Post-Click Conversions", + "description": "Conversions attributed to clicks", + "minimum": 0 + }, + "xdm:postViewConversions": { + "type": "number", + "title": "Post-View Conversions", + "description": "Conversions attributed to views", + "minimum": 0 + }, + "xdm:postEngagementConversions": { + "type": "number", + "title": "Post-Engagement Conversions", + "description": "Conversions attributed to engagements", + "minimum": 0 + }, + "xdm:conversionsByType": { + "type": "object", + "title": "Conversions by Type", + "description": "Breakdown of conversions by event type", + "properties": { + "xdm:purchases": { + "type": "number", + "title": "Purchases", + "minimum": 0 + }, + "xdm:addToCart": { + "type": "number", + "title": "Add to Cart", + "minimum": 0 + }, + "xdm:initiateCheckout": { + "type": "number", + "title": "Initiate Checkout", + "minimum": 0 + }, + "xdm:leads": { + "type": "number", + "title": "Leads", + "minimum": 0 + }, + "xdm:registrations": { + "type": "number", + "title": "Registrations", + "minimum": 0 + }, + "xdm:downloads": { + "type": "number", + "title": "Downloads", + "minimum": 0 + }, + "xdm:subscriptions": { + "type": "number", + "title": "Subscriptions", + "minimum": 0 + }, + "xdm:customEvents": { + "type": "number", + "title": "Custom Events", + "minimum": 0 + } + } + }, + "xdm:conversionRate": { + "type": "number", + "title": "Conversion Rate", + "description": "Overall conversion rate", + "minimum": 0, + "maximum": 1 + }, + "xdm:costPerAction": { + "type": "number", + "title": "Cost Per Action", + "description": "Average cost per conversion action", + "minimum": 0 + }, + "xdm:conversionLag": { + "type": "number", + "title": "Conversion Lag", + "description": "Average time from ad interaction to conversion (in hours)", + "minimum": 0 + }, + "xdm:conversionPath": { + "type": "object", + "title": "Conversion Path Metrics", + "description": "Metrics about the conversion path and touchpoints", + "properties": { + "xdm:averagePathLength": { + "type": "number", + "title": "Average Path Length", + "minimum": 0 + }, + "xdm:medianPathLength": { + "type": "number", + "title": "Median Path Length", + "minimum": 0 + }, + "xdm:singleTouchConversions": { + "type": "number", + "title": "Single Touch Conversions", + "minimum": 0 + }, + "xdm:multiTouchConversions": { + "type": "number", + "title": "Multi Touch Conversions", + "minimum": 0 + }, + "xdm:averageTouchpoints": { + "type": "number", + "title": "Average Touchpoints", + "minimum": 0 + }, + "xdm:assistedConversions": { + "type": "number", + "title": "Assisted Conversions", + "minimum": 0 + }, + "xdm:directConversions": { + "type": "number", + "title": "Direct Conversions", + "minimum": 0 + } + } + }, + "xdm:assistedConversions": { + "type": "number", + "title": "Assisted Conversions", + "description": "Conversions where this ad assisted but wasn't the last touch", + "minimum": 0 + }, + "xdm:directConversions": { + "type": "number", + "title": "Direct Conversions", + "description": "Conversions where this ad was the last touch", + "minimum": 0 + }, + "xdm:newCustomerConversions": { + "type": "number", + "title": "New Customer Conversions", + "description": "Conversions from new customers", + "minimum": 0 + }, + "xdm:returningCustomerConversions": { + "type": "number", + "title": "Returning Customer Conversions", + "description": "Conversions from returning customers", + "minimum": 0 + }, + "xdm:averageOrderValue": { + "type": "number", + "title": "Average Order Value", + "description": "Average value per conversion", + "minimum": 0 + }, + "xdm:totalOrderValue": { + "type": "number", + "title": "Total Order Value", + "description": "Total value of all conversions", + "minimum": 0 + }, + "xdm:conversionQuality": { + "type": "object", + "title": "Conversion Quality", + "description": "Quality metrics for conversions", + "properties": { + "xdm:qualityScore": { + "type": "number", + "title": "Quality Score", + "description": "Overall conversion quality score", + "minimum": 0, + "maximum": 10 + }, + "xdm:fraudRate": { + "type": "number", + "title": "Fraud Rate", + "description": "Percentage of conversions flagged as fraudulent", + "minimum": 0, + "maximum": 1 + }, + "xdm:validationRate": { + "type": "number", + "title": "Validation Rate", + "description": "Percentage of conversions that passed validation", + "minimum": 0, + "maximum": 1 + } + } + }, + "xdm:leads": { + "type": "integer", + "title": "Leads", + "description": "Total number of leads generated", + "minimum": 0 + }, + "xdm:qualifiedLeads": { + "type": "integer", + "title": "Qualified Leads", + "description": "Number of qualified/validated leads", + "minimum": 0 + }, + "xdm:costPerLead": { + "type": "number", + "title": "Cost Per Lead", + "description": "Average cost per lead", + "minimum": 0 + }, + "xdm:leadFormOpens": { + "type": "integer", + "title": "Lead Form Opens", + "description": "Number of times lead form was opened", + "minimum": 0 + }, + "xdm:leadFormSubmissions": { + "type": "integer", + "title": "Lead Form Submissions", + "description": "Number of lead form submissions", + "minimum": 0 + }, + "xdm:leadFormCompletionRate": { + "type": "number", + "title": "Lead Form Completion Rate", + "description": "Percentage of opened forms that were submitted", + "minimum": 0, + "maximum": 1 + } + } + } + } + } + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/conversion-metrics" + } + ], + "meta:status": "experimental" +} diff --git a/components/fieldgroups/paid-media/core-paid-media-cost-metrics.example.1.json b/components/fieldgroups/paid-media/core-paid-media-cost-metrics.example.1.json new file mode 100644 index 000000000..ed2d516cd --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-cost-metrics.example.1.json @@ -0,0 +1,113 @@ +{ + "xdm:paidMedia": { + "xdm:costMetrics": { + "xdm:spend": 18000, + "xdm:spendMicros": 18000000000, + "xdm:cpc": 7.2, + "xdm:cpm": 36.0, + "xdm:cpp": 0.56, + "xdm:cpe": 2.02, + "xdm:cpv": 0.15, + "xdm:cpa": 14.4, + "xdm:cpvc": 0.23, + "xdm:cpl": 73.47, + "xdm:biddingMetrics": { + "xdm:bidAmount": 8.5, + "xdm:bidAmountMicros": 8500000, + "xdm:bidCap": 12.0, + "xdm:costCap": 15.0, + "xdm:targetCPA": 14.0, + "xdm:targetROAS": 4.0, + "xdm:actualCPA": 14.4, + "xdm:actualROAS": 10.42, + "xdm:bidStrategy": "lowest_cost_without_cap", + "xdm:bidType": "automatic", + "xdm:averageBid": 7.85, + "xdm:maxBid": 12.0, + "xdm:minBid": 3.5, + "xdm:bidAdjustments": 1.15 + }, + "xdm:qualityMetrics": { + "xdm:qualityScore": 8.5, + "xdm:relevanceScore": 9.0, + "xdm:engagementScore": 8.2, + "xdm:conversionScore": 8.8, + "xdm:adRank": 76.5, + "xdm:expectedCTR": "above_average", + "xdm:adRelevance": "above_average", + "xdm:landingPageExperience": "above_average" + }, + "xdm:impressionShare": { + "xdm:impressionShare": 0.68, + "xdm:impressionShareRank": 0.72, + "xdm:impressionShareBudget": 0.85, + "xdm:lostImpressionShareRank": 0.15, + "xdm:lostImpressionShareBudget": 0.17, + "xdm:exactMatchImpressionShare": 0.75, + "xdm:topImpressionShare": 0.42, + "xdm:absoluteTopImpressionShare": 0.28 + }, + "xdm:budgetUtilization": { + "xdm:budgetAllocated": 60000, + "xdm:budgetSpent": 18000, + "xdm:budgetRemaining": 42000, + "xdm:budgetUtilization": 0.3, + "xdm:dailyBudget": 2000, + "xdm:dailySpend": 600, + "xdm:dailyBudgetUtilization": 0.3, + "xdm:pacingStatus": "on_track", + "xdm:projectedSpend": 60000, + "xdm:budgetOverrun": 0, + "xdm:budgetUnderrun": 0 + }, + "xdm:efficiencyMetrics": { + "xdm:costPerThousandReach": 0.69, + "xdm:costPerEngagement": 2.02, + "xdm:costPerVideoView": 0.15, + "xdm:costPerVideoCompletion": 0.23, + "xdm:costPerLead": 73.47, + "xdm:costPerQualifiedLead": 97.3, + "xdm:costPerAppInstall": 0, + "xdm:costPerRegistration": 100.0, + "xdm:costPerSubscription": 189.47, + "xdm:costPerDownload": 56.25 + }, + "xdm:returnMetrics": { + "xdm:roas": 10.42, + "xdm:roi": 9.42, + "xdm:revenuePerClick": 75.0, + "xdm:revenuePerImpression": 3.75, + "xdm:profitPerClick": 67.8, + "xdm:profitMargin": 0.904, + "xdm:breakEvenROAS": 1.0, + "xdm:incrementalROAS": 4.2 + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "meta_currency", + "xdm:stringValue": "USD" + }, + { + "xdm:fieldName": "meta_bid_strategy", + "xdm:stringValue": "LOWEST_COST_WITHOUT_CAP" + }, + { + "xdm:fieldName": "meta_billing_event", + "xdm:stringValue": "IMPRESSIONS" + }, + { + "xdm:fieldName": "meta_optimization_goal", + "xdm:stringValue": "LINK_CLICKS" + }, + { + "xdm:fieldName": "meta_campaign_budget_optimization", + "xdm:stringValue": "true" + }, + { + "xdm:fieldName": "meta_spend_cap", + "xdm:stringValue": "2500" + } + ] + } + } +} diff --git a/components/fieldgroups/paid-media/core-paid-media-cost-metrics.schema.json b/components/fieldgroups/paid-media/core-paid-media-cost-metrics.schema.json new file mode 100644 index 000000000..e8127caac --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-cost-metrics.schema.json @@ -0,0 +1,321 @@ +{ + "meta:license": [ + "Copyright 2025 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "https://ns.adobe.com/xdm/mixins/paid-media/cost-metrics", + "title": "Core Paid Media Cost Metrics", + "type": "object", + "meta:extensible": true, + "meta:abstract": true, + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/classes/summarymetrics"], + "description": "Detailed cost and bidding metrics for paid media campaigns", + "definitions": { + "cost-metrics": { + "properties": { + "xdm:paidMedia": { + "type": "object", + "properties": { + "xdm:costMetrics": { + "type": "object", + "title": "Cost Metrics", + "description": "Detailed cost and bidding metrics", + "properties": { + "xdm:spendInMicroCurrency": { + "type": "integer", + "title": "Spend (Micro Currency)", + "description": "Amount spent in micro currency units", + "minimum": 0 + }, + "xdm:averageCpm": { + "type": "number", + "title": "Average CPM", + "description": "Average cost per thousand impressions", + "minimum": 0 + }, + "xdm:averageCpc": { + "type": "number", + "title": "Average CPC", + "description": "Average cost per click", + "minimum": 0 + }, + "xdm:averageCpe": { + "type": "number", + "title": "Average CPE", + "description": "Average cost per engagement", + "minimum": 0 + }, + "xdm:averageCpv": { + "type": "number", + "title": "Average CPV", + "description": "Average cost per video view", + "minimum": 0 + }, + "xdm:averageCpa": { + "type": "number", + "title": "Average CPA", + "description": "Average cost per acquisition/action", + "minimum": 0 + }, + "xdm:averageCpl": { + "type": "number", + "title": "Average CPL", + "description": "Average cost per lead", + "minimum": 0 + }, + "xdm:bidAmount": { + "type": "number", + "title": "Bid Amount", + "description": "Average bid amount", + "minimum": 0 + }, + "xdm:bidAmountMicro": { + "type": "integer", + "title": "Bid Amount (Micro Currency)", + "description": "Bid amount in micro currency units", + "minimum": 0 + }, + "xdm:maxBid": { + "type": "number", + "title": "Maximum Bid", + "description": "Maximum bid amount set", + "minimum": 0 + }, + "xdm:minBid": { + "type": "number", + "title": "Minimum Bid", + "description": "Minimum bid amount set", + "minimum": 0 + }, + "xdm:targetBid": { + "type": "number", + "title": "Target Bid", + "description": "Target bid amount for automated bidding", + "minimum": 0 + }, + "xdm:actualBid": { + "type": "number", + "title": "Actual Bid", + "description": "Actual bid amount used in auctions", + "minimum": 0 + }, + "xdm:qualityScore": { + "type": "number", + "title": "Quality Score", + "description": "Ad quality score (platform-specific)", + "minimum": 0, + "maximum": 10 + }, + "xdm:adRank": { + "type": "number", + "title": "Ad Rank", + "description": "Ad rank score used for auction positioning", + "minimum": 0 + }, + "xdm:competitionIndex": { + "type": "number", + "title": "Competition Index", + "description": "Competition level index for the auction", + "minimum": 0, + "maximum": 1 + }, + "xdm:impressionShare": { + "type": "object", + "title": "Impression Share Metrics", + "description": "Detailed impression share metrics", + "properties": { + "xdm:impressionShare": { + "type": "number", + "title": "Impression Share", + "minimum": 0, + "maximum": 1 + }, + "xdm:impressionShareRank": { + "type": "number", + "title": "Impression Share Rank", + "minimum": 0, + "maximum": 1 + }, + "xdm:impressionShareBudget": { + "type": "number", + "title": "Impression Share Budget", + "minimum": 0, + "maximum": 1 + }, + "xdm:lostImpressionShareRank": { + "type": "number", + "title": "Lost Impression Share Rank", + "minimum": 0, + "maximum": 1 + }, + "xdm:lostImpressionShareBudget": { + "type": "number", + "title": "Lost Impression Share Budget", + "minimum": 0, + "maximum": 1 + }, + "xdm:exactMatchImpressionShare": { + "type": "number", + "title": "Exact Match Impression Share", + "minimum": 0, + "maximum": 1 + }, + "xdm:topImpressionShare": { + "type": "number", + "title": "Top Impression Share", + "minimum": 0, + "maximum": 1 + }, + "xdm:absoluteTopImpressionShare": { + "type": "number", + "title": "Absolute Top Impression Share", + "minimum": 0, + "maximum": 1 + } + } + }, + "xdm:lostImpressionShareRank": { + "type": "number", + "title": "Lost Impression Share (Rank)", + "description": "Impression share lost due to ad rank", + "minimum": 0, + "maximum": 1 + }, + "xdm:lostImpressionShareBudget": { + "type": "number", + "title": "Lost Impression Share (Budget)", + "description": "Impression share lost due to budget constraints", + "minimum": 0, + "maximum": 1 + }, + "xdm:budgetUtilization": { + "type": "object", + "title": "Budget Utilization Metrics", + "description": "Detailed budget utilization metrics", + "properties": { + "xdm:budgetAllocated": { + "type": "number", + "title": "Budget Allocated", + "minimum": 0 + }, + "xdm:budgetSpent": { + "type": "number", + "title": "Budget Spent", + "minimum": 0 + }, + "xdm:budgetRemaining": { + "type": "number", + "title": "Budget Remaining", + "minimum": 0 + }, + "xdm:budgetUtilization": { + "type": "number", + "title": "Budget Utilization", + "minimum": 0, + "maximum": 1 + }, + "xdm:dailyBudget": { + "type": "number", + "title": "Daily Budget", + "minimum": 0 + }, + "xdm:dailySpend": { + "type": "number", + "title": "Daily Spend", + "minimum": 0 + }, + "xdm:dailyBudgetUtilization": { + "type": "number", + "title": "Daily Budget Utilization", + "minimum": 0, + "maximum": 1 + }, + "xdm:pacingStatus": { + "type": "string", + "title": "Pacing Status", + "enum": ["on_track", "ahead", "behind", "paused"] + }, + "xdm:projectedSpend": { + "type": "number", + "title": "Projected Spend", + "minimum": 0 + }, + "xdm:budgetOverrun": { + "type": "number", + "title": "Budget Overrun", + "minimum": 0 + }, + "xdm:budgetUnderrun": { + "type": "number", + "title": "Budget Underrun", + "minimum": 0 + } + } + }, + "xdm:budgetRemaining": { + "type": "number", + "title": "Budget Remaining", + "description": "Remaining budget amount", + "minimum": 0 + }, + "xdm:budgetPacing": { + "type": "number", + "title": "Budget Pacing", + "description": "Budget pacing percentage (actual vs. planned)", + "minimum": 0 + }, + "xdm:costEfficiency": { + "type": "number", + "title": "Cost Efficiency", + "description": "Cost efficiency score compared to benchmarks", + "minimum": 0 + }, + "xdm:marginOfError": { + "type": "number", + "title": "Margin of Error", + "description": "Statistical margin of error for cost metrics", + "minimum": 0, + "maximum": 1 + }, + "xdm:confidenceLevel": { + "type": "number", + "title": "Confidence Level", + "description": "Statistical confidence level for cost metrics", + "minimum": 0, + "maximum": 1 + }, + "xdm:costTrend": { + "type": "string", + "title": "Cost Trend", + "description": "Trend direction for costs", + "enum": ["increasing", "decreasing", "stable", "volatile"], + "meta:enum": { + "increasing": "Costs are increasing", + "decreasing": "Costs are decreasing", + "stable": "Costs are stable", + "volatile": "Costs are volatile" + } + }, + "xdm:costVariance": { + "type": "number", + "title": "Cost Variance", + "description": "Variance in cost metrics", + "minimum": 0 + } + } + } + } + } + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/cost-metrics" + } + ], + "meta:status": "experimental" +} diff --git a/components/fieldgroups/paid-media/core-paid-media-dimensional-breakdowns.example.1.json b/components/fieldgroups/paid-media/core-paid-media-dimensional-breakdowns.example.1.json new file mode 100644 index 000000000..60d725b70 --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-dimensional-breakdowns.example.1.json @@ -0,0 +1,118 @@ +{ + "xdm:paidMedia": { + "xdm:dimensionalBreakdowns": { + "xdm:deviceType": "mobile", + "xdm:platform": "instagram", + "xdm:placement": "instagram_feed", + "xdm:age": "25-34", + "xdm:gender": "female", + "xdm:country": "US", + "xdm:region": "California", + "xdm:city": "San Francisco", + "xdm:deviceBreakdown": { + "xdm:deviceType": "mobile", + "xdm:deviceOS": "ios", + "xdm:deviceModel": "iPhone 15 Pro", + "xdm:deviceManufacturer": "Apple", + "xdm:osVersion": "17.1", + "xdm:browserType": "in_app", + "xdm:browserVersion": "mobile_app", + "xdm:screenResolution": "1179x2556", + "xdm:connectionType": "wifi", + "xdm:carrier": "Verizon" + }, + "xdm:placementBreakdown": { + "xdm:publisher": "instagram", + "xdm:placement": "instagram_feed", + "xdm:position": "feed", + "xdm:placementType": "feed", + "xdm:adFormat": "single_image", + "xdm:inventoryType": "premium", + "xdm:environment": "mobile_app" + }, + "xdm:demographicBreakdown": { + "xdm:ageRange": "25-34", + "xdm:ageMin": 25, + "xdm:ageMax": 34, + "xdm:gender": "female", + "xdm:householdIncome": "75000-100000", + "xdm:education": "college", + "xdm:employmentStatus": "employed", + "xdm:maritalStatus": "single", + "xdm:parentalStatus": "non_parent", + "xdm:homeOwnership": "renter" + }, + "xdm:geographicBreakdown": { + "xdm:country": "US", + "xdm:countryCode": "US", + "xdm:region": "California", + "xdm:regionCode": "CA", + "xdm:city": "San Francisco", + "xdm:postalCode": "94105", + "xdm:dma": "807", + "xdm:dmaName": "San Francisco-Oakland-San Jose", + "xdm:metro": "San Francisco Bay Area", + "xdm:latitude": 37.7749, + "xdm:longitude": -122.4194, + "xdm:timezone": "America/Los_Angeles", + "xdm:locationType": "home" + }, + "xdm:audienceBreakdown": { + "xdm:audienceSegment": "tech_enthusiasts_25_54", + "xdm:audienceType": "custom", + "xdm:audienceSource": "website_visitors", + "xdm:audienceSize": 125000, + "xdm:audienceReach": 85000, + "xdm:audiencePenetration": 0.68, + "xdm:lookalikeSimilarity": 0, + "xdm:isLookalike": false, + "xdm:isRetargeting": true + }, + "xdm:temporalBreakdown": { + "xdm:dayOfWeek": "Tuesday", + "xdm:hourOfDay": 14, + "xdm:timeOfDay": "afternoon", + "xdm:dayPart": "business_hours", + "xdm:weekOfYear": 45, + "xdm:monthOfYear": 11, + "xdm:quarter": "Q4", + "xdm:isWeekend": false, + "xdm:isHoliday": false + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "meta_platform", + "xdm:stringValue": "instagram" + }, + { + "xdm:fieldName": "meta_placement", + "xdm:stringValue": "instagram_feed" + }, + { + "xdm:fieldName": "meta_device_platform", + "xdm:stringValue": "mobile" + }, + { + "xdm:fieldName": "meta_publisher_platform", + "xdm:stringValue": "instagram" + }, + { + "xdm:fieldName": "meta_impression_device", + "xdm:stringValue": "mobile_iphone" + }, + { + "xdm:fieldName": "meta_age_bucket", + "xdm:stringValue": "25-34" + }, + { + "xdm:fieldName": "meta_gender", + "xdm:stringValue": "female" + }, + { + "xdm:fieldName": "meta_region", + "xdm:stringValue": "California" + } + ] + } + } +} diff --git a/components/fieldgroups/paid-media/core-paid-media-dimensional-breakdowns.schema.json b/components/fieldgroups/paid-media/core-paid-media-dimensional-breakdowns.schema.json new file mode 100644 index 000000000..7545ef963 --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-dimensional-breakdowns.schema.json @@ -0,0 +1,160 @@ +{ + "meta:license": [ + "Copyright 2025 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "https://ns.adobe.com/xdm/mixins/paid-media/dimensional-breakdowns", + "title": "Core Paid Media Dimensional Breakdowns", + "type": "object", + "meta:extensible": true, + "meta:abstract": true, + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/classes/summarymetrics"], + "description": "Dimensional breakdown fields for paid media metrics aggregation", + "definitions": { + "dimensional-breakdowns": { + "properties": { + "xdm:paidMedia": { + "type": "object", + "properties": { + "xdm:breakdownType": { + "type": "string", + "title": "Breakdown Type", + "description": "Indicates which dimension this metrics row is broken down by (GenStudio migration aid)" + }, + "xdm:dimensionalBreakdowns": { + "type": "object", + "title": "Dimensional Breakdowns", + "description": "Dimensional breakdowns for metrics aggregation", + "properties": { + "xdm:deviceType": { + "type": "string", + "title": "Device Type", + "description": "Device type for this metrics record", + "enum": ["desktop", "mobile", "tablet", "tv", "other"], + "meta:enum": { + "desktop": "Desktop", + "mobile": "Mobile", + "tablet": "Tablet", + "tv": "Connected TV", + "other": "Other Device" + } + }, + "xdm:placement": { + "type": "string", + "title": "Placement", + "description": "Ad placement for this metrics record" + }, + "xdm:ageGroup": { + "type": "string", + "title": "Age Group", + "description": "Age group demographic breakdown" + }, + "xdm:age": { + "type": "string", + "title": "Age", + "description": "Alias of ageGroup for migration" + }, + "xdm:gender": { + "type": "string", + "title": "Gender", + "description": "Gender demographic breakdown", + "enum": ["male", "female", "all", "unknown"], + "meta:enum": { + "male": "Male", + "female": "Female", + "all": "All Genders", + "unknown": "Unknown/Unspecified" + } + }, + "xdm:country": { + "type": "string", + "title": "Country", + "description": "Country for geographic breakdown (ISO country code)" + }, + "xdm:region": { + "type": "string", + "title": "Region", + "description": "Region/state for geographic breakdown" + }, + "xdm:city": { + "type": "string", + "title": "City", + "description": "City for geographic breakdown" + }, + "xdm:language": { + "type": "string", + "title": "Language", + "description": "Language for demographic breakdown" + }, + "xdm:interestCategory": { + "type": "string", + "title": "Interest Category", + "description": "Interest category for targeting breakdown" + }, + "xdm:behaviorCategory": { + "type": "string", + "title": "Behavior Category", + "description": "Behavior category for targeting breakdown" + }, + "xdm:audienceSegment": { + "type": "string", + "title": "Audience Segment", + "description": "Custom audience segment identifier" + }, + "xdm:campaignObjective": { + "type": "string", + "title": "Campaign Objective", + "description": "Campaign objective for context in multi-level reports" + }, + "xdm:optimizationGoal": { + "type": "string", + "title": "Optimization Goal", + "description": "Optimization goal for context in multi-level reports" + }, + "xdm:creativeFormat": { + "type": "string", + "title": "Creative Format", + "description": "Creative format breakdown (image, video, carousel, etc.)" + }, + "xdm:adPosition": { + "type": "string", + "title": "Ad Position", + "description": "Position of the ad on the platform" + }, + "xdm:position": { + "type": "string", + "title": "Position", + "description": "Alias of adPosition for migration" + }, + "xdm:platform": { + "type": "string", + "title": "Platform", + "description": "Platform breakdown (e.g., facebook, instagram, search, display)" + }, + "xdm:timeOfDay": { + "type": "string", + "title": "Time of Day", + "description": "Time of day breakdown (morning, afternoon, evening, night)" + }, + "xdm:dayOfWeek": { + "type": "string", + "title": "Day of Week", + "description": "Day of week breakdown" + } + } + } + } + } + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/dimensional-breakdowns" + } + ], + "meta:status": "experimental" +} diff --git a/components/fieldgroups/paid-media/core-paid-media-experience-details.example.1.json b/components/fieldgroups/paid-media/core-paid-media-experience-details.example.1.json new file mode 100644 index 000000000..aa861bb52 --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-experience-details.example.1.json @@ -0,0 +1,112 @@ +{ + "xdm:paidMedia": { + "xdm:experienceDetails": { + "xdm:experienceType": "carousel", + "xdm:landingPageURL": "https://shop.acmecorp.com/products", + "xdm:displayURL": "shop.acmecorp.com/products", + "xdm:finalURL": "https://shop.acmecorp.com/products?utm_source=facebook&utm_medium=carousel&utm_campaign=showcase2025", + "xdm:carouselProperties": { + "xdm:cardCount": 5, + "xdm:carouselType": "product_carousel", + "xdm:autoAdvance": false, + "xdm:looping": true, + "xdm:cards": [ + { + "xdm:cardIndex": 1, + "xdm:cardID": "card_001", + "xdm:headline": "Premium Wireless Headphones", + "xdm:description": "Experience crystal-clear sound with 40-hour battery life", + "xdm:imageURL": "https://cdn.acmecorp.com/products/headphones-premium.jpg", + "xdm:destinationURL": "https://shop.acmecorp.com/products/headphones-premium", + "xdm:callToAction": "Shop Now", + "xdm:price": 299.99, + "xdm:currency": "USD", + "xdm:productID": "prod_headphones_001" + }, + { + "xdm:cardIndex": 2, + "xdm:cardID": "card_002", + "xdm:headline": "Smart Fitness Watch", + "xdm:description": "Track your health and fitness goals with precision", + "xdm:imageURL": "https://cdn.acmecorp.com/products/watch-fitness.jpg", + "xdm:destinationURL": "https://shop.acmecorp.com/products/watch-fitness", + "xdm:callToAction": "Shop Now", + "xdm:price": 399.99, + "xdm:currency": "USD", + "xdm:productID": "prod_watch_002" + }, + { + "xdm:cardIndex": 3, + "xdm:cardID": "card_003", + "xdm:headline": "Portable Bluetooth Speaker", + "xdm:description": "Powerful sound in a compact, waterproof design", + "xdm:imageURL": "https://cdn.acmecorp.com/products/speaker-portable.jpg", + "xdm:destinationURL": "https://shop.acmecorp.com/products/speaker-portable", + "xdm:callToAction": "Shop Now", + "xdm:price": 149.99, + "xdm:currency": "USD", + "xdm:productID": "prod_speaker_003" + }, + { + "xdm:cardIndex": 4, + "xdm:cardID": "card_004", + "xdm:headline": "Wireless Charging Pad", + "xdm:description": "Fast wireless charging for all your devices", + "xdm:imageURL": "https://cdn.acmecorp.com/products/charger-wireless.jpg", + "xdm:destinationURL": "https://shop.acmecorp.com/products/charger-wireless", + "xdm:callToAction": "Shop Now", + "xdm:price": 49.99, + "xdm:currency": "USD", + "xdm:productID": "prod_charger_004" + }, + { + "xdm:cardIndex": 5, + "xdm:cardID": "card_005", + "xdm:headline": "USB-C Hub Adapter", + "xdm:description": "Connect all your devices with this versatile hub", + "xdm:imageURL": "https://cdn.acmecorp.com/products/hub-usbc.jpg", + "xdm:destinationURL": "https://shop.acmecorp.com/products/hub-usbc", + "xdm:callToAction": "Shop Now", + "xdm:price": 79.99, + "xdm:currency": "USD", + "xdm:productID": "prod_hub_005" + } + ], + "xdm:catalogID": "catalog_987654321", + "xdm:productSetID": "product_set_123456", + "xdm:dynamicProductAds": false + }, + "xdm:interactionProperties": { + "xdm:allowSwipe": true, + "xdm:allowTap": true, + "xdm:allowZoom": false, + "xdm:allowFullscreen": false, + "xdm:interactionTracking": true, + "xdm:cardViewTracking": true, + "xdm:swipeTracking": true + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "meta_experience_type", + "xdm:stringValue": "carousel" + }, + { + "xdm:fieldName": "meta_carousel_card_count", + "xdm:stringValue": "5" + }, + { + "xdm:fieldName": "meta_catalog_id", + "xdm:stringValue": "catalog_987654321" + }, + { + "xdm:fieldName": "meta_product_set_id", + "xdm:stringValue": "product_set_123456" + }, + { + "xdm:fieldName": "meta_dynamic_ads", + "xdm:stringValue": "false" + } + ] + } + } +} diff --git a/components/fieldgroups/paid-media/core-paid-media-experience-details.schema.json b/components/fieldgroups/paid-media/core-paid-media-experience-details.schema.json new file mode 100644 index 000000000..0ecb861b0 --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-experience-details.schema.json @@ -0,0 +1,315 @@ +{ + "meta:license": [ + "Copyright 2025 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "https://ns.adobe.com/xdm/mixins/paid-media/experience-details", + "title": "Core Paid Media Experience Details", + "type": "object", + "meta:extensible": true, + "meta:abstract": true, + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/context/record"], + "description": "Experience-specific details and configuration fields for paid media creative experiences", + "definitions": { + "experience-details": { + "properties": { + "xdm:paidMedia": { + "type": "object", + "properties": { + "xdm:experienceDetails": { + "type": "object", + "title": "Experience Details", + "description": "Specific details for paid media creative experiences", + "properties": { + "xdm:experienceName": { + "type": "string", + "title": "Experience Name", + "description": "Name of the creative experience" + }, + "xdm:experienceDescription": { + "type": "string", + "title": "Experience Description", + "description": "Description of the creative experience" + }, + "xdm:experienceType": { + "type": "string", + "title": "Experience Type", + "description": "Type of creative experience", + "enum": [ + "single_image", + "single_video", + "carousel", + "collection", + "slideshow", + "canvas", + "instant_experience", + "playable", + "other" + ], + "meta:enum": { + "single_image": "Single Image Experience", + "single_video": "Single Video Experience", + "carousel": "Carousel Experience", + "collection": "Collection Experience", + "slideshow": "Slideshow Experience", + "canvas": "Canvas Experience", + "instant_experience": "Instant Experience", + "playable": "Playable Experience", + "other": "Other Experience Type" + } + }, + "xdm:sourceURL": { + "type": "string", + "title": "Source URL", + "description": "Source URL of the experience" + }, + "xdm:thumbnailURL": { + "type": "string", + "title": "Thumbnail URL", + "description": "Thumbnail URL for the experience" + }, + "xdm:landingPageURL": { + "type": "string", + "title": "Landing Page URL", + "description": "Landing page URL for the experience" + }, + "xdm:headingText": { + "type": "string", + "title": "Heading Text", + "description": "Main heading or title text displayed in the experience" + }, + "xdm:bodyText": { + "type": "string", + "title": "Body Text", + "description": "Body or description text displayed in the experience" + }, + "xdm:callToAction": { + "type": "string", + "title": "Call To Action", + "description": "Call to action text or button label" + }, + "xdm:assetIDs": { + "type": "array", + "title": "Asset IDs", + "description": "Array of asset IDs used in this experience", + "items": { + "type": "string" + } + }, + "xdm:assetGUIDs": { + "type": "array", + "title": "Asset GUIDs", + "description": "Array of asset GUIDs used in this experience", + "items": { + "type": "string" + } + }, + "xdm:carouselProperties": { + "type": "object", + "title": "Carousel Properties", + "description": "Properties specific to carousel experiences", + "properties": { + "xdm:cardCount": { + "type": "integer", + "title": "Card Count", + "description": "Number of cards in the carousel", + "minimum": 1 + }, + "xdm:cards": { + "type": "array", + "title": "Carousel Cards", + "description": "Individual cards in the carousel", + "items": { + "type": "object", + "properties": { + "xdm:cardIndex": { + "type": "integer", + "title": "Card Index", + "description": "Position of the card in the carousel" + }, + "xdm:assetID": { + "type": "string", + "title": "Asset ID", + "description": "Asset ID for this card" + }, + "xdm:assetGUID": { + "type": "string", + "title": "Asset GUID", + "description": "Asset GUID for this card" + }, + "xdm:heading": { + "type": "string", + "title": "Card Heading", + "description": "Heading text for this card" + }, + "description": { + "type": "string", + "title": "Card Description", + "description": "Description text for this card" + }, + "xdm:destinationURL": { + "type": "string", + "title": "Destination URL", + "description": "Destination URL for this card" + } + } + } + } + } + }, + "xdm:collectionProperties": { + "type": "object", + "title": "Collection Properties", + "description": "Properties specific to collection experiences", + "properties": { + "xdm:coverAssetID": { + "type": "string", + "title": "Cover Asset ID", + "description": "Asset ID for the collection cover" + }, + "xdm:coverAssetGUID": { + "type": "string", + "title": "Cover Asset GUID", + "description": "Asset GUID for the collection cover" + }, + "xdm:itemCount": { + "type": "integer", + "title": "Item Count", + "description": "Number of items in the collection", + "minimum": 1 + } + } + }, + "xdm:videoProperties": { + "type": "object", + "title": "Video Experience Properties", + "description": "Properties specific to video experiences", + "properties": { + "xdm:duration": { + "type": "number", + "title": "Duration", + "description": "Video duration in seconds" + }, + "xdm:hasSound": { + "type": "boolean", + "title": "Has Sound", + "description": "Whether the video experience includes sound" + }, + "xdm:autoplay": { + "type": "boolean", + "title": "Autoplay", + "description": "Whether the video autoplays" + } + } + }, + "xdm:interactionProperties": { + "type": "object", + "title": "Interaction Properties", + "description": "Properties for interactive experiences", + "properties": { + "xdm:isInteractive": { + "type": "boolean", + "title": "Is Interactive", + "description": "Whether the experience is interactive" + }, + "xdm:interactionType": { + "type": "string", + "title": "Interaction Type", + "description": "Type of interaction supported", + "enum": [ + "swipe", + "tap", + "click", + "scroll", + "playable", + "form", + "other" + ], + "meta:enum": { + "swipe": "Swipe Interaction", + "tap": "Tap Interaction", + "click": "Click Interaction", + "scroll": "Scroll Interaction", + "playable": "Playable Interaction", + "form": "Form Interaction", + "other": "Other Interaction Type" + } + } + } + }, + "xdm:instantExperienceProperties": { + "type": "object", + "title": "Instant Experience Properties", + "description": "Properties specific to instant/canvas experiences", + "properties": { + "xdm:templateType": { + "type": "string", + "title": "Template Type", + "description": "Type of instant experience template used" + }, + "xdm:componentCount": { + "type": "integer", + "title": "Component Count", + "description": "Number of components in the instant experience" + } + } + }, + "xdm:performanceMetadata": { + "type": "object", + "title": "Performance Metadata", + "description": "Metadata about experience performance", + "properties": { + "xdm:usageCount": { + "type": "integer", + "title": "Usage Count", + "description": "Number of times this experience has been used" + }, + "xdm:lastUsedDate": { + "type": "string", + "format": "date-time", + "title": "Last Used Date", + "description": "When the experience was last used" + }, + "xdm:associatedCampaigns": { + "type": "array", + "title": "Associated Campaigns", + "description": "Campaigns that use this experience", + "items": { + "type": "string" + } + }, + "xdm:associatedAds": { + "type": "array", + "title": "Associated Ads", + "description": "Ads that use this experience", + "items": { + "type": "string" + } + } + } + }, + "xdm:additionalDetails": { + "title": "Additional Experience Details", + "description": "Platform-specific experience details not defined in core schema. Allows ingestion of arbitrary fields from paid media network APIs without requiring schema changes.", + "type": "array", + "items": { + "$ref": "https://ns.adobe.com/xdm/datatypes/paid-media-additional-field" + } + } + } + } + } + } + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/experience-details" + } + ], + "meta:status": "experimental" +} diff --git a/components/fieldgroups/paid-media/core-paid-media-extended-metrics.example.1.json b/components/fieldgroups/paid-media/core-paid-media-extended-metrics.example.1.json new file mode 100644 index 000000000..15222a2c2 --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-extended-metrics.example.1.json @@ -0,0 +1,112 @@ +{ + "xdm:paidMedia": { + "xdm:extendedMetrics": { + "xdm:viewableImpressions": 42500, + "xdm:viewabilityRate": 0.85, + "xdm:measurableImpressions": 48000, + "xdm:measurabilityRate": 0.96, + "xdm:socialEngagement": { + "xdm:likes": 8934, + "xdm:reactions": 9876, + "xdm:loves": 3456, + "xdm:wows": 1234, + "xdm:hahas": 567, + "xdm:sads": 89, + "xdm:angrys": 34, + "xdm:comments": 1247, + "xdm:shares": 892, + "xdm:saves": 456, + "xdm:follows": 234, + "xdm:profileVisits": 1890, + "xdm:linkClicks": 2500, + "xdm:photoViews": 12500, + "xdm:postEngagements": 12345, + "xdm:engagementRate": 0.247 + }, + "xdm:appMetrics": { + "xdm:appInstalls": 0, + "xdm:appEvents": 0, + "xdm:appEventValue": 0, + "xdm:appEngagements": 0, + "xdm:appPurchases": 0, + "xdm:appRevenue": 0, + "xdm:appRetention": 0, + "xdm:appUninstalls": 0 + }, + "xdm:leadMetrics": { + "xdm:leadSubmissions": 245, + "xdm:leadFormOpens": 890, + "xdm:leadFormCompletionRate": 0.275, + "xdm:leadQuality": 7.5, + "xdm:qualifiedLeads": 185, + "xdm:leadQualificationRate": 0.755 + }, + "xdm:ecommerceMetrics": { + "xdm:productViews": 12500, + "xdm:addToCart": 2340, + "xdm:addToCartRate": 0.187, + "xdm:checkouts": 1450, + "xdm:checkoutRate": 0.62, + "xdm:purchases": 875, + "xdm:purchaseRate": 0.603, + "xdm:revenue": 187500, + "xdm:averageOrderValue": 214.29, + "xdm:itemsPerOrder": 2.3, + "xdm:cartAbandonment": 0.397, + "xdm:wishlistAdds": 678, + "xdm:productReviews": 45 + }, + "xdm:brandMetrics": { + "xdm:brandAwareness": 0.42, + "xdm:brandRecall": 0.38, + "xdm:brandConsideration": 0.28, + "xdm:brandPreference": 0.22, + "xdm:brandLoyalty": 0.18, + "xdm:brandSentiment": 0.75, + "xdm:netPromoterScore": 45 + }, + "xdm:offlineMetrics": { + "xdm:storeVisits": 0, + "xdm:storeLocatorSearches": 234, + "xdm:directionsRequests": 156, + "xdm:phoneCallClicks": 89, + "xdm:offlineConversions": 0, + "xdm:offlineRevenue": 0 + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "meta_viewable_impressions", + "xdm:stringValue": "42500" + }, + { + "xdm:fieldName": "meta_post_engagement", + "xdm:stringValue": "12345" + }, + { + "xdm:fieldName": "meta_post_reactions", + "xdm:stringValue": "9876" + }, + { + "xdm:fieldName": "meta_post_comments", + "xdm:stringValue": "1247" + }, + { + "xdm:fieldName": "meta_post_shares", + "xdm:stringValue": "892" + }, + { + "xdm:fieldName": "meta_post_saves", + "xdm:stringValue": "456" + }, + { + "xdm:fieldName": "meta_link_clicks", + "xdm:stringValue": "2500" + }, + { + "xdm:fieldName": "meta_outbound_clicks", + "xdm:stringValue": "2340" + } + ] + } + } +} diff --git a/components/fieldgroups/paid-media/core-paid-media-extended-metrics.schema.json b/components/fieldgroups/paid-media/core-paid-media-extended-metrics.schema.json new file mode 100644 index 000000000..b2c187315 --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-extended-metrics.schema.json @@ -0,0 +1,263 @@ +{ + "meta:license": [ + "Copyright 2025 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "https://ns.adobe.com/xdm/mixins/paid-media/extended-metrics", + "title": "Core Paid Media Extended Metrics", + "type": "object", + "meta:extensible": true, + "meta:abstract": true, + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/classes/summarymetrics"], + "description": "Extended performance metrics beyond core metrics for paid media campaigns", + "definitions": { + "extended-metrics": { + "properties": { + "xdm:paidMedia": { + "type": "object", + "properties": { + "xdm:extendedMetrics": { + "type": "object", + "title": "Extended Metrics", + "description": "Additional metrics beyond core metrics", + "properties": { + "xdm:viewableImpressions": { + "type": "integer", + "title": "Viewable Impressions", + "description": "Number of viewable impressions", + "minimum": 0 + }, + "xdm:viewabilityRate": { + "type": "number", + "title": "Viewability Rate", + "description": "Percentage of impressions that were viewable", + "minimum": 0, + "maximum": 1 + }, + "xdm:uniqueClicks": { + "type": "integer", + "title": "Unique Clicks", + "description": "Number of unique users who clicked", + "minimum": 0 + }, + "xdm:linkClicks": { + "type": "integer", + "title": "Link Clicks", + "description": "Number of clicks on links", + "minimum": 0 + }, + "xdm:outboundClicks": { + "type": "integer", + "title": "Outbound Clicks", + "description": "Number of clicks leading to external sites", + "minimum": 0 + }, + "xdm:saves": { + "type": "integer", + "title": "Saves", + "description": "Number of saves/bookmarks", + "minimum": 0 + }, + "xdm:shares": { + "type": "integer", + "title": "Shares", + "description": "Number of shares", + "minimum": 0 + }, + "xdm:likes": { + "type": "integer", + "title": "Likes", + "description": "Number of likes/reactions", + "minimum": 0 + }, + "xdm:comments": { + "type": "integer", + "title": "Comments", + "description": "Number of comments", + "minimum": 0 + }, + "xdm:pageEngagement": { + "type": "integer", + "title": "Page Engagement", + "description": "Page engagement actions", + "minimum": 0 + }, + "xdm:pageLikes": { + "type": "integer", + "title": "Page Likes", + "description": "Page likes", + "minimum": 0 + }, + "xdm:postEngagement": { + "type": "integer", + "title": "Post Engagement", + "description": "Post engagement actions", + "minimum": 0 + }, + "xdm:postComments": { + "type": "integer", + "title": "Post Comments", + "description": "Comments on posts", + "minimum": 0 + }, + "xdm:postReactions": { + "type": "integer", + "title": "Post Reactions", + "description": "Reactions on posts", + "minimum": 0 + }, + "xdm:postShares": { + "type": "integer", + "title": "Post Shares", + "description": "Shares of posts", + "minimum": 0 + }, + "xdm:postSaves": { + "type": "integer", + "title": "Post Saves", + "description": "Saves of posts", + "minimum": 0 + }, + "xdm:follows": { + "type": "integer", + "title": "Follows", + "description": "Number of new followers gained", + "minimum": 0 + }, + "xdm:profileVisits": { + "type": "integer", + "title": "Profile Visits", + "description": "Number of profile visits generated", + "minimum": 0 + }, + "xdm:websiteVisits": { + "type": "integer", + "title": "Website Visits", + "description": "Number of website visits generated", + "minimum": 0 + }, + "xdm:averageDwellTime": { + "type": "number", + "title": "Average Dwell Time", + "description": "Average dwell time (seconds) (alias for qualityMetrics.dwellTime to ease migration)", + "minimum": 0 + }, + "xdm:appInstalls": { + "type": "integer", + "title": "App Installs", + "description": "Number of app installations", + "minimum": 0 + }, + "xdm:appOpens": { + "type": "integer", + "title": "App Opens", + "description": "Number of app opens", + "minimum": 0 + }, + "xdm:leadSubmissions": { + "type": "integer", + "title": "Lead Submissions", + "description": "Number of lead form submissions", + "minimum": 0 + }, + "xdm:signups": { + "type": "integer", + "title": "Signups", + "description": "Number of user signups", + "minimum": 0 + }, + "xdm:downloads": { + "type": "integer", + "title": "Downloads", + "description": "Number of downloads", + "minimum": 0 + }, + "xdm:subscriptions": { + "type": "integer", + "title": "Subscriptions", + "description": "Number of subscriptions", + "minimum": 0 + }, + "xdm:checkouts": { + "type": "integer", + "title": "Checkouts", + "description": "Number of checkout initiations", + "minimum": 0 + }, + "xdm:addToCarts": { + "type": "integer", + "title": "Add to Carts", + "description": "Number of add to cart actions", + "minimum": 0 + }, + "xdm:wishlistAdds": { + "type": "integer", + "title": "Wishlist Adds", + "description": "Number of wishlist additions", + "minimum": 0 + }, + "xdm:productViews": { + "type": "integer", + "title": "Product Views", + "description": "Number of product page views", + "minimum": 0 + }, + "xdm:photoViews": { + "type": "integer", + "title": "Photo Views", + "description": "Number of photo views", + "minimum": 0 + }, + "xdm:catalogViews": { + "type": "integer", + "title": "Catalog Views", + "description": "Number of catalog views", + "minimum": 0 + }, + "xdm:storeVisits": { + "type": "integer", + "title": "Store Visits", + "description": "Number of physical store visits", + "minimum": 0 + }, + "xdm:callsGenerated": { + "type": "integer", + "title": "Calls Generated", + "description": "Number of phone calls generated", + "minimum": 0 + }, + "xdm:directionsRequested": { + "type": "integer", + "title": "Directions Requested", + "description": "Number of direction requests", + "minimum": 0 + }, + "xdm:eventResponses": { + "type": "integer", + "title": "Event Responses", + "description": "Number of event responses", + "minimum": 0 + }, + "xdm:messagesSent": { + "type": "integer", + "title": "Messages Sent", + "description": "Number of messages sent", + "minimum": 0 + } + } + } + } + } + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/extended-metrics" + } + ], + "meta:status": "experimental" +} diff --git a/components/fieldgroups/paid-media/core-paid-media-identifiers.example.1.json b/components/fieldgroups/paid-media/core-paid-media-identifiers.example.1.json new file mode 100644 index 000000000..b8f8f7e34 --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-identifiers.example.1.json @@ -0,0 +1,72 @@ +{ + "xdm:paidMedia": { + "xdm:adNetwork": "meta", + "xdm:adNetworkName": "Meta (Facebook)", + "xdm:entityType": "ad", + "xdm:accountID": "act_123456789012345", + "xdm:accountGUID": "meta_act_123456789012345", + "xdm:campaignID": "23851234567890789", + "xdm:campaignGUID": "meta_act_123456789012345_23851234567890789", + "xdm:adGroupID": "23851234567890456", + "xdm:adGroupGUID": "meta_act_123456789012345_23851234567890456", + "xdm:adID": "23851234567890123", + "xdm:adGUID": "meta_act_123456789012345_23851234567890123", + "xdm:experienceID": "creative_vid_987654321", + "xdm:experienceGUID": "meta_act_123456789012345_creative_vid_987654321", + "xdm:assetID": "asset_456789123456789", + "xdm:assetGUID": "meta_act_123456789012345_asset_456789123456789", + "xdm:hierarchyPath": "act_123456789012345/23851234567890789/23851234567890456/23851234567890123", + "xdm:parentEntityType": "adGroup", + "xdm:parentEntityID": "23851234567890456", + "xdm:rootEntityType": "account", + "xdm:rootEntityID": "act_123456789012345", + "xdm:externalIDs": { + "xdm:businessManagerID": "987654321098765", + "xdm:pageID": "123456789012345", + "xdm:pixelID": "pixel_123456789", + "xdm:catalogID": "catalog_987654321", + "xdm:productSetID": "product_set_123456", + "xdm:appID": "app_456789123", + "xdm:instagramAccountID": "ig_acmecorp", + "xdm:creativeID": "creative_vid_987654321", + "xdm:videoID": "video_987654321012345", + "xdm:imageHash": "abc123def456ghi789jkl012" + }, + "xdm:crossNetworkIDs": { + "xdm:universalCampaignID": "ucid_550e8400e29b41d4a716446655440002", + "xdm:universalAdGroupID": "uagid_550e8400e29b41d4a716446655440003", + "xdm:universalAdID": "uaid_550e8400e29b41d4a716446655440004", + "xdm:crossNetworkTrackingID": "xnt_acme_fall2025_traffic" + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "meta_ad_account_id", + "xdm:stringValue": "act_123456789012345" + }, + { + "xdm:fieldName": "meta_campaign_id", + "xdm:stringValue": "23851234567890789" + }, + { + "xdm:fieldName": "meta_adset_id", + "xdm:stringValue": "23851234567890456" + }, + { + "xdm:fieldName": "meta_ad_id", + "xdm:stringValue": "23851234567890123" + }, + { + "xdm:fieldName": "meta_business_id", + "xdm:stringValue": "987654321098765" + }, + { + "xdm:fieldName": "meta_page_id", + "xdm:stringValue": "123456789012345" + }, + { + "xdm:fieldName": "meta_instagram_account_id", + "xdm:stringValue": "ig_acmecorp" + } + ] + } +} diff --git a/components/fieldgroups/paid-media/core-paid-media-identifiers.schema.json b/components/fieldgroups/paid-media/core-paid-media-identifiers.schema.json new file mode 100644 index 000000000..1333e8c33 --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-identifiers.schema.json @@ -0,0 +1,255 @@ +{ + "meta:license": [ + "Copyright 2025 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "https://ns.adobe.com/xdm/mixins/paid-media/core-identifiers", + "title": "Core Paid Media Identifiers", + "type": "object", + "meta:extensible": true, + "meta:abstract": true, + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/context/record"], + "description": "Core identifier fields used across all paid media entities and ad networks", + "definitions": { + "core-identifiers": { + "properties": { + "xdm:paidMedia": { + "type": "object", + "title": "Paid Media Core Identifiers", + "description": "Core identifier fields for paid media entities", + "properties": { + "xdm:adNetwork": { + "type": "string", + "title": "Ad Network", + "description": "The advertising platform/network", + "enum": [ + "meta", + "google_ads", + "google_cm360", + "snapchat", + "pinterest", + "tiktok", + "linkedin", + "amazon", + "reddit", + "twitter", + "other" + ], + "meta:enum": { + "meta": "Meta Ads (Facebook/Instagram)", + "google_ads": "Google Ads", + "google_cm360": "Google Campaign Manager 360", + "snapchat": "Snapchat Ads", + "pinterest": "Pinterest Ads", + "tiktok": "TikTok Ads", + "linkedin": "LinkedIn Ads", + "amazon": "Amazon Ads", + "reddit": "Reddit Ads", + "twitter": "Twitter/X Ads", + "other": "Other ad network" + } + }, + "xdm:network": { + "type": "string", + "title": "Network", + "description": "Alias of adNetwork for migration from GenStudio templates" + }, + "xdm:accountID": { + "type": "string", + "title": "Account ID", + "description": "Unique identifier for the ad account within the network" + }, + "xdm:accountGUID": { + "type": "string", + "title": "Account GUID", + "description": "Unique identifier for the ad account across all networks" + }, + "xdm:campaignID": { + "type": "string", + "title": "Campaign ID", + "description": "Unique identifier for the campaign within the network" + }, + "xdm:campaignGUID": { + "type": "string", + "title": "Campaign GUID", + "description": "Unique identifier for the campaign across all networks" + }, + "xdm:adGroupID": { + "type": "string", + "title": "Ad Group ID", + "description": "Unique identifier for the ad group/ad set/ad squad within the network" + }, + "xdm:adGroupGUID": { + "type": "string", + "title": "Ad Group GUID", + "description": "Unique identifier for the ad group/ad set/ad squad across all networks" + }, + "xdm:adID": { + "type": "string", + "title": "Ad ID", + "description": "Unique identifier for the individual ad within the network" + }, + "xdm:adGUID": { + "type": "string", + "title": "Ad GUID", + "description": "Unique identifier for the individual ad across all networks" + }, + "xdm:experienceID": { + "type": "string", + "title": "Experience ID", + "description": "Unique identifier for creative experience (multi-asset compositions) within the network" + }, + "xdm:experienceGUID": { + "type": "string", + "title": "Experience GUID", + "description": "Unique identifier for creative experience (multi-asset compositions) across all networks" + }, + "xdm:assetID": { + "type": "string", + "title": "Asset ID", + "description": "Unique identifier for creative assets (images, videos, etc.) within the network" + }, + "xdm:assetGUID": { + "type": "string", + "title": "Asset GUID", + "description": "Unique identifier for creative assets (images, videos, etc.) across all networks" + }, + "xdm:portfolioID": { + "type": "string", + "title": "Portfolio ID", + "description": "Portfolio identifier for grouping campaigns (Amazon Ads and similar platforms) within the network" + }, + "xdm:portfolioGUID": { + "type": "string", + "title": "Portfolio GUID", + "description": "Portfolio identifier for grouping campaigns (Amazon Ads and similar platforms) across all networks" + }, + "xdm:entityIDs": { + "type": "object", + "title": "Entity IDs", + "description": "Nested platform entity identifiers to ease migration from GenStudio templates", + "properties": { + "xdm:account": { + "type": "object", + "properties": { + "xdm:accountGUID": { + "type": "string", + "title": "Account GUID" + }, + "xdm:accountID": { + "type": "string", + "title": "Account ID" + } + } + }, + "xdm:campaign": { + "type": "object", + "properties": { + "xdm:campaignGUID": { + "type": "string", + "title": "Campaign GUID" + }, + "xdm:campaignID": { + "type": "string", + "title": "Campaign ID" + } + } + }, + "xdm:adGroup": { + "type": "object", + "properties": { + "xdm:adGroupGUID": { + "type": "string", + "title": "Ad Group GUID" + }, + "xdm:adGroupID": { + "type": "string", + "title": "Ad Group ID" + } + } + }, + "xdm:ad": { + "type": "object", + "properties": { + "xdm:adGUID": { + "type": "string", + "title": "Ad GUID" + }, + "xdm:adID": { + "type": "string", + "title": "Ad ID" + } + } + }, + "xdm:experience": { + "type": "object", + "properties": { + "xdm:experienceGUID": { + "type": "string", + "title": "Experience GUID" + }, + "xdm:experienceID": { + "type": "string", + "title": "Experience ID" + } + } + }, + "xdm:asset": { + "type": "object", + "properties": { + "xdm:assetGUID": { + "type": "string", + "title": "Asset GUID" + }, + "xdm:assetID": { + "type": "string", + "title": "Asset ID" + } + } + } + } + }, + "xdm:entityType": { + "type": "string", + "title": "Entity Type", + "description": "Type of paid media entity this record represents", + "enum": [ + "account", + "campaign", + "adGroup", + "ad", + "experience", + "asset", + "metrics" + ], + "meta:enum": { + "account": "Ad Account", + "campaign": "Campaign", + "adGroup": "Ad Group/Ad Set/Ad Squad", + "ad": "Individual Ad", + "experience": "Creative Experience", + "asset": "Creative Asset", + "metrics": "Performance Metrics" + } + }, + "xdm:hierarchyPath": { + "type": "string", + "title": "Hierarchy Path", + "description": "Full hierarchical path showing parent-child relationships (e.g., account_id/campaign_id/adgroup_id/ad_id)" + } + }, + "required": ["xdm:adNetwork", "xdm:entityType"] + } + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/core-identifiers" + } + ], + "meta:status": "experimental" +} diff --git a/components/fieldgroups/paid-media/core-paid-media-metadata.example.1.json b/components/fieldgroups/paid-media/core-paid-media-metadata.example.1.json new file mode 100644 index 000000000..4b3b602bd --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-metadata.example.1.json @@ -0,0 +1,80 @@ +{ + "xdm:paidMedia": { + "xdm:metadata": { + "xdm:name": "Fall 2025 Product Launch - Traffic Campaign", + "xdm:status": "active", + "xdm:servingStatus": "CAMPAIGN_STATUS_ENABLED", + "xdm:currency": "USD", + "xdm:currencyCode": "USD", + "xdm:timezone": "America/Los_Angeles", + "xdm:createdTime": "2025-10-15T10:00:00Z", + "xdm:updatedTime": "2025-11-09T15:30:00Z", + "xdm:startTime": "2025-11-01T00:00:00Z", + "xdm:endTime": "2025-11-30T23:59:59Z", + "xdm:objective": "traffic", + "xdm:budgetType": "daily", + "xdm:dailyBudget": 2000, + "xdm:lifetimeBudget": 0, + "xdm:biddingStrategy": "lowest_cost_without_cap", + "xdm:optimizationGoal": "link_clicks", + "xdm:additionalDetails": [ + { + "xdm:fieldName": "meta_campaign_name", + "xdm:stringValue": "Fall 2025 Product Launch - Traffic Campaign" + }, + { + "xdm:fieldName": "meta_campaign_status", + "xdm:stringValue": "ACTIVE" + }, + { + "xdm:fieldName": "meta_effective_status", + "xdm:stringValue": "ACTIVE" + }, + { + "xdm:fieldName": "meta_configured_status", + "xdm:stringValue": "ACTIVE" + }, + { + "xdm:fieldName": "meta_objective", + "xdm:stringValue": "OUTCOME_TRAFFIC" + }, + { + "xdm:fieldName": "meta_buying_type", + "xdm:stringValue": "AUCTION" + }, + { + "xdm:fieldName": "meta_special_ad_categories", + "xdm:stringValue": "NONE" + }, + { + "xdm:fieldName": "meta_bid_strategy", + "xdm:stringValue": "LOWEST_COST_WITHOUT_CAP" + }, + { + "xdm:fieldName": "meta_budget_optimization", + "xdm:stringValue": "true" + }, + { + "xdm:fieldName": "meta_daily_budget", + "xdm:stringValue": "2000" + }, + { + "xdm:fieldName": "meta_created_time", + "xdm:stringValue": "2025-10-15T10:00:00Z" + }, + { + "xdm:fieldName": "meta_updated_time", + "xdm:stringValue": "2025-11-09T15:30:00Z" + }, + { + "xdm:fieldName": "meta_start_time", + "xdm:stringValue": "2025-11-01T00:00:00Z" + }, + { + "xdm:fieldName": "meta_stop_time", + "xdm:stringValue": "2025-11-30T23:59:59Z" + } + ] + } + } +} diff --git a/components/fieldgroups/paid-media/core-paid-media-metadata.schema.json b/components/fieldgroups/paid-media/core-paid-media-metadata.schema.json new file mode 100644 index 000000000..edd3813a7 --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-metadata.schema.json @@ -0,0 +1,216 @@ +{ + "meta:license": [ + "Copyright 2025 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "https://ns.adobe.com/xdm/mixins/paid-media/core-metadata", + "title": "Core Paid Media Metadata", + "type": "object", + "meta:extensible": true, + "meta:abstract": true, + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/context/record"], + "description": "Core metadata fields common across paid media entities", + "definitions": { + "core-metadata": { + "properties": { + "xdm:paidMedia": { + "type": "object", + "properties": { + "xdm:metadata": { + "type": "object", + "title": "Paid Media Core Metadata", + "description": "Common metadata fields for paid media entities", + "properties": { + "xdm:name": { + "type": "string", + "title": "Name", + "description": "Display name of the entity (campaign name, ad name, etc.)" + }, + "xdm:status": { + "type": "string", + "title": "Status", + "description": "Current status of the entity", + "enum": [ + "active", + "paused", + "deleted", + "archived", + "draft", + "completed", + "pending_review", + "rejected", + "unknown" + ], + "meta:enum": { + "active": "Active/Running", + "paused": "Paused", + "deleted": "Deleted", + "archived": "Archived", + "draft": "Draft", + "completed": "Completed", + "pending_review": "Pending Review", + "rejected": "Rejected", + "unknown": "Unknown Status" + } + }, + "xdm:servingStatus": { + "type": "string", + "title": "Serving Status", + "description": "Detailed serving status indicating why entity may not be serving", + "enum": [ + "CAMPAIGN_STATUS_ENABLED", + "PENDING_START_DATE", + "ENDED", + "CAMPAIGN_OUT_OF_BUDGET", + "ACCOUNT_OUT_OF_BUDGET", + "CAMPAIGN_PAUSED", + "ADVERTISER_PAUSED", + "PENDING_REVIEW", + "PENDING_MODERATION", + "REJECTED", + "CAMPAIGN_INCOMPLETE", + "PAYMENT_FAILURE", + "BILLING_HOLD", + "POLICING_SUSPENDED", + "OTHER" + ], + "meta:enum": { + "CAMPAIGN_STATUS_ENABLED": "Actively Serving", + "PENDING_START_DATE": "Scheduled - Not Yet Started", + "ENDED": "Campaign Ended", + "CAMPAIGN_OUT_OF_BUDGET": "Campaign Budget Exhausted", + "ACCOUNT_OUT_OF_BUDGET": "Account Budget Exhausted", + "CAMPAIGN_PAUSED": "Campaign Paused", + "ADVERTISER_PAUSED": "Account Paused", + "PENDING_REVIEW": "Pending Review", + "PENDING_MODERATION": "Pending Moderation", + "REJECTED": "Rejected by Review", + "CAMPAIGN_INCOMPLETE": "Campaign Setup Incomplete", + "PAYMENT_FAILURE": "Payment Method Failed", + "BILLING_HOLD": "Billing Hold", + "POLICING_SUSPENDED": "Suspended for Policy Violation", + "OTHER": "Other Status" + } + }, + "xdm:currency": { + "type": "string", + "title": "Currency", + "description": "Currency code (ISO 4217) for monetary values" + }, + "xdm:currencyCode": { + "type": "string", + "title": "Currency Code", + "description": "Alias of currency (ISO 4217) for migration from GenStudio templates" + }, + "xdm:timezone": { + "type": "string", + "title": "Timezone", + "description": "Timezone for the entity (e.g., America/New_York)" + }, + "xdm:createdTime": { + "type": "string", + "format": "date-time", + "title": "Created Time", + "description": "When the entity was created" + }, + "xdm:updatedTime": { + "type": "string", + "format": "date-time", + "title": "Updated Time", + "description": "When the entity was last updated" + }, + "xdm:startTime": { + "type": "string", + "format": "date-time", + "title": "Start Time", + "description": "When the entity becomes active/starts running" + }, + "xdm:endTime": { + "type": "string", + "format": "date-time", + "title": "End Time", + "description": "When the entity stops running/expires" + }, + "xdm:objective": { + "type": "string", + "title": "Objective", + "description": "Campaign or ad group objective/goal", + "enum": [ + "awareness", + "consideration", + "conversions", + "reach", + "traffic", + "engagement", + "app_installs", + "video_views", + "lead_generation", + "catalog_sales", + "store_visits", + "other" + ], + "meta:enum": { + "awareness": "Brand Awareness", + "consideration": "Consideration", + "conversions": "Conversions", + "reach": "Reach", + "traffic": "Traffic/Link Clicks", + "engagement": "Engagement", + "app_installs": "App Installs", + "video_views": "Video Views", + "lead_generation": "Lead Generation", + "catalog_sales": "Catalog Sales", + "store_visits": "Store Visits", + "other": "Other Objective" + } + }, + "xdm:budgetType": { + "type": "string", + "title": "Budget Type", + "description": "Type of budget allocation", + "enum": ["daily", "lifetime", "campaign_budget_optimization"], + "meta:enum": { + "daily": "Daily Budget", + "lifetime": "Lifetime Budget", + "campaign_budget_optimization": "Campaign Budget Optimization" + } + }, + "xdm:dailyBudget": { + "type": "number", + "title": "Daily Budget", + "description": "Daily budget amount in account currency", + "minimum": 0 + }, + "xdm:lifetimeBudget": { + "type": "number", + "title": "Lifetime Budget", + "description": "Total lifetime budget amount in account currency", + "minimum": 0 + }, + "xdm:biddingStrategy": { + "type": "string", + "title": "Bidding Strategy", + "description": "Bidding strategy used for the entity" + }, + "xdm:optimizationGoal": { + "type": "string", + "title": "Optimization Goal", + "description": "What the ad delivery is optimized for" + } + } + } + } + } + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/core-metadata" + } + ], + "meta:status": "experimental" +} diff --git a/components/fieldgroups/paid-media/core-paid-media-metrics.example.1.json b/components/fieldgroups/paid-media/core-paid-media-metrics.example.1.json new file mode 100644 index 000000000..e8b1b9b54 --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-metrics.example.1.json @@ -0,0 +1,120 @@ +{ + "xdm:paidMedia": { + "xdm:metrics": { + "xdm:impressions": 50000, + "xdm:clicks": 2500, + "xdm:spend": 18000, + "xdm:reach": 26000, + "xdm:frequency": 1.92, + "xdm:ctr": 0.05, + "xdm:cpm": 36.0, + "xdm:cpc": 7.2, + "xdm:conversions": 1250, + "xdm:conversionValue": 187500, + "xdm:costPerConversion": 14.4, + "xdm:roas": 10.42, + "xdm:videoViews": 8900, + "xdm:videoCompletions": 5785, + "xdm:engagements": 12345, + "xdm:engagementRate": 0.247, + "xdm:additionalMetrics": [ + { + "xdm:metricName": "outbound_clicks", + "xdm:metricValue": 2340, + "xdm:metricType": "clicks", + "xdm:metricUnit": "count" + }, + { + "xdm:metricName": "link_clicks", + "xdm:metricValue": 2500, + "xdm:metricType": "clicks", + "xdm:metricUnit": "count" + }, + { + "xdm:metricName": "landing_page_views", + "xdm:metricValue": 2340, + "xdm:metricType": "engagement", + "xdm:metricUnit": "count" + }, + { + "xdm:metricName": "post_engagement", + "xdm:metricValue": 12345, + "xdm:metricType": "engagement", + "xdm:metricUnit": "count" + }, + { + "xdm:metricName": "post_reactions", + "xdm:metricValue": 9876, + "xdm:metricType": "engagement", + "xdm:metricUnit": "count" + }, + { + "xdm:metricName": "post_comments", + "xdm:metricValue": 1247, + "xdm:metricType": "engagement", + "xdm:metricUnit": "count" + }, + { + "xdm:metricName": "post_shares", + "xdm:metricValue": 892, + "xdm:metricType": "engagement", + "xdm:metricUnit": "count" + }, + { + "xdm:metricName": "post_saves", + "xdm:metricValue": 456, + "xdm:metricType": "engagement", + "xdm:metricUnit": "count" + }, + { + "xdm:metricName": "video_30_sec_watched_actions", + "xdm:metricValue": 6234, + "xdm:metricType": "video", + "xdm:metricUnit": "count" + }, + { + "xdm:metricName": "video_p95_watched_actions", + "xdm:metricValue": 5785, + "xdm:metricType": "video", + "xdm:metricUnit": "count" + }, + { + "xdm:metricName": "video_avg_time_watched_actions", + "xdm:metricValue": 18.5, + "xdm:metricType": "video", + "xdm:metricUnit": "seconds" + }, + { + "xdm:metricName": "cost_per_outbound_click", + "xdm:metricValue": 7.69, + "xdm:metricType": "cost", + "xdm:metricUnit": "currency" + }, + { + "xdm:metricName": "cost_per_unique_click", + "xdm:metricValue": 8.12, + "xdm:metricType": "cost", + "xdm:metricUnit": "currency" + }, + { + "xdm:metricName": "unique_clicks", + "xdm:metricValue": 2217, + "xdm:metricType": "clicks", + "xdm:metricUnit": "count" + }, + { + "xdm:metricName": "unique_ctr", + "xdm:metricValue": 0.0443, + "xdm:metricType": "rate", + "xdm:metricUnit": "percentage" + }, + { + "xdm:metricName": "frequency", + "xdm:metricValue": 1.92, + "xdm:metricType": "frequency", + "xdm:metricUnit": "count" + } + ] + } + } +} diff --git a/components/fieldgroups/paid-media/core-paid-media-metrics.schema.json b/components/fieldgroups/paid-media/core-paid-media-metrics.schema.json new file mode 100644 index 000000000..ac2a295ae --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-metrics.schema.json @@ -0,0 +1,169 @@ +{ + "meta:license": [ + "Copyright 2025 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "https://ns.adobe.com/xdm/mixins/paid-media/core-metrics", + "title": "Core Paid Media Metrics", + "type": "object", + "meta:extensible": true, + "meta:abstract": true, + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/classes/summarymetrics"], + "description": "Core performance metrics common across paid media platforms", + "definitions": { + "core-metrics": { + "properties": { + "xdm:paidMedia": { + "type": "object", + "properties": { + "xdm:metrics": { + "type": "object", + "title": "Paid Media Core Metrics", + "description": "Common performance metrics for paid media campaigns", + "properties": { + "xdm:impressions": { + "type": "integer", + "title": "Impressions", + "description": "Number of times ads were displayed", + "minimum": 0 + }, + "xdm:clicks": { + "type": "integer", + "title": "Clicks", + "description": "Number of clicks on ads", + "minimum": 0 + }, + "xdm:spend": { + "type": "number", + "title": "Spend", + "description": "Amount spent in account currency", + "minimum": 0 + }, + "xdm:reach": { + "type": "integer", + "title": "Reach", + "description": "Number of unique users who saw the ads", + "minimum": 0 + }, + "xdm:frequency": { + "type": "number", + "title": "Frequency", + "description": "Average number of times each user saw the ads", + "minimum": 0 + }, + "xdm:ctr": { + "type": "number", + "title": "Click-Through Rate", + "description": "Click-through rate (clicks/impressions)", + "minimum": 0, + "maximum": 1 + }, + "xdm:cpm": { + "type": "number", + "title": "Cost Per Mille", + "description": "Cost per thousand impressions", + "minimum": 0 + }, + "xdm:cpc": { + "type": "number", + "title": "Cost Per Click", + "description": "Average cost per click", + "minimum": 0 + }, + "xdm:conversions": { + "type": "number", + "title": "Conversions", + "description": "Total number of conversions", + "minimum": 0 + }, + "xdm:conversionValue": { + "type": "number", + "title": "Conversion Value", + "description": "Total value of conversions in account currency", + "minimum": 0 + }, + "xdm:costPerConversion": { + "type": "number", + "title": "Cost Per Conversion", + "description": "Average cost per conversion", + "minimum": 0 + }, + "xdm:roas": { + "type": "number", + "title": "Return on Ad Spend", + "description": "Return on ad spend (conversion value / spend)", + "minimum": 0 + }, + "xdm:videoViews": { + "type": "integer", + "title": "Video Views", + "description": "Number of video views", + "minimum": 0 + }, + "xdm:videoCompletions": { + "type": "integer", + "title": "Video Completions", + "description": "Number of video completions", + "minimum": 0 + }, + "xdm:engagements": { + "type": "integer", + "title": "Engagements", + "description": "Total engagement actions (likes, shares, comments, etc.)", + "minimum": 0 + }, + "xdm:engagementRate": { + "type": "number", + "title": "Engagement Rate", + "description": "Engagement rate (engagements/impressions)", + "minimum": 0, + "maximum": 1 + }, + "xdm:additionalMetrics": { + "title": "Additional Metrics", + "description": "Platform-specific or custom metrics not defined in core schema. Allows ingestion of arbitrary metrics from paid media network APIs without requiring schema changes.", + "type": "array", + "items": { + "type": "object", + "properties": { + "xdm:metricName": { + "title": "Metric Name", + "type": "string", + "description": "Name of the metric (e.g., 'video_30_sec_watched_actions', 'video_p95_watched_actions', 'outbound_click_rate')" + }, + "xdm:metricValue": { + "title": "Metric Value", + "type": "number", + "description": "Numeric value of the metric" + }, + "xdm:metricType": { + "title": "Metric Type", + "type": "string", + "description": "Type/category of metric (e.g., 'video', 'conversion', 'engagement', 'attribution')" + }, + "xdm:metricUnit": { + "title": "Metric Unit", + "type": "string", + "description": "Unit of measurement (e.g., 'count', 'percentage', 'currency', 'seconds')" + } + }, + "required": ["xdm:metricName", "xdm:metricValue"] + } + } + } + } + } + } + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/core-metrics" + } + ], + "meta:status": "experimental" +} diff --git a/components/fieldgroups/paid-media/core-paid-media-quality-metrics.example.1.json b/components/fieldgroups/paid-media/core-paid-media-quality-metrics.example.1.json new file mode 100644 index 000000000..43b5ba06c --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-quality-metrics.example.1.json @@ -0,0 +1,75 @@ +{ + "xdm:paidMedia": { + "xdm:qualityMetrics": { + "xdm:relevanceScore": 9.0, + "xdm:engagementScore": 8.2, + "xdm:conversionScore": 8.8, + "xdm:overallQualityScore": 8.67, + "xdm:negativeActions": 25, + "xdm:negativeActionRate": 0.0005, + "xdm:positiveActions": 12345, + "xdm:positiveActionRate": 0.247, + "xdm:brandSafetyScore": 9.5, + "xdm:viewabilityScore": 8.5, + "xdm:fraudScore": 0.5, + "xdm:invalidTrafficRate": 0.02, + "xdm:botTrafficRate": 0.015, + "xdm:humanTrafficRate": 0.985, + "xdm:attentionScore": 7.8, + "xdm:dwellTime": 4.2, + "xdm:interactionDepth": 3.5, + "xdm:creativeFatigue": 2.1, + "xdm:frequencyFatigue": 1.8, + "xdm:audienceRelevance": 8.9, + "xdm:contextualRelevance": 8.5, + "xdm:emotionalResonance": 7.6, + "xdm:memorabilityScore": 7.2, + "xdm:brandLiftScore": 6.8, + "xdm:intentLiftScore": 7.4, + "xdm:qualityTrend": "improving", + "xdm:benchmarkComparison": { + "xdm:industryAverage": 7.5, + "xdm:percentileRank": 78, + "xdm:competitorAverage": 7.8 + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "meta_quality_ranking", + "xdm:stringValue": "above_average" + }, + { + "xdm:fieldName": "meta_engagement_rate_ranking", + "xdm:stringValue": "above_average" + }, + { + "xdm:fieldName": "meta_conversion_rate_ranking", + "xdm:stringValue": "above_average" + }, + { + "xdm:fieldName": "meta_negative_feedback_rate", + "xdm:stringValue": "0.0005" + }, + { + "xdm:fieldName": "meta_hide_rate", + "xdm:stringValue": "0.00046" + }, + { + "xdm:fieldName": "meta_report_rate", + "xdm:stringValue": "0.00004" + }, + { + "xdm:fieldName": "meta_positive_feedback_rate", + "xdm:stringValue": "0.247" + }, + { + "xdm:fieldName": "meta_viewability_rate", + "xdm:stringValue": "0.85" + }, + { + "xdm:fieldName": "meta_brand_safety_score", + "xdm:stringValue": "9.5" + } + ] + } + } +} diff --git a/components/fieldgroups/paid-media/core-paid-media-quality-metrics.schema.json b/components/fieldgroups/paid-media/core-paid-media-quality-metrics.schema.json new file mode 100644 index 000000000..21d788404 --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-quality-metrics.schema.json @@ -0,0 +1,247 @@ +{ + "meta:license": [ + "Copyright 2025 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "https://ns.adobe.com/xdm/mixins/paid-media/quality-metrics", + "title": "Core Paid Media Quality Metrics", + "type": "object", + "meta:extensible": true, + "meta:abstract": true, + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/classes/summarymetrics"], + "description": "Ad quality and performance indicators for paid media campaigns", + "definitions": { + "quality-metrics": { + "properties": { + "xdm:paidMedia": { + "type": "object", + "properties": { + "xdm:qualityMetrics": { + "type": "object", + "title": "Quality Metrics", + "description": "Ad quality and performance indicators", + "properties": { + "xdm:relevanceScore": { + "type": "number", + "title": "Relevance Score", + "description": "Ad relevance score", + "minimum": 0, + "maximum": 10 + }, + "xdm:engagementScore": { + "type": "number", + "title": "Engagement Score", + "description": "Ad engagement quality score", + "minimum": 0, + "maximum": 10 + }, + "xdm:conversionScore": { + "type": "number", + "title": "Conversion Score", + "description": "Ad conversion quality score", + "minimum": 0, + "maximum": 10 + }, + "xdm:overallQualityScore": { + "type": "number", + "title": "Overall Quality Score", + "description": "Overall ad quality score", + "minimum": 0, + "maximum": 10 + }, + "xdm:negativeActions": { + "type": "integer", + "title": "Negative Actions", + "description": "Number of negative actions (hides, reports, etc.)", + "minimum": 0 + }, + "xdm:negativeActionRate": { + "type": "number", + "title": "Negative Action Rate", + "description": "Rate of negative actions", + "minimum": 0, + "maximum": 1 + }, + "xdm:positiveActions": { + "type": "integer", + "title": "Positive Actions", + "description": "Number of positive actions (likes, shares, etc.)", + "minimum": 0 + }, + "xdm:positiveActionRate": { + "type": "number", + "title": "Positive Action Rate", + "description": "Rate of positive actions", + "minimum": 0, + "maximum": 1 + }, + "xdm:brandSafetyScore": { + "type": "number", + "title": "Brand Safety Score", + "description": "Brand safety compliance score", + "minimum": 0, + "maximum": 10 + }, + "xdm:viewabilityScore": { + "type": "number", + "title": "Viewability Score", + "description": "Ad viewability quality score", + "minimum": 0, + "maximum": 10 + }, + "xdm:fraudScore": { + "type": "number", + "title": "Fraud Score", + "description": "Ad fraud risk score (higher = more risk)", + "minimum": 0, + "maximum": 10 + }, + "xdm:invalidTrafficRate": { + "type": "number", + "title": "Invalid Traffic Rate", + "description": "Percentage of traffic flagged as invalid", + "minimum": 0, + "maximum": 1 + }, + "xdm:botTrafficRate": { + "type": "number", + "title": "Bot Traffic Rate", + "description": "Percentage of traffic identified as bot traffic", + "minimum": 0, + "maximum": 1 + }, + "xdm:humanTrafficRate": { + "type": "number", + "title": "Human Traffic Rate", + "description": "Percentage of traffic verified as human", + "minimum": 0, + "maximum": 1 + }, + "xdm:attentionScore": { + "type": "number", + "title": "Attention Score", + "description": "User attention quality score", + "minimum": 0, + "maximum": 10 + }, + "xdm:dwellTime": { + "type": "number", + "title": "Dwell Time", + "description": "Average time users spend viewing the ad (seconds)", + "minimum": 0 + }, + "xdm:interactionDepth": { + "type": "number", + "title": "Interaction Depth", + "description": "Depth of user interaction with the ad", + "minimum": 0 + }, + "xdm:creativeFatigue": { + "type": "number", + "title": "Creative Fatigue", + "description": "Creative fatigue score (higher = more fatigued)", + "minimum": 0, + "maximum": 10 + }, + "xdm:frequencyFatigue": { + "type": "number", + "title": "Frequency Fatigue", + "description": "Frequency fatigue score", + "minimum": 0, + "maximum": 10 + }, + "xdm:audienceRelevance": { + "type": "number", + "title": "Audience Relevance", + "description": "Relevance of ad to target audience", + "minimum": 0, + "maximum": 10 + }, + "xdm:contextualRelevance": { + "type": "number", + "title": "Contextual Relevance", + "description": "Relevance of ad to content context", + "minimum": 0, + "maximum": 10 + }, + "xdm:emotionalResonance": { + "type": "number", + "title": "Emotional Resonance", + "description": "Emotional impact score of the ad", + "minimum": 0, + "maximum": 10 + }, + "xdm:memorabilityScore": { + "type": "number", + "title": "Memorability Score", + "description": "Ad memorability score", + "minimum": 0, + "maximum": 10 + }, + "xdm:brandLiftScore": { + "type": "number", + "title": "Brand Lift Score", + "description": "Brand awareness lift score", + "minimum": 0, + "maximum": 10 + }, + "xdm:intentLiftScore": { + "type": "number", + "title": "Intent Lift Score", + "description": "Purchase intent lift score", + "minimum": 0, + "maximum": 10 + }, + "xdm:qualityTrend": { + "type": "string", + "title": "Quality Trend", + "description": "Trend direction for quality metrics", + "enum": ["improving", "declining", "stable", "volatile"], + "meta:enum": { + "improving": "Quality is improving", + "declining": "Quality is declining", + "stable": "Quality is stable", + "volatile": "Quality is volatile" + } + }, + "xdm:benchmarkComparison": { + "type": "object", + "title": "Benchmark Comparison", + "description": "Comparison to industry benchmarks", + "properties": { + "xdm:industryAverage": { + "type": "number", + "title": "Industry Average", + "description": "Industry average quality score" + }, + "xdm:percentileRank": { + "type": "number", + "title": "Percentile Rank", + "description": "Percentile rank compared to industry", + "minimum": 0, + "maximum": 100 + }, + "xdm:competitorAverage": { + "type": "number", + "title": "Competitor Average", + "description": "Average quality score of competitors" + } + } + } + } + } + } + } + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/quality-metrics" + } + ], + "meta:status": "experimental" +} diff --git a/components/fieldgroups/paid-media/core-paid-media-video-metrics.example.1.json b/components/fieldgroups/paid-media/core-paid-media-video-metrics.example.1.json new file mode 100644 index 000000000..67e70e26e --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-video-metrics.example.1.json @@ -0,0 +1,95 @@ +{ + "xdm:paidMedia": { + "xdm:videoMetrics": { + "xdm:videoPlays": 9500, + "xdm:video3SecViews": 8900, + "xdm:video2SecViews": 9200, + "xdm:video6SecViews": 8450, + "xdm:video10SecViews": 7890, + "xdm:videoViewRate2Sec": 0.968, + "xdm:videoViewRate6Sec": 0.889, + "xdm:video15SecViews": 7234, + "xdm:video30SecViews": 6234, + "xdm:videoQuartile1": 8234, + "xdm:videoQuartile2": 7456, + "xdm:videoQuartile3": 6789, + "xdm:videoCompletions": 5785, + "xdm:videoCompletionRate": 0.65, + "xdm:videoViewRate25Percent": 0.867, + "xdm:videoViewRate50Percent": 0.785, + "xdm:videoViewRate75Percent": 0.715, + "xdm:videoViewRate100Percent": 0.609, + "xdm:averageVideoWatchTime": 18.5, + "xdm:totalVideoWatchTime": 175750, + "xdm:videoMrcViews": 8234, + "xdm:videoThroughplayViews": 5785, + "xdm:videoSkips": 1265, + "xdm:videoSkipRate": 0.133, + "xdm:videoReplays": 456, + "xdm:videoPauses": 1234, + "xdm:videoResumes": 1156, + "xdm:videoFullscreenViews": 2345, + "xdm:videoMutes": 890, + "xdm:videoUnmutes": 678, + "xdm:videoVolumeChanges": 234, + "xdm:videoClickToPlays": 3456, + "xdm:videoAutoPlays": 6044, + "xdm:videoViewabilityRate": 0.85, + "xdm:videoAudibilityRate": 0.72, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "meta_video_plays", + "xdm:stringValue": "9500" + }, + { + "xdm:fieldName": "meta_video_3_sec_views", + "xdm:stringValue": "8900" + }, + { + "xdm:fieldName": "meta_video_30_sec_watched_actions", + "xdm:stringValue": "6234" + }, + { + "xdm:fieldName": "meta_video_p25_watched_actions", + "xdm:stringValue": "8234" + }, + { + "xdm:fieldName": "meta_video_p50_watched_actions", + "xdm:stringValue": "7456" + }, + { + "xdm:fieldName": "meta_video_p75_watched_actions", + "xdm:stringValue": "6789" + }, + { + "xdm:fieldName": "meta_video_p95_watched_actions", + "xdm:stringValue": "5785" + }, + { + "xdm:fieldName": "meta_video_p100_watched_actions", + "xdm:stringValue": "5785" + }, + { + "xdm:fieldName": "meta_video_avg_time_watched_actions", + "xdm:stringValue": "18.5" + }, + { + "xdm:fieldName": "meta_video_total_time_watched", + "xdm:stringValue": "175750" + }, + { + "xdm:fieldName": "meta_video_completion_rate", + "xdm:stringValue": "0.65" + }, + { + "xdm:fieldName": "meta_video_viewability_rate", + "xdm:stringValue": "0.85" + }, + { + "xdm:fieldName": "meta_video_sound_on_rate", + "xdm:stringValue": "0.72" + } + ] + } + } +} diff --git a/components/fieldgroups/paid-media/core-paid-media-video-metrics.schema.json b/components/fieldgroups/paid-media/core-paid-media-video-metrics.schema.json new file mode 100644 index 000000000..c7c4c86b3 --- /dev/null +++ b/components/fieldgroups/paid-media/core-paid-media-video-metrics.schema.json @@ -0,0 +1,260 @@ +{ + "meta:license": [ + "Copyright 2025 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "https://ns.adobe.com/xdm/mixins/paid-media/video-metrics", + "title": "Core Paid Media Video Metrics", + "type": "object", + "meta:extensible": true, + "meta:abstract": true, + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/classes/summarymetrics"], + "description": "Video-specific performance metrics for paid media campaigns", + "definitions": { + "video-metrics": { + "properties": { + "xdm:paidMedia": { + "type": "object", + "properties": { + "xdm:videoMetrics": { + "type": "object", + "title": "Video Metrics", + "description": "Metrics specific to video ads", + "properties": { + "xdm:videoPlays": { + "type": "integer", + "title": "Video Plays", + "description": "Number of video plays", + "minimum": 0 + }, + "xdm:video3SecViews": { + "type": "integer", + "title": "3-Second Video Views", + "description": "Number of 3-second video views", + "minimum": 0 + }, + "xdm:video2SecViews": { + "type": "integer", + "title": "2-Second Video Views", + "description": "Number of times video was viewed for at least 2 seconds", + "minimum": 0 + }, + "xdm:video6SecViews": { + "type": "integer", + "title": "6-Second Video Views", + "description": "Number of times video was viewed for at least 6 seconds", + "minimum": 0 + }, + "xdm:video10SecViews": { + "type": "integer", + "title": "10-Second Video Views", + "description": "Number of times video was viewed for at least 10 seconds", + "minimum": 0 + }, + "xdm:videoViewRate2Sec": { + "type": "number", + "title": "2-Second Video View Rate", + "description": "Percentage of videos viewed for at least 2 seconds", + "minimum": 0, + "maximum": 1 + }, + "xdm:videoViewRate6Sec": { + "type": "number", + "title": "6-Second Video View Rate", + "description": "Percentage of videos viewed for at least 6 seconds", + "minimum": 0, + "maximum": 1 + }, + "xdm:video15SecViews": { + "type": "integer", + "title": "15-Second Video Views", + "description": "Number of 15-second video views", + "minimum": 0 + }, + "xdm:video30SecViews": { + "type": "integer", + "title": "30-Second Video Views", + "description": "Number of 30-second video views", + "minimum": 0 + }, + "xdm:videoQuartile1": { + "type": "integer", + "title": "Video 25% Completion", + "description": "Number of videos watched to 25%", + "minimum": 0 + }, + "xdm:videoQuartile2": { + "type": "integer", + "title": "Video 50% Completion", + "description": "Number of videos watched to 50%", + "minimum": 0 + }, + "xdm:videoQuartile3": { + "type": "integer", + "title": "Video 75% Completion", + "description": "Number of videos watched to 75%", + "minimum": 0 + }, + "xdm:videoCompletions": { + "type": "integer", + "title": "Video Completions", + "description": "Number of videos watched to completion", + "minimum": 0 + }, + "xdm:videoCompletionRate": { + "type": "number", + "title": "Video Completion Rate", + "description": "Percentage of videos watched to completion", + "minimum": 0, + "maximum": 1 + }, + "xdm:videoViewRate25Percent": { + "type": "number", + "title": "25% Video View Rate", + "description": "Percentage of videos viewed to 25% completion", + "minimum": 0, + "maximum": 1 + }, + "xdm:videoViewRate50Percent": { + "type": "number", + "title": "50% Video View Rate", + "description": "Percentage of videos viewed to 50% completion", + "minimum": 0, + "maximum": 1 + }, + "xdm:videoViewRate75Percent": { + "type": "number", + "title": "75% Video View Rate", + "description": "Percentage of videos viewed to 75% completion", + "minimum": 0, + "maximum": 1 + }, + "xdm:videoViewRate100Percent": { + "type": "number", + "title": "100% Video View Rate", + "description": "Percentage of videos viewed to 100% completion", + "minimum": 0, + "maximum": 1 + }, + "xdm:averageVideoWatchTime": { + "type": "number", + "title": "Average Video Watch Time", + "description": "Average time spent watching videos in seconds", + "minimum": 0 + }, + "xdm:totalVideoWatchTime": { + "type": "number", + "title": "Total Video Watch Time", + "description": "Total time spent watching videos in seconds", + "minimum": 0 + }, + "xdm:videoMrcViews": { + "type": "integer", + "title": "Video MRC Views", + "description": "Video views meeting MRC standards", + "minimum": 0 + }, + "xdm:videoThroughplayViews": { + "type": "integer", + "title": "Video Throughplay Views", + "description": "Number of throughplay video views", + "minimum": 0 + }, + "xdm:videoSkips": { + "type": "integer", + "title": "Video Skips", + "description": "Number of video skips", + "minimum": 0 + }, + "xdm:videoSkipRate": { + "type": "number", + "title": "Video Skip Rate", + "description": "Percentage of videos that were skipped", + "minimum": 0, + "maximum": 1 + }, + "xdm:videoReplays": { + "type": "integer", + "title": "Video Replays", + "description": "Number of video replays", + "minimum": 0 + }, + "xdm:videoPauses": { + "type": "integer", + "title": "Video Pauses", + "description": "Number of video pauses", + "minimum": 0 + }, + "xdm:videoResumes": { + "type": "integer", + "title": "Video Resumes", + "description": "Number of video resumes after pause", + "minimum": 0 + }, + "xdm:videoFullscreenViews": { + "type": "integer", + "title": "Video Fullscreen Views", + "description": "Number of fullscreen video views", + "minimum": 0 + }, + "xdm:videoMutes": { + "type": "integer", + "title": "Video Mutes", + "description": "Number of video mutes", + "minimum": 0 + }, + "xdm:videoUnmutes": { + "type": "integer", + "title": "Video Unmutes", + "description": "Number of video unmutes", + "minimum": 0 + }, + "xdm:videoVolumeChanges": { + "type": "integer", + "title": "Video Volume Changes", + "description": "Number of video volume changes", + "minimum": 0 + }, + "xdm:videoClickToPlays": { + "type": "integer", + "title": "Video Click to Plays", + "description": "Number of click-to-play actions", + "minimum": 0 + }, + "xdm:videoAutoPlays": { + "type": "integer", + "title": "Video Auto Plays", + "description": "Number of auto-play video starts", + "minimum": 0 + }, + "xdm:videoViewabilityRate": { + "type": "number", + "title": "Video Viewability Rate", + "description": "Percentage of video impressions that were viewable", + "minimum": 0, + "maximum": 1 + }, + "xdm:videoAudibilityRate": { + "type": "number", + "title": "Video Audibility Rate", + "description": "Percentage of video views with audible sound", + "minimum": 0, + "maximum": 1 + } + } + } + } + } + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/video-metrics" + } + ], + "meta:status": "experimental" +} diff --git a/package.json b/package.json index f57f6d984..d37c4a778 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "clean": "rm -rf docs/reference", "markdown": "./bin/pre-doc-gen.sh && jsonschema2md -o docs/reference -d docsource --link-abstract abstract.md --link-extensible extensions.md --link-status status.md --link-id id.md --link-custom extensions.md --link-additional extensions.md -v \"06\" || : && rm -rf docsource", "test": "mocha", + "validate": "node bin/validate-schemas.js", "lint": "prettier --write *.json RELEASING.md CHANGELOG.md CONTRIBUTING.md README.md docs/*.md schemas/*/**/*.md schemas/*/*.json schemas/*/**/*.json components/*/*.json components/*/**/*.json extensions/*/**/*.json extensions/*/*/**/*.json && git diff --exit-code", "lint-quick": "pretty-quick", "package": "npm run markdown && curl -o \"./node_modules/markdown-importer-0.0.4-jar-with-dependencies.jar\" -C - https://artifactory.corp.adobe.com/artifactory/maven-markdown-tools-release/io/adobe/udp/markdown-importer/0.0.4/markdown-importer-0.0.4-jar-with-dependencies.jar && java -jar ./node_modules/markdown-importer-0.0.4-jar-with-dependencies.jar markdown2aem.yaml", @@ -36,6 +37,7 @@ "@adobe/jsonschema2md": "1.1.0", "ajv": "5.5.0", "ajv-cli": "^2.1.0", + "ajv-formats": "^3.0.1", "camelcase": "^4.1.0", "deep-diff": "^1.0.2", "deep-rename-keys": "^0.2.1", From cd68552fac01179b584e7911a927260cb4e0cb19 Mon Sep 17 00:00:00 2001 From: Dan Bunker Date: Wed, 12 Nov 2025 13:25:32 -0800 Subject: [PATCH 06/22] Fix fieldgroup extension fields --- ...ore-paid-media-account-details.schema.json | 2 +- .../core-paid-media-ad-details.schema.json | 47 +++++++++++++++---- ...ore-paid-media-adgroup-details.schema.json | 7 ++- .../core-paid-media-asset-details.schema.json | 12 +++-- ...re-paid-media-campaign-details.schema.json | 24 ++++++++-- .../core-paid-media-cost-metrics.schema.json | 8 +++- ...-paid-media-experience-details.schema.json | 2 +- .../core-paid-media-identifiers.schema.json | 2 +- .../core-paid-media-metadata.schema.json | 2 +- 9 files changed, 83 insertions(+), 23 deletions(-) diff --git a/components/fieldgroups/paid-media/core-paid-media-account-details.schema.json b/components/fieldgroups/paid-media/core-paid-media-account-details.schema.json index 2af52c458..27228e783 100644 --- a/components/fieldgroups/paid-media/core-paid-media-account-details.schema.json +++ b/components/fieldgroups/paid-media/core-paid-media-account-details.schema.json @@ -11,7 +11,7 @@ "type": "object", "meta:extensible": true, "meta:abstract": true, - "meta:intendedToExtend": ["https://ns.adobe.com/xdm/context/record"], + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/data/record"], "description": "Account-specific details and configuration fields for paid media accounts", "definitions": { "account-details": { diff --git a/components/fieldgroups/paid-media/core-paid-media-ad-details.schema.json b/components/fieldgroups/paid-media/core-paid-media-ad-details.schema.json index c66fd575f..bf3aff656 100644 --- a/components/fieldgroups/paid-media/core-paid-media-ad-details.schema.json +++ b/components/fieldgroups/paid-media/core-paid-media-ad-details.schema.json @@ -11,7 +11,7 @@ "type": "object", "meta:extensible": true, "meta:abstract": true, - "meta:intendedToExtend": ["https://ns.adobe.com/xdm/context/record"], + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/data/record"], "description": "Ad-specific details and configuration fields for paid media ads", "definitions": { "ad-details": { @@ -202,7 +202,10 @@ "xdm:objectStorySpec": { "type": "object", "title": "Object Story Spec", - "description": "Full story specification for complex ad types" + "description": "Full story specification for complex ad types", + "additionalProperties": { + "$ref": "https://ns.adobe.com/xdm/datatypes/paid-media-additional-field" + } }, "xdm:isShareable": { "type": "boolean", @@ -224,12 +227,18 @@ "xdm:appInstallProperties": { "type": "object", "title": "App Install Properties", - "description": "Properties for app install ads" + "description": "Properties for app install ads", + "additionalProperties": { + "$ref": "https://ns.adobe.com/xdm/datatypes/paid-media-additional-field" + } }, "xdm:deepLinkProperties": { "type": "object", "title": "Deep Link Properties", - "description": "Properties for deep link ads" + "description": "Properties for deep link ads", + "additionalProperties": { + "$ref": "https://ns.adobe.com/xdm/datatypes/paid-media-additional-field" + } } } }, @@ -282,32 +291,50 @@ "xdm:chatProperties": { "type": "object", "title": "Chat Properties", - "description": "Properties for chat-enabled ads" + "description": "Properties for chat-enabled ads", + "additionalProperties": { + "$ref": "https://ns.adobe.com/xdm/datatypes/paid-media-additional-field" + } }, "xdm:webViewProperties": { "type": "object", "title": "Web View Properties", - "description": "Properties for web view ads" + "description": "Properties for web view ads", + "additionalProperties": { + "$ref": "https://ns.adobe.com/xdm/datatypes/paid-media-additional-field" + } }, "xdm:adToLensProperties": { "type": "object", "title": "Ad to Lens Properties", - "description": "Properties for AR lens ads" + "description": "Properties for AR lens ads", + "additionalProperties": { + "$ref": "https://ns.adobe.com/xdm/datatypes/paid-media-additional-field" + } }, "xdm:adToCallProperties": { "type": "object", "title": "Ad to Call Properties", - "description": "Properties for call-to-action ads" + "description": "Properties for call-to-action ads", + "additionalProperties": { + "$ref": "https://ns.adobe.com/xdm/datatypes/paid-media-additional-field" + } }, "xdm:adToMessageProperties": { "type": "object", "title": "Ad to Message Properties", - "description": "Properties for message ads" + "description": "Properties for message ads", + "additionalProperties": { + "$ref": "https://ns.adobe.com/xdm/datatypes/paid-media-additional-field" + } }, "xdm:reminderProperties": { "type": "object", "title": "Reminder Properties", - "description": "Properties for reminder ads" + "description": "Properties for reminder ads", + "additionalProperties": { + "$ref": "https://ns.adobe.com/xdm/datatypes/paid-media-additional-field" + } } } }, diff --git a/components/fieldgroups/paid-media/core-paid-media-adgroup-details.schema.json b/components/fieldgroups/paid-media/core-paid-media-adgroup-details.schema.json index 3fadee044..2a872d05a 100644 --- a/components/fieldgroups/paid-media/core-paid-media-adgroup-details.schema.json +++ b/components/fieldgroups/paid-media/core-paid-media-adgroup-details.schema.json @@ -11,7 +11,7 @@ "type": "object", "meta:extensible": true, "meta:abstract": true, - "meta:intendedToExtend": ["https://ns.adobe.com/xdm/context/record"], + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/data/record"], "description": "Ad group-specific details and configuration fields for paid media ad groups/ad sets/ad squads", "definitions": { "adgroup-details": { @@ -153,7 +153,10 @@ "xdm:optimizationGoalMetadata": { "type": "object", "title": "Optimization Goal Metadata", - "description": "Metadata for optimization goals" + "description": "Metadata for optimization goals", + "additionalProperties": { + "$ref": "https://ns.adobe.com/xdm/datatypes/paid-media-additional-field" + } }, "xdm:conversionWindow": { "type": "string", diff --git a/components/fieldgroups/paid-media/core-paid-media-asset-details.schema.json b/components/fieldgroups/paid-media/core-paid-media-asset-details.schema.json index c5c674701..fbfa81dd1 100644 --- a/components/fieldgroups/paid-media/core-paid-media-asset-details.schema.json +++ b/components/fieldgroups/paid-media/core-paid-media-asset-details.schema.json @@ -11,7 +11,7 @@ "type": "object", "meta:extensible": true, "meta:abstract": true, - "meta:intendedToExtend": ["https://ns.adobe.com/xdm/context/record"], + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/data/record"], "description": "Asset-specific details and configuration fields for paid media creative assets", "definitions": { "asset-details": { @@ -249,7 +249,10 @@ "xdm:buttonProperties": { "type": "object", "title": "Button Properties", - "description": "Properties for interactive buttons" + "description": "Properties for interactive buttons", + "additionalProperties": { + "$ref": "https://ns.adobe.com/xdm/datatypes/paid-media-additional-field" + } }, "xdm:webViewProperties": { "type": "object", @@ -266,7 +269,10 @@ "xdm:deepLinkProperties": { "type": "object", "title": "Deep Link Properties", - "description": "Properties for deep link interactions" + "description": "Properties for deep link interactions", + "additionalProperties": { + "$ref": "https://ns.adobe.com/xdm/datatypes/paid-media-additional-field" + } } } }, diff --git a/components/fieldgroups/paid-media/core-paid-media-campaign-details.schema.json b/components/fieldgroups/paid-media/core-paid-media-campaign-details.schema.json index 51c068bfb..0f6236f7d 100644 --- a/components/fieldgroups/paid-media/core-paid-media-campaign-details.schema.json +++ b/components/fieldgroups/paid-media/core-paid-media-campaign-details.schema.json @@ -11,7 +11,7 @@ "type": "object", "meta:extensible": true, "meta:abstract": true, - "meta:intendedToExtend": ["https://ns.adobe.com/xdm/context/record"], + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/data/record"], "description": "Campaign-specific details and configuration fields for paid media campaigns", "definitions": { "campaign-details": { @@ -209,7 +209,16 @@ "friday", "saturday", "sunday" - ] + ], + "meta:enum": { + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday" + } }, "xdm:startHour": { "type": "integer", @@ -428,7 +437,16 @@ "STORIES", "REELS", "OTHER" - ] + ], + "meta:enum": { + "SEARCH": "Search", + "PRODUCT_PAGE": "Product Page", + "HOME": "Home", + "FEED": "Feed", + "STORIES": "Stories", + "REELS": "Reels", + "OTHER": "Other" + } }, "xdm:adjustmentPercentage": { "type": "number", diff --git a/components/fieldgroups/paid-media/core-paid-media-cost-metrics.schema.json b/components/fieldgroups/paid-media/core-paid-media-cost-metrics.schema.json index e8127caac..ea6bee263 100644 --- a/components/fieldgroups/paid-media/core-paid-media-cost-metrics.schema.json +++ b/components/fieldgroups/paid-media/core-paid-media-cost-metrics.schema.json @@ -236,7 +236,13 @@ "xdm:pacingStatus": { "type": "string", "title": "Pacing Status", - "enum": ["on_track", "ahead", "behind", "paused"] + "enum": ["on_track", "ahead", "behind", "paused"], + "meta:enum": { + "on_track": "On Track", + "ahead": "Ahead", + "behind": "Behind", + "paused": "Paused" + } }, "xdm:projectedSpend": { "type": "number", diff --git a/components/fieldgroups/paid-media/core-paid-media-experience-details.schema.json b/components/fieldgroups/paid-media/core-paid-media-experience-details.schema.json index 0ecb861b0..15d039947 100644 --- a/components/fieldgroups/paid-media/core-paid-media-experience-details.schema.json +++ b/components/fieldgroups/paid-media/core-paid-media-experience-details.schema.json @@ -11,7 +11,7 @@ "type": "object", "meta:extensible": true, "meta:abstract": true, - "meta:intendedToExtend": ["https://ns.adobe.com/xdm/context/record"], + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/data/record"], "description": "Experience-specific details and configuration fields for paid media creative experiences", "definitions": { "experience-details": { diff --git a/components/fieldgroups/paid-media/core-paid-media-identifiers.schema.json b/components/fieldgroups/paid-media/core-paid-media-identifiers.schema.json index 1333e8c33..d2966f1c0 100644 --- a/components/fieldgroups/paid-media/core-paid-media-identifiers.schema.json +++ b/components/fieldgroups/paid-media/core-paid-media-identifiers.schema.json @@ -11,7 +11,7 @@ "type": "object", "meta:extensible": true, "meta:abstract": true, - "meta:intendedToExtend": ["https://ns.adobe.com/xdm/context/record"], + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/data/record"], "description": "Core identifier fields used across all paid media entities and ad networks", "definitions": { "core-identifiers": { diff --git a/components/fieldgroups/paid-media/core-paid-media-metadata.schema.json b/components/fieldgroups/paid-media/core-paid-media-metadata.schema.json index edd3813a7..ea0a9d0b5 100644 --- a/components/fieldgroups/paid-media/core-paid-media-metadata.schema.json +++ b/components/fieldgroups/paid-media/core-paid-media-metadata.schema.json @@ -11,7 +11,7 @@ "type": "object", "meta:extensible": true, "meta:abstract": true, - "meta:intendedToExtend": ["https://ns.adobe.com/xdm/context/record"], + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/data/record"], "description": "Core metadata fields common across paid media entities", "definitions": { "core-metadata": { From fe7439adcc4fa84d85b0c98b48bf6ab3c3a274eb Mon Sep 17 00:00:00 2001 From: Dan Bunker Date: Mon, 17 Nov 2025 10:20:53 -0800 Subject: [PATCH 07/22] Remove title and description that cause confusion when merged to top-level paidMedia object --- .../paid-media/core-paid-media-identifiers.schema.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/components/fieldgroups/paid-media/core-paid-media-identifiers.schema.json b/components/fieldgroups/paid-media/core-paid-media-identifiers.schema.json index d2966f1c0..6e20a2fe4 100644 --- a/components/fieldgroups/paid-media/core-paid-media-identifiers.schema.json +++ b/components/fieldgroups/paid-media/core-paid-media-identifiers.schema.json @@ -18,8 +18,6 @@ "properties": { "xdm:paidMedia": { "type": "object", - "title": "Paid Media Core Identifiers", - "description": "Core identifier fields for paid media entities", "properties": { "xdm:adNetwork": { "type": "string", From 0054660d9a938ecee42b32049715d6595ef16814 Mon Sep 17 00:00:00 2001 From: Dan Bunker Date: Wed, 19 Nov 2025 11:30:14 -0800 Subject: [PATCH 08/22] Revert duration type change --- components/datatypes/paid-media/paid-media-creative.schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/datatypes/paid-media/paid-media-creative.schema.json b/components/datatypes/paid-media/paid-media-creative.schema.json index bcf45d0d8..1b93ae35e 100644 --- a/components/datatypes/paid-media/paid-media-creative.schema.json +++ b/components/datatypes/paid-media/paid-media-creative.schema.json @@ -161,7 +161,7 @@ "minimum": 0 }, "xdm:duration": { - "$ref": "https://ns.adobe.com/xdm/data/measure", + "type": "number", "title": "Duration", "description": "Duration in seconds (for video/audio assets)" }, From 9c51a383abfd3f2c8ba7ed25f95bb7c4b2520571 Mon Sep 17 00:00:00 2001 From: Dan Bunker Date: Wed, 19 Nov 2025 13:14:51 -0800 Subject: [PATCH 09/22] Remove example fields that are not in the schema and switch number types to /xdm/data/measure refs --- ...-paid-media-account-details.example.1.json | 36 +++ .../core-paid-media-ad-details.example.1.json | 36 +++ ...-paid-media-adgroup-details.example.1.json | 42 ++++ ...re-paid-media-asset-details.example.1.json | 30 +++ ...re-paid-media-asset-details.example.2.json | 32 ++- ...re-paid-media-asset-details.example.3.json | 30 +++ ...d-media-attribution-metrics.example.1.json | 28 ++- ...paid-media-attribution-metrics.schema.json | 98 +++----- ...paid-media-campaign-details.example.1.json | 36 +++ ...id-media-conversion-metrics.example.1.json | 214 ++++++++--------- ...-paid-media-conversion-metrics.schema.json | 185 ++++++-------- ...ore-paid-media-cost-metrics.example.1.json | 227 ++++++++++-------- .../core-paid-media-cost-metrics.schema.json | 226 +++++++---------- ...paid-media-extended-metrics.example.1.json | 217 +++++++++-------- ...re-paid-media-extended-metrics.schema.json | 186 ++++++-------- .../core-paid-media-metrics.example.1.json | 64 +++-- .../core-paid-media-metrics.schema.json | 82 +++---- ...-paid-media-quality-metrics.example.1.json | 146 ++++++----- ...ore-paid-media-quality-metrics.schema.json | 156 +++++------- ...re-paid-media-video-metrics.example.1.json | 194 ++++++++------- .../core-paid-media-video-metrics.schema.json | 185 ++++++-------- 21 files changed, 1259 insertions(+), 1191 deletions(-) diff --git a/components/fieldgroups/paid-media/core-paid-media-account-details.example.1.json b/components/fieldgroups/paid-media/core-paid-media-account-details.example.1.json index a7917efc8..080084903 100644 --- a/components/fieldgroups/paid-media/core-paid-media-account-details.example.1.json +++ b/components/fieldgroups/paid-media/core-paid-media-account-details.example.1.json @@ -174,6 +174,42 @@ { "xdm:fieldName": "meta_agency_relationship", "xdm:stringValue": "direct" + }, + { + "xdm:fieldName": "meta_account_spend_limit", + "xdm:numberValue": { + "xdm:value": 50000 + } + }, + { + "xdm:fieldName": "meta_account_balance", + "xdm:numberValue": { + "xdm:value": 12500.5 + } + }, + { + "xdm:fieldName": "meta_min_daily_budget", + "xdm:numberValue": { + "xdm:value": 1 + } + }, + { + "xdm:fieldName": "meta_min_campaign_group_spend_cap", + "xdm:numberValue": { + "xdm:value": 100 + } + }, + { + "xdm:fieldName": "meta_account_age_days", + "xdm:numberValue": { + "xdm:value": 1715 + } + }, + { + "xdm:fieldName": "meta_total_campaigns", + "xdm:numberValue": { + "xdm:value": 247 + } } ] } diff --git a/components/fieldgroups/paid-media/core-paid-media-ad-details.example.1.json b/components/fieldgroups/paid-media/core-paid-media-ad-details.example.1.json index c88c9c85f..60839f3de 100644 --- a/components/fieldgroups/paid-media/core-paid-media-ad-details.example.1.json +++ b/components/fieldgroups/paid-media/core-paid-media-ad-details.example.1.json @@ -151,6 +151,42 @@ { "xdm:fieldName": "meta_bid_strategy", "xdm:stringValue": "LOWEST_COST_WITHOUT_CAP" + }, + { + "xdm:fieldName": "meta_quality_score", + "xdm:numberValue": { + "xdm:value": 8.5 + } + }, + { + "xdm:fieldName": "meta_relevance_score", + "xdm:numberValue": { + "xdm:value": 7.8 + } + }, + { + "xdm:fieldName": "meta_engagement_rate_ranking", + "xdm:numberValue": { + "xdm:value": 0.85 + } + }, + { + "xdm:fieldName": "meta_conversion_rate_ranking", + "xdm:numberValue": { + "xdm:value": 0.72 + } + }, + { + "xdm:fieldName": "meta_frequency", + "xdm:numberValue": { + "xdm:value": 2.34 + } + }, + { + "xdm:fieldName": "meta_unique_inline_link_click_ctr", + "xdm:numberValue": { + "xdm:value": 3.45 + } } ] } diff --git a/components/fieldgroups/paid-media/core-paid-media-adgroup-details.example.1.json b/components/fieldgroups/paid-media/core-paid-media-adgroup-details.example.1.json index 33d1ae819..5081c3e92 100644 --- a/components/fieldgroups/paid-media/core-paid-media-adgroup-details.example.1.json +++ b/components/fieldgroups/paid-media/core-paid-media-adgroup-details.example.1.json @@ -204,6 +204,48 @@ { "xdm:fieldName": "meta_promoted_object_type", "xdm:stringValue": "PAGE" + }, + { + "xdm:fieldName": "meta_bid_amount", + "xdm:numberValue": { + "xdm:value": 1.25 + } + }, + { + "xdm:fieldName": "meta_daily_min_spend_target", + "xdm:numberValue": { + "xdm:value": 450 + } + }, + { + "xdm:fieldName": "meta_daily_spend_cap", + "xdm:numberValue": { + "xdm:value": 550 + } + }, + { + "xdm:fieldName": "meta_lifetime_min_spend_target", + "xdm:numberValue": { + "xdm:value": 13500 + } + }, + { + "xdm:fieldName": "meta_lifetime_spend_cap", + "xdm:numberValue": { + "xdm:value": 16500 + } + }, + { + "xdm:fieldName": "meta_targeting_expansion_score", + "xdm:numberValue": { + "xdm:value": 0.65 + } + }, + { + "xdm:fieldName": "meta_estimated_audience_size", + "xdm:numberValue": { + "xdm:value": 2500000 + } } ] } diff --git a/components/fieldgroups/paid-media/core-paid-media-asset-details.example.1.json b/components/fieldgroups/paid-media/core-paid-media-asset-details.example.1.json index 746bf1216..631d9b365 100644 --- a/components/fieldgroups/paid-media/core-paid-media-asset-details.example.1.json +++ b/components/fieldgroups/paid-media/core-paid-media-asset-details.example.1.json @@ -136,6 +136,36 @@ { "xdm:fieldName": "meta_video_sound_collection_id", "xdm:stringValue": "sound_collection_123456" + }, + { + "xdm:fieldName": "meta_video_file_size_bytes", + "xdm:numberValue": { + "xdm:value": 45678912 + } + }, + { + "xdm:fieldName": "meta_video_bitrate_kbps", + "xdm:numberValue": { + "xdm:value": 5000 + } + }, + { + "xdm:fieldName": "meta_video_quality_score", + "xdm:numberValue": { + "xdm:value": 8.7 + } + }, + { + "xdm:fieldName": "meta_video_engagement_score", + "xdm:numberValue": { + "xdm:value": 0.78 + } + }, + { + "xdm:fieldName": "meta_video_avg_watch_time_seconds", + "xdm:numberValue": { + "xdm:value": 18.5 + } } ] } diff --git a/components/fieldgroups/paid-media/core-paid-media-asset-details.example.2.json b/components/fieldgroups/paid-media/core-paid-media-asset-details.example.2.json index 64b534ab0..4765b04d3 100644 --- a/components/fieldgroups/paid-media/core-paid-media-asset-details.example.2.json +++ b/components/fieldgroups/paid-media/core-paid-media-asset-details.example.2.json @@ -131,11 +131,39 @@ }, { "xdm:fieldName": "meta_text_overlay_percentage", - "xdm:stringValue": "15" + "xdm:numberValue": { + "xdm:value": 15 + } }, { "xdm:fieldName": "meta_image_quality_score", - "xdm:stringValue": "9.0" + "xdm:numberValue": { + "xdm:value": 9.0 + } + }, + { + "xdm:fieldName": "meta_image_file_size_bytes", + "xdm:numberValue": { + "xdm:value": 2456789 + } + }, + { + "xdm:fieldName": "meta_image_aspect_ratio", + "xdm:numberValue": { + "xdm:value": 1.91 + } + }, + { + "xdm:fieldName": "meta_image_brightness_score", + "xdm:numberValue": { + "xdm:value": 0.72 + } + }, + { + "xdm:fieldName": "meta_image_contrast_score", + "xdm:numberValue": { + "xdm:value": 0.68 + } } ] } diff --git a/components/fieldgroups/paid-media/core-paid-media-asset-details.example.3.json b/components/fieldgroups/paid-media/core-paid-media-asset-details.example.3.json index 395e115cc..66eaf6d47 100644 --- a/components/fieldgroups/paid-media/core-paid-media-asset-details.example.3.json +++ b/components/fieldgroups/paid-media/core-paid-media-asset-details.example.3.json @@ -234,6 +234,36 @@ { "xdm:fieldName": "meta_webhook_url", "xdm:stringValue": "https://api.acmecorp.com/leads/webhook" + }, + { + "xdm:fieldName": "meta_form_field_count", + "xdm:numberValue": { + "xdm:value": 8 + } + }, + { + "xdm:fieldName": "meta_form_completion_rate", + "xdm:numberValue": { + "xdm:value": 0.67 + } + }, + { + "xdm:fieldName": "meta_form_avg_completion_time_seconds", + "xdm:numberValue": { + "xdm:value": 145.5 + } + }, + { + "xdm:fieldName": "meta_form_total_submissions", + "xdm:numberValue": { + "xdm:value": 1247 + } + }, + { + "xdm:fieldName": "meta_form_quality_score", + "xdm:numberValue": { + "xdm:value": 8.2 + } } ] } diff --git a/components/fieldgroups/paid-media/core-paid-media-attribution-metrics.example.1.json b/components/fieldgroups/paid-media/core-paid-media-attribution-metrics.example.1.json index a7d0b0ed4..cbeb5acbc 100644 --- a/components/fieldgroups/paid-media/core-paid-media-attribution-metrics.example.1.json +++ b/components/fieldgroups/paid-media/core-paid-media-attribution-metrics.example.1.json @@ -6,14 +6,28 @@ "xdm:viewAttributionWindow": "1_DAY", "xdm:crossDeviceAttribution": { "xdm:enabled": true, - "xdm:crossDeviceConversions": 425, - "xdm:crossDeviceConversionRate": 0.34, - "xdm:deviceSwitchRate": 0.42, - "xdm:averageDevicesPerPath": 1.8, + "xdm:crossDeviceConversions": { + "xdm:value": 425 + }, + "xdm:crossDeviceConversionRate": { + "xdm:value": 0.34 + }, + "xdm:deviceSwitchRate": { + "xdm:value": 0.42 + }, + "xdm:averageDevicesPerPath": { + "xdm:value": 1.8 + }, "xdm:devicePathBreakdown": { - "xdm:mobileToDesktop": 245, - "xdm:desktopToMobile": 125, - "xdm:mobileToMobileApp": 55 + "xdm:mobileToDesktop": { + "xdm:value": 245 + }, + "xdm:desktopToMobile": { + "xdm:value": 125 + }, + "xdm:mobileToMobileApp": { + "xdm:value": 55 + } } }, "xdm:attributionSettings": { diff --git a/components/fieldgroups/paid-media/core-paid-media-attribution-metrics.schema.json b/components/fieldgroups/paid-media/core-paid-media-attribution-metrics.schema.json index 9b660bb37..801ac70d2 100644 --- a/components/fieldgroups/paid-media/core-paid-media-attribution-metrics.schema.json +++ b/components/fieldgroups/paid-media/core-paid-media-attribution-metrics.schema.json @@ -126,53 +126,42 @@ "title": "Enabled" }, "xdm:crossDeviceConversions": { - "type": "number", - "title": "Cross Device Conversions", - "minimum": 0 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Cross Device Conversions" }, "xdm:crossDeviceConversionRate": { - "type": "number", - "title": "Cross Device Conversion Rate", - "minimum": 0, - "maximum": 1 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Cross Device Conversion Rate" }, "xdm:deviceSwitchRate": { - "type": "number", - "title": "Device Switch Rate", - "minimum": 0, - "maximum": 1 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Device Switch Rate" }, "xdm:averageDevicesPerPath": { - "type": "number", - "title": "Average Devices Per Path", - "minimum": 0 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Average Devices Per Path" }, "xdm:devicePathBreakdown": { "type": "object", "title": "Device Path Breakdown", "properties": { "xdm:mobileToDesktop": { - "type": "number", - "minimum": 0 + "$ref": "https://ns.adobe.com/xdm/data/measure" }, "xdm:desktopToMobile": { - "type": "number", - "minimum": 0 + "$ref": "https://ns.adobe.com/xdm/data/measure" }, "xdm:mobileToMobileApp": { - "type": "number", - "minimum": 0 + "$ref": "https://ns.adobe.com/xdm/data/measure" } } } } }, "xdm:attributionWeight": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Attribution Weight", - "description": "Weight assigned to this touchpoint in attribution", - "minimum": 0, - "maximum": 1 + "description": "Weight assigned to this touchpoint in attribution" }, "xdm:touchpointPosition": { "type": "string", @@ -193,54 +182,44 @@ "minimum": 1 }, "xdm:totalTouchpoints": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Total Touchpoints", - "description": "Total number of touchpoints in the conversion path", - "minimum": 1 + "description": "Total number of touchpoints in the conversion path" }, "xdm:pathLength": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Path Length", - "description": "Length of the conversion path in days", - "minimum": 0 + "description": "Length of the conversion path in days" }, "xdm:timeToConversion": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Time to Conversion", - "description": "Time from this touchpoint to conversion in hours", - "minimum": 0 + "description": "Time from this touchpoint to conversion in hours" }, "xdm:attributionConfidence": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Attribution Confidence", - "description": "Confidence score for the attribution", - "minimum": 0, - "maximum": 1 + "description": "Confidence score for the attribution" }, "xdm:incrementalImpact": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Incremental Impact", - "description": "Incremental impact of this touchpoint on conversion", - "minimum": 0, - "maximum": 1 + "description": "Incremental impact of this touchpoint on conversion" }, "xdm:baselineConversions": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Baseline Conversions", - "description": "Expected conversions without this touchpoint", - "minimum": 0 + "description": "Expected conversions without this touchpoint" }, "xdm:incrementalConversions": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Incremental Conversions", - "description": "Additional conversions attributed to this touchpoint", - "minimum": 0 + "description": "Additional conversions attributed to this touchpoint" }, "xdm:liftPercentage": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Lift Percentage", - "description": "Percentage lift in conversions due to this touchpoint", - "minimum": 0 + "description": "Percentage lift in conversions due to this touchpoint" }, "xdm:attributionMethodology": { "type": "object", @@ -263,17 +242,14 @@ "description": "Period used to train the attribution model" }, "xdm:dataQuality": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Data Quality", - "description": "Quality score of data used for attribution", - "minimum": 0, - "maximum": 1 + "description": "Quality score of data used for attribution" }, "xdm:sampleSize": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Sample Size", - "description": "Sample size used for attribution modeling", - "minimum": 0 + "description": "Sample size used for attribution modeling" } } }, @@ -283,11 +259,9 @@ "description": "Attribution across different marketing channels", "properties": { "xdm:channelContribution": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Channel Contribution", - "description": "This channel's contribution to the conversion", - "minimum": 0, - "maximum": 1 + "description": "This channel's contribution to the conversion" }, "xdm:channelSequence": { "type": "array", @@ -303,7 +277,7 @@ "type": "integer" }, "xdm:weight": { - "type": "number" + "$ref": "https://ns.adobe.com/xdm/data/measure" } } } diff --git a/components/fieldgroups/paid-media/core-paid-media-campaign-details.example.1.json b/components/fieldgroups/paid-media/core-paid-media-campaign-details.example.1.json index 6d36b6494..171269a13 100644 --- a/components/fieldgroups/paid-media/core-paid-media-campaign-details.example.1.json +++ b/components/fieldgroups/paid-media/core-paid-media-campaign-details.example.1.json @@ -176,6 +176,42 @@ { "xdm:fieldName": "meta_effective_status", "xdm:stringValue": "ACTIVE" + }, + { + "xdm:fieldName": "meta_daily_budget", + "xdm:numberValue": { + "xdm:value": 500 + } + }, + { + "xdm:fieldName": "meta_lifetime_budget", + "xdm:numberValue": { + "xdm:value": 15000 + } + }, + { + "xdm:fieldName": "meta_budget_remaining", + "xdm:numberValue": { + "xdm:value": 12350.75 + } + }, + { + "xdm:fieldName": "meta_spend_cap", + "xdm:numberValue": { + "xdm:value": 2500 + } + }, + { + "xdm:fieldName": "meta_adset_count", + "xdm:numberValue": { + "xdm:value": 5 + } + }, + { + "xdm:fieldName": "meta_ad_count", + "xdm:numberValue": { + "xdm:value": 15 + } } ] } diff --git a/components/fieldgroups/paid-media/core-paid-media-conversion-metrics.example.1.json b/components/fieldgroups/paid-media/core-paid-media-conversion-metrics.example.1.json index e40610098..0dd6a3ba8 100644 --- a/components/fieldgroups/paid-media/core-paid-media-conversion-metrics.example.1.json +++ b/components/fieldgroups/paid-media/core-paid-media-conversion-metrics.example.1.json @@ -1,126 +1,120 @@ { "xdm:paidMedia": { "xdm:conversionMetrics": { - "xdm:postClickConversions": 1250, - "xdm:postViewConversions": 385, - "xdm:postEngagementConversions": 125, - "xdm:totalConversions": 1760, - "xdm:conversionRate": 0.0352, - "xdm:costPerAction": 10.23, + "xdm:postClickConversions": { + "xdm:value": 1250 + }, + "xdm:postViewConversions": { + "xdm:value": 385 + }, + "xdm:postEngagementConversions": { + "xdm:value": 125 + }, "xdm:conversionsByType": { - "xdm:purchases": 875, - "xdm:addToCart": 2340, - "xdm:initiateCheckout": 1450, - "xdm:leads": 245, - "xdm:registrations": 180, - "xdm:downloads": 320, - "xdm:subscriptions": 95, - "xdm:customEvents": 125 - }, - "xdm:conversionValue": { - "xdm:totalValue": 187500, - "xdm:averageOrderValue": 214.29, - "xdm:purchaseValue": 187500, - "xdm:leadValue": 12250, - "xdm:registrationValue": 9000, - "xdm:subscriptionValue": 28500, - "xdm:customEventValue": 6250 - }, - "xdm:conversionTiming": { - "xdm:averageTimeToConversion": 8.3, - "xdm:medianTimeToConversion": 5.2, - "xdm:conversionsWithin1Day": 425, - "xdm:conversionsWithin3Days": 780, - "xdm:conversionsWithin7Days": 1250, - "xdm:conversionsWithin14Days": 1520, - "xdm:conversionsWithin30Days": 1760, - "xdm:conversionLag": 8.3 + "xdm:purchases": { + "xdm:value": 875 + }, + "xdm:addToCart": { + "xdm:value": 2340 + }, + "xdm:initiateCheckout": { + "xdm:value": 1450 + }, + "xdm:leads": { + "xdm:value": 245 + }, + "xdm:registrations": { + "xdm:value": 180 + }, + "xdm:downloads": { + "xdm:value": 320 + }, + "xdm:subscriptions": { + "xdm:value": 95 + }, + "xdm:customEvents": { + "xdm:value": 125 + } }, - "xdm:conversionPath": { - "xdm:averagePathLength": 4.2, - "xdm:medianPathLength": 3, - "xdm:singleTouchConversions": 180, - "xdm:multiTouchConversions": 1580, - "xdm:averageTouchpoints": 4.2, - "xdm:assistedConversions": 890, - "xdm:directConversions": 870 + "xdm:conversionRate": { + "xdm:value": 0.0352 }, - "xdm:conversionQuality": { - "xdm:repeatPurchaseRate": 0.32, - "xdm:customerLifetimeValue": 642.5, - "xdm:averageSessionDuration": 245, - "xdm:bounceRate": 0.18, - "xdm:pagesPerSession": 5.8, - "xdm:engagementScore": 7.5, - "xdm:qualityScore": 8.2 - }, - "xdm:leadMetrics": { - "xdm:totalLeads": 245, - "xdm:qualifiedLeads": 185, - "xdm:leadQualificationRate": 0.755, - "xdm:salesQualifiedLeads": 125, - "xdm:marketingQualifiedLeads": 185, - "xdm:leadToOpportunityRate": 0.51, - "xdm:leadToCustomerRate": 0.28, - "xdm:averageLeadScore": 72, - "xdm:costPerLead": 73.47, - "xdm:costPerQualifiedLead": 97.3 - }, - "xdm:microConversions": { - "xdm:pageViews": 45000, - "xdm:productViews": 12500, - "xdm:videoViews": 8900, - "xdm:formStarts": 890, - "xdm:formCompletions": 245, - "xdm:emailSignups": 320, - "xdm:socialShares": 456, - "xdm:wishlistAdds": 678, - "xdm:storeLocatorSearches": 234 - }, - "xdm:conversionFunnel": { - "xdm:impressions": 50000, - "xdm:clicks": 2500, - "xdm:landingPageViews": 2340, - "xdm:productViews": 1850, - "xdm:addToCart": 980, - "xdm:initiateCheckout": 625, - "xdm:purchases": 875, - "xdm:clickToLandingRate": 0.936, - "xdm:landingToProductRate": 0.791, - "xdm:productToCartRate": 0.53, - "xdm:cartToCheckoutRate": 0.638, - "xdm:checkoutToPurchaseRate": 1.4 - }, - "xdm:additionalDetails": [ - { - "xdm:fieldName": "meta_conversion_tracking_pixel", - "xdm:stringValue": "pixel_123456789" + "xdm:costPerAction": { + "xdm:value": 10.23 + }, + "xdm:conversionLag": { + "xdm:value": 8.3 + }, + "xdm:conversionPath": { + "xdm:averagePathLength": { + "xdm:value": 4.2 }, - { - "xdm:fieldName": "meta_attribution_window", - "xdm:stringValue": "7_day_click_1_day_view" + "xdm:medianPathLength": { + "xdm:value": 3 }, - { - "xdm:fieldName": "meta_conversion_api_enabled", - "xdm:stringValue": "true" + "xdm:singleTouchConversions": { + "xdm:value": 180 }, - { - "xdm:fieldName": "meta_deduplication_enabled", - "xdm:stringValue": "true" + "xdm:multiTouchConversions": { + "xdm:value": 1580 }, - { - "xdm:fieldName": "meta_server_side_tracking", - "xdm:stringValue": "true" + "xdm:averageTouchpoints": { + "xdm:value": 4.2 }, - { - "xdm:fieldName": "meta_conversion_value_currency", - "xdm:stringValue": "USD" + "xdm:assistedConversions": { + "xdm:value": 890 }, - { - "xdm:fieldName": "meta_offline_conversions_enabled", - "xdm:stringValue": "false" + "xdm:directConversions": { + "xdm:value": 870 } - ] + }, + "xdm:assistedConversions": { + "xdm:value": 890 + }, + "xdm:directConversions": { + "xdm:value": 870 + }, + "xdm:newCustomerConversions": { + "xdm:value": 425 + }, + "xdm:returningCustomerConversions": { + "xdm:value": 825 + }, + "xdm:averageOrderValue": { + "xdm:value": 214.29 + }, + "xdm:totalOrderValue": { + "xdm:value": 187500 + }, + "xdm:conversionQuality": { + "xdm:qualityScore": { + "xdm:value": 8.2 + }, + "xdm:fraudRate": { + "xdm:value": 0.02 + }, + "xdm:validationRate": { + "xdm:value": 0.98 + } + }, + "xdm:leads": { + "xdm:value": 245 + }, + "xdm:qualifiedLeads": { + "xdm:value": 185 + }, + "xdm:costPerLead": { + "xdm:value": 73.47 + }, + "xdm:leadFormOpens": { + "xdm:value": 890 + }, + "xdm:leadFormSubmissions": { + "xdm:value": 245 + }, + "xdm:leadFormCompletionRate": { + "xdm:value": 0.275 + } } } } diff --git a/components/fieldgroups/paid-media/core-paid-media-conversion-metrics.schema.json b/components/fieldgroups/paid-media/core-paid-media-conversion-metrics.schema.json index 2b28d41f2..1884c9eae 100644 --- a/components/fieldgroups/paid-media/core-paid-media-conversion-metrics.schema.json +++ b/components/fieldgroups/paid-media/core-paid-media-conversion-metrics.schema.json @@ -25,22 +25,19 @@ "description": "Detailed conversion tracking metrics", "properties": { "xdm:postClickConversions": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Post-Click Conversions", - "description": "Conversions attributed to clicks", - "minimum": 0 + "description": "Conversions attributed to clicks" }, "xdm:postViewConversions": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Post-View Conversions", - "description": "Conversions attributed to views", - "minimum": 0 + "description": "Conversions attributed to views" }, "xdm:postEngagementConversions": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Post-Engagement Conversions", - "description": "Conversions attributed to engagements", - "minimum": 0 + "description": "Conversions attributed to engagements" }, "xdm:conversionsByType": { "type": "object", @@ -48,65 +45,53 @@ "description": "Breakdown of conversions by event type", "properties": { "xdm:purchases": { - "type": "number", - "title": "Purchases", - "minimum": 0 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Purchases" }, "xdm:addToCart": { - "type": "number", - "title": "Add to Cart", - "minimum": 0 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Add to Cart" }, "xdm:initiateCheckout": { - "type": "number", - "title": "Initiate Checkout", - "minimum": 0 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Initiate Checkout" }, "xdm:leads": { - "type": "number", - "title": "Leads", - "minimum": 0 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Leads" }, "xdm:registrations": { - "type": "number", - "title": "Registrations", - "minimum": 0 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Registrations" }, "xdm:downloads": { - "type": "number", - "title": "Downloads", - "minimum": 0 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Downloads" }, "xdm:subscriptions": { - "type": "number", - "title": "Subscriptions", - "minimum": 0 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Subscriptions" }, "xdm:customEvents": { - "type": "number", - "title": "Custom Events", - "minimum": 0 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Custom Events" } } }, "xdm:conversionRate": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Conversion Rate", - "description": "Overall conversion rate", - "minimum": 0, - "maximum": 1 + "description": "Overall conversion rate" }, "xdm:costPerAction": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Cost Per Action", - "description": "Average cost per conversion action", - "minimum": 0 + "description": "Average cost per conversion action" }, "xdm:conversionLag": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Conversion Lag", - "description": "Average time from ad interaction to conversion (in hours)", - "minimum": 0 + "description": "Average time from ad interaction to conversion (in hours)" }, "xdm:conversionPath": { "type": "object", @@ -114,77 +99,64 @@ "description": "Metrics about the conversion path and touchpoints", "properties": { "xdm:averagePathLength": { - "type": "number", - "title": "Average Path Length", - "minimum": 0 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Average Path Length" }, "xdm:medianPathLength": { - "type": "number", - "title": "Median Path Length", - "minimum": 0 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Median Path Length" }, "xdm:singleTouchConversions": { - "type": "number", - "title": "Single Touch Conversions", - "minimum": 0 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Single Touch Conversions" }, "xdm:multiTouchConversions": { - "type": "number", - "title": "Multi Touch Conversions", - "minimum": 0 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Multi Touch Conversions" }, "xdm:averageTouchpoints": { - "type": "number", - "title": "Average Touchpoints", - "minimum": 0 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Average Touchpoints" }, "xdm:assistedConversions": { - "type": "number", - "title": "Assisted Conversions", - "minimum": 0 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Assisted Conversions" }, "xdm:directConversions": { - "type": "number", - "title": "Direct Conversions", - "minimum": 0 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Direct Conversions" } } }, "xdm:assistedConversions": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Assisted Conversions", - "description": "Conversions where this ad assisted but wasn't the last touch", - "minimum": 0 + "description": "Conversions where this ad assisted but wasn't the last touch" }, "xdm:directConversions": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Direct Conversions", - "description": "Conversions where this ad was the last touch", - "minimum": 0 + "description": "Conversions where this ad was the last touch" }, "xdm:newCustomerConversions": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "New Customer Conversions", - "description": "Conversions from new customers", - "minimum": 0 + "description": "Conversions from new customers" }, "xdm:returningCustomerConversions": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Returning Customer Conversions", - "description": "Conversions from returning customers", - "minimum": 0 + "description": "Conversions from returning customers" }, "xdm:averageOrderValue": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Average Order Value", - "description": "Average value per conversion", - "minimum": 0 + "description": "Average value per conversion" }, "xdm:totalOrderValue": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Total Order Value", - "description": "Total value of all conversions", - "minimum": 0 + "description": "Total value of all conversions" }, "xdm:conversionQuality": { "type": "object", @@ -192,64 +164,51 @@ "description": "Quality metrics for conversions", "properties": { "xdm:qualityScore": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Quality Score", - "description": "Overall conversion quality score", - "minimum": 0, - "maximum": 10 + "description": "Overall conversion quality score" }, "xdm:fraudRate": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Fraud Rate", - "description": "Percentage of conversions flagged as fraudulent", - "minimum": 0, - "maximum": 1 + "description": "Percentage of conversions flagged as fraudulent" }, "xdm:validationRate": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Validation Rate", - "description": "Percentage of conversions that passed validation", - "minimum": 0, - "maximum": 1 + "description": "Percentage of conversions that passed validation" } } }, "xdm:leads": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Leads", - "description": "Total number of leads generated", - "minimum": 0 + "description": "Total number of leads generated" }, "xdm:qualifiedLeads": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Qualified Leads", - "description": "Number of qualified/validated leads", - "minimum": 0 + "description": "Number of qualified/validated leads" }, "xdm:costPerLead": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Cost Per Lead", - "description": "Average cost per lead", - "minimum": 0 + "description": "Average cost per lead" }, "xdm:leadFormOpens": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Lead Form Opens", - "description": "Number of times lead form was opened", - "minimum": 0 + "description": "Number of times lead form was opened" }, "xdm:leadFormSubmissions": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Lead Form Submissions", - "description": "Number of lead form submissions", - "minimum": 0 + "description": "Number of lead form submissions" }, "xdm:leadFormCompletionRate": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Lead Form Completion Rate", - "description": "Percentage of opened forms that were submitted", - "minimum": 0, - "maximum": 1 + "description": "Percentage of opened forms that were submitted" } } } diff --git a/components/fieldgroups/paid-media/core-paid-media-cost-metrics.example.1.json b/components/fieldgroups/paid-media/core-paid-media-cost-metrics.example.1.json index ed2d516cd..d3216e982 100644 --- a/components/fieldgroups/paid-media/core-paid-media-cost-metrics.example.1.json +++ b/components/fieldgroups/paid-media/core-paid-media-cost-metrics.example.1.json @@ -1,113 +1,138 @@ { "xdm:paidMedia": { "xdm:costMetrics": { - "xdm:spend": 18000, - "xdm:spendMicros": 18000000000, - "xdm:cpc": 7.2, - "xdm:cpm": 36.0, - "xdm:cpp": 0.56, - "xdm:cpe": 2.02, - "xdm:cpv": 0.15, - "xdm:cpa": 14.4, - "xdm:cpvc": 0.23, - "xdm:cpl": 73.47, - "xdm:biddingMetrics": { - "xdm:bidAmount": 8.5, - "xdm:bidAmountMicros": 8500000, - "xdm:bidCap": 12.0, - "xdm:costCap": 15.0, - "xdm:targetCPA": 14.0, - "xdm:targetROAS": 4.0, - "xdm:actualCPA": 14.4, - "xdm:actualROAS": 10.42, - "xdm:bidStrategy": "lowest_cost_without_cap", - "xdm:bidType": "automatic", - "xdm:averageBid": 7.85, - "xdm:maxBid": 12.0, - "xdm:minBid": 3.5, - "xdm:bidAdjustments": 1.15 - }, - "xdm:qualityMetrics": { - "xdm:qualityScore": 8.5, - "xdm:relevanceScore": 9.0, - "xdm:engagementScore": 8.2, - "xdm:conversionScore": 8.8, - "xdm:adRank": 76.5, - "xdm:expectedCTR": "above_average", - "xdm:adRelevance": "above_average", - "xdm:landingPageExperience": "above_average" + "xdm:spendInMicroCurrency": { + "xdm:value": 18000000000 + }, + "xdm:averageCpm": { + "xdm:value": 36.0 + }, + "xdm:averageCpc": { + "xdm:value": 7.2 + }, + "xdm:averageCpe": { + "xdm:value": 2.02 + }, + "xdm:averageCpv": { + "xdm:value": 0.15 + }, + "xdm:averageCpa": { + "xdm:value": 14.4 + }, + "xdm:averageCpl": { + "xdm:value": 73.47 + }, + "xdm:bidAmount": { + "xdm:value": 8.5 + }, + "xdm:bidAmountMicro": { + "xdm:value": 8500000 + }, + "xdm:maxBid": { + "xdm:value": 12.0 + }, + "xdm:minBid": { + "xdm:value": 3.5 + }, + "xdm:targetBid": { + "xdm:value": 14.0 + }, + "xdm:actualBid": { + "xdm:value": 7.85 + }, + "xdm:qualityScore": { + "xdm:value": 8.5 + }, + "xdm:adRank": { + "xdm:value": 76.5 + }, + "xdm:competitionIndex": { + "xdm:value": 0.65 }, "xdm:impressionShare": { - "xdm:impressionShare": 0.68, - "xdm:impressionShareRank": 0.72, - "xdm:impressionShareBudget": 0.85, - "xdm:lostImpressionShareRank": 0.15, - "xdm:lostImpressionShareBudget": 0.17, - "xdm:exactMatchImpressionShare": 0.75, - "xdm:topImpressionShare": 0.42, - "xdm:absoluteTopImpressionShare": 0.28 + "xdm:impressionShare": { + "xdm:value": 0.68 + }, + "xdm:impressionShareRank": { + "xdm:value": 0.72 + }, + "xdm:impressionShareBudget": { + "xdm:value": 0.85 + }, + "xdm:lostImpressionShareRank": { + "xdm:value": 0.15 + }, + "xdm:lostImpressionShareBudget": { + "xdm:value": 0.17 + }, + "xdm:exactMatchImpressionShare": { + "xdm:value": 0.75 + }, + "xdm:topImpressionShare": { + "xdm:value": 0.42 + }, + "xdm:absoluteTopImpressionShare": { + "xdm:value": 0.28 + } + }, + "xdm:lostImpressionShareRank": { + "xdm:value": 0.15 + }, + "xdm:lostImpressionShareBudget": { + "xdm:value": 0.17 }, "xdm:budgetUtilization": { - "xdm:budgetAllocated": 60000, - "xdm:budgetSpent": 18000, - "xdm:budgetRemaining": 42000, - "xdm:budgetUtilization": 0.3, - "xdm:dailyBudget": 2000, - "xdm:dailySpend": 600, - "xdm:dailyBudgetUtilization": 0.3, + "xdm:budgetAllocated": { + "xdm:value": 60000 + }, + "xdm:budgetSpent": { + "xdm:value": 18000 + }, + "xdm:budgetRemaining": { + "xdm:value": 42000 + }, + "xdm:budgetUtilization": { + "xdm:value": 0.3 + }, + "xdm:dailyBudget": { + "xdm:value": 2000 + }, + "xdm:dailySpend": { + "xdm:value": 600 + }, + "xdm:dailyBudgetUtilization": { + "xdm:value": 0.3 + }, "xdm:pacingStatus": "on_track", - "xdm:projectedSpend": 60000, - "xdm:budgetOverrun": 0, - "xdm:budgetUnderrun": 0 - }, - "xdm:efficiencyMetrics": { - "xdm:costPerThousandReach": 0.69, - "xdm:costPerEngagement": 2.02, - "xdm:costPerVideoView": 0.15, - "xdm:costPerVideoCompletion": 0.23, - "xdm:costPerLead": 73.47, - "xdm:costPerQualifiedLead": 97.3, - "xdm:costPerAppInstall": 0, - "xdm:costPerRegistration": 100.0, - "xdm:costPerSubscription": 189.47, - "xdm:costPerDownload": 56.25 - }, - "xdm:returnMetrics": { - "xdm:roas": 10.42, - "xdm:roi": 9.42, - "xdm:revenuePerClick": 75.0, - "xdm:revenuePerImpression": 3.75, - "xdm:profitPerClick": 67.8, - "xdm:profitMargin": 0.904, - "xdm:breakEvenROAS": 1.0, - "xdm:incrementalROAS": 4.2 - }, - "xdm:additionalDetails": [ - { - "xdm:fieldName": "meta_currency", - "xdm:stringValue": "USD" - }, - { - "xdm:fieldName": "meta_bid_strategy", - "xdm:stringValue": "LOWEST_COST_WITHOUT_CAP" - }, - { - "xdm:fieldName": "meta_billing_event", - "xdm:stringValue": "IMPRESSIONS" - }, - { - "xdm:fieldName": "meta_optimization_goal", - "xdm:stringValue": "LINK_CLICKS" - }, - { - "xdm:fieldName": "meta_campaign_budget_optimization", - "xdm:stringValue": "true" - }, - { - "xdm:fieldName": "meta_spend_cap", - "xdm:stringValue": "2500" + "xdm:projectedSpend": { + "xdm:value": 60000 + }, + "xdm:budgetOverrun": { + "xdm:value": 0 + }, + "xdm:budgetUnderrun": { + "xdm:value": 0 } - ] + }, + "xdm:budgetRemaining": { + "xdm:value": 42000 + }, + "xdm:budgetPacing": { + "xdm:value": 1.0 + }, + "xdm:costEfficiency": { + "xdm:value": 0.85 + }, + "xdm:marginOfError": { + "xdm:value": 0.05 + }, + "xdm:confidenceLevel": { + "xdm:value": 0.95 + }, + "xdm:costTrend": "stable", + "xdm:costVariance": { + "xdm:value": 0.12 + } } } } diff --git a/components/fieldgroups/paid-media/core-paid-media-cost-metrics.schema.json b/components/fieldgroups/paid-media/core-paid-media-cost-metrics.schema.json index ea6bee263..1ac7fbdd1 100644 --- a/components/fieldgroups/paid-media/core-paid-media-cost-metrics.schema.json +++ b/components/fieldgroups/paid-media/core-paid-media-cost-metrics.schema.json @@ -25,102 +25,84 @@ "description": "Detailed cost and bidding metrics", "properties": { "xdm:spendInMicroCurrency": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Spend (Micro Currency)", - "description": "Amount spent in micro currency units", - "minimum": 0 + "description": "Amount spent in micro currency units" }, "xdm:averageCpm": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Average CPM", - "description": "Average cost per thousand impressions", - "minimum": 0 + "description": "Average cost per thousand impressions" }, "xdm:averageCpc": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Average CPC", - "description": "Average cost per click", - "minimum": 0 + "description": "Average cost per click" }, "xdm:averageCpe": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Average CPE", - "description": "Average cost per engagement", - "minimum": 0 + "description": "Average cost per engagement" }, "xdm:averageCpv": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Average CPV", - "description": "Average cost per video view", - "minimum": 0 + "description": "Average cost per video view" }, "xdm:averageCpa": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Average CPA", - "description": "Average cost per acquisition/action", - "minimum": 0 + "description": "Average cost per acquisition/action" }, "xdm:averageCpl": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Average CPL", - "description": "Average cost per lead", - "minimum": 0 + "description": "Average cost per lead" }, "xdm:bidAmount": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Bid Amount", - "description": "Average bid amount", - "minimum": 0 + "description": "Average bid amount" }, "xdm:bidAmountMicro": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Bid Amount (Micro Currency)", - "description": "Bid amount in micro currency units", - "minimum": 0 + "description": "Bid amount in micro currency units" }, "xdm:maxBid": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Maximum Bid", - "description": "Maximum bid amount set", - "minimum": 0 + "description": "Maximum bid amount set" }, "xdm:minBid": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Minimum Bid", - "description": "Minimum bid amount set", - "minimum": 0 + "description": "Minimum bid amount set" }, "xdm:targetBid": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Target Bid", - "description": "Target bid amount for automated bidding", - "minimum": 0 + "description": "Target bid amount for automated bidding" }, "xdm:actualBid": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Actual Bid", - "description": "Actual bid amount used in auctions", - "minimum": 0 + "description": "Actual bid amount used in auctions" }, "xdm:qualityScore": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Quality Score", - "description": "Ad quality score (platform-specific)", - "minimum": 0, - "maximum": 10 + "description": "Ad quality score (platform-specific)" }, "xdm:adRank": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Ad Rank", - "description": "Ad rank score used for auction positioning", - "minimum": 0 + "description": "Ad rank score used for auction positioning" }, "xdm:competitionIndex": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Competition Index", - "description": "Competition level index for the auction", - "minimum": 0, - "maximum": 1 + "description": "Competition level index for the auction" }, "xdm:impressionShare": { "type": "object", @@ -128,68 +110,48 @@ "description": "Detailed impression share metrics", "properties": { "xdm:impressionShare": { - "type": "number", - "title": "Impression Share", - "minimum": 0, - "maximum": 1 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Impression Share" }, "xdm:impressionShareRank": { - "type": "number", - "title": "Impression Share Rank", - "minimum": 0, - "maximum": 1 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Impression Share Rank" }, "xdm:impressionShareBudget": { - "type": "number", - "title": "Impression Share Budget", - "minimum": 0, - "maximum": 1 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Impression Share Budget" }, "xdm:lostImpressionShareRank": { - "type": "number", - "title": "Lost Impression Share Rank", - "minimum": 0, - "maximum": 1 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Lost Impression Share Rank" }, "xdm:lostImpressionShareBudget": { - "type": "number", - "title": "Lost Impression Share Budget", - "minimum": 0, - "maximum": 1 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Lost Impression Share Budget" }, "xdm:exactMatchImpressionShare": { - "type": "number", - "title": "Exact Match Impression Share", - "minimum": 0, - "maximum": 1 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Exact Match Impression Share" }, "xdm:topImpressionShare": { - "type": "number", - "title": "Top Impression Share", - "minimum": 0, - "maximum": 1 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Top Impression Share" }, "xdm:absoluteTopImpressionShare": { - "type": "number", - "title": "Absolute Top Impression Share", - "minimum": 0, - "maximum": 1 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Absolute Top Impression Share" } } }, "xdm:lostImpressionShareRank": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Lost Impression Share (Rank)", - "description": "Impression share lost due to ad rank", - "minimum": 0, - "maximum": 1 + "description": "Impression share lost due to ad rank" }, "xdm:lostImpressionShareBudget": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Lost Impression Share (Budget)", - "description": "Impression share lost due to budget constraints", - "minimum": 0, - "maximum": 1 + "description": "Impression share lost due to budget constraints" }, "xdm:budgetUtilization": { "type": "object", @@ -197,41 +159,32 @@ "description": "Detailed budget utilization metrics", "properties": { "xdm:budgetAllocated": { - "type": "number", - "title": "Budget Allocated", - "minimum": 0 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Budget Allocated" }, "xdm:budgetSpent": { - "type": "number", - "title": "Budget Spent", - "minimum": 0 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Budget Spent" }, "xdm:budgetRemaining": { - "type": "number", - "title": "Budget Remaining", - "minimum": 0 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Budget Remaining" }, "xdm:budgetUtilization": { - "type": "number", - "title": "Budget Utilization", - "minimum": 0, - "maximum": 1 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Budget Utilization" }, "xdm:dailyBudget": { - "type": "number", - "title": "Daily Budget", - "minimum": 0 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Daily Budget" }, "xdm:dailySpend": { - "type": "number", - "title": "Daily Spend", - "minimum": 0 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Daily Spend" }, "xdm:dailyBudgetUtilization": { - "type": "number", - "title": "Daily Budget Utilization", - "minimum": 0, - "maximum": 1 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Daily Budget Utilization" }, "xdm:pacingStatus": { "type": "string", @@ -245,53 +198,43 @@ } }, "xdm:projectedSpend": { - "type": "number", - "title": "Projected Spend", - "minimum": 0 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Projected Spend" }, "xdm:budgetOverrun": { - "type": "number", - "title": "Budget Overrun", - "minimum": 0 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Budget Overrun" }, "xdm:budgetUnderrun": { - "type": "number", - "title": "Budget Underrun", - "minimum": 0 + "$ref": "https://ns.adobe.com/xdm/data/measure", + "title": "Budget Underrun" } } }, "xdm:budgetRemaining": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Budget Remaining", - "description": "Remaining budget amount", - "minimum": 0 + "description": "Remaining budget amount" }, "xdm:budgetPacing": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Budget Pacing", - "description": "Budget pacing percentage (actual vs. planned)", - "minimum": 0 + "description": "Budget pacing percentage (actual vs. planned)" }, "xdm:costEfficiency": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Cost Efficiency", - "description": "Cost efficiency score compared to benchmarks", - "minimum": 0 + "description": "Cost efficiency score compared to benchmarks" }, "xdm:marginOfError": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Margin of Error", - "description": "Statistical margin of error for cost metrics", - "minimum": 0, - "maximum": 1 + "description": "Statistical margin of error for cost metrics" }, "xdm:confidenceLevel": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Confidence Level", - "description": "Statistical confidence level for cost metrics", - "minimum": 0, - "maximum": 1 + "description": "Statistical confidence level for cost metrics" }, "xdm:costTrend": { "type": "string", @@ -306,10 +249,9 @@ } }, "xdm:costVariance": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Cost Variance", - "description": "Variance in cost metrics", - "minimum": 0 + "description": "Variance in cost metrics" } } } diff --git a/components/fieldgroups/paid-media/core-paid-media-extended-metrics.example.1.json b/components/fieldgroups/paid-media/core-paid-media-extended-metrics.example.1.json index 15222a2c2..38a065de1 100644 --- a/components/fieldgroups/paid-media/core-paid-media-extended-metrics.example.1.json +++ b/components/fieldgroups/paid-media/core-paid-media-extended-metrics.example.1.json @@ -1,112 +1,117 @@ { "xdm:paidMedia": { "xdm:extendedMetrics": { - "xdm:viewableImpressions": 42500, - "xdm:viewabilityRate": 0.85, - "xdm:measurableImpressions": 48000, - "xdm:measurabilityRate": 0.96, - "xdm:socialEngagement": { - "xdm:likes": 8934, - "xdm:reactions": 9876, - "xdm:loves": 3456, - "xdm:wows": 1234, - "xdm:hahas": 567, - "xdm:sads": 89, - "xdm:angrys": 34, - "xdm:comments": 1247, - "xdm:shares": 892, - "xdm:saves": 456, - "xdm:follows": 234, - "xdm:profileVisits": 1890, - "xdm:linkClicks": 2500, - "xdm:photoViews": 12500, - "xdm:postEngagements": 12345, - "xdm:engagementRate": 0.247 - }, - "xdm:appMetrics": { - "xdm:appInstalls": 0, - "xdm:appEvents": 0, - "xdm:appEventValue": 0, - "xdm:appEngagements": 0, - "xdm:appPurchases": 0, - "xdm:appRevenue": 0, - "xdm:appRetention": 0, - "xdm:appUninstalls": 0 - }, - "xdm:leadMetrics": { - "xdm:leadSubmissions": 245, - "xdm:leadFormOpens": 890, - "xdm:leadFormCompletionRate": 0.275, - "xdm:leadQuality": 7.5, - "xdm:qualifiedLeads": 185, - "xdm:leadQualificationRate": 0.755 - }, - "xdm:ecommerceMetrics": { - "xdm:productViews": 12500, - "xdm:addToCart": 2340, - "xdm:addToCartRate": 0.187, - "xdm:checkouts": 1450, - "xdm:checkoutRate": 0.62, - "xdm:purchases": 875, - "xdm:purchaseRate": 0.603, - "xdm:revenue": 187500, - "xdm:averageOrderValue": 214.29, - "xdm:itemsPerOrder": 2.3, - "xdm:cartAbandonment": 0.397, - "xdm:wishlistAdds": 678, - "xdm:productReviews": 45 - }, - "xdm:brandMetrics": { - "xdm:brandAwareness": 0.42, - "xdm:brandRecall": 0.38, - "xdm:brandConsideration": 0.28, - "xdm:brandPreference": 0.22, - "xdm:brandLoyalty": 0.18, - "xdm:brandSentiment": 0.75, - "xdm:netPromoterScore": 45 - }, - "xdm:offlineMetrics": { - "xdm:storeVisits": 0, - "xdm:storeLocatorSearches": 234, - "xdm:directionsRequests": 156, - "xdm:phoneCallClicks": 89, - "xdm:offlineConversions": 0, - "xdm:offlineRevenue": 0 - }, - "xdm:additionalDetails": [ - { - "xdm:fieldName": "meta_viewable_impressions", - "xdm:stringValue": "42500" - }, - { - "xdm:fieldName": "meta_post_engagement", - "xdm:stringValue": "12345" - }, - { - "xdm:fieldName": "meta_post_reactions", - "xdm:stringValue": "9876" - }, - { - "xdm:fieldName": "meta_post_comments", - "xdm:stringValue": "1247" - }, - { - "xdm:fieldName": "meta_post_shares", - "xdm:stringValue": "892" - }, - { - "xdm:fieldName": "meta_post_saves", - "xdm:stringValue": "456" - }, - { - "xdm:fieldName": "meta_link_clicks", - "xdm:stringValue": "2500" - }, - { - "xdm:fieldName": "meta_outbound_clicks", - "xdm:stringValue": "2340" - } - ] + "xdm:viewableImpressions": { + "xdm:value": 42500 + }, + "xdm:viewabilityRate": { + "xdm:value": 0.85 + }, + "xdm:uniqueClicks": { + "xdm:value": 2340 + }, + "xdm:linkClicks": { + "xdm:value": 2500 + }, + "xdm:outboundClicks": { + "xdm:value": 2340 + }, + "xdm:saves": { + "xdm:value": 456 + }, + "xdm:shares": { + "xdm:value": 892 + }, + "xdm:likes": { + "xdm:value": 8934 + }, + "xdm:comments": { + "xdm:value": 1247 + }, + "xdm:pageEngagement": { + "xdm:value": 5678 + }, + "xdm:pageLikes": { + "xdm:value": 234 + }, + "xdm:postEngagement": { + "xdm:value": 12345 + }, + "xdm:postComments": { + "xdm:value": 1247 + }, + "xdm:postReactions": { + "xdm:value": 9876 + }, + "xdm:postShares": { + "xdm:value": 892 + }, + "xdm:postSaves": { + "xdm:value": 456 + }, + "xdm:follows": { + "xdm:value": 234 + }, + "xdm:profileVisits": { + "xdm:value": 1890 + }, + "xdm:websiteVisits": { + "xdm:value": 3450 + }, + "xdm:averageDwellTime": { + "xdm:value": 45.5 + }, + "xdm:appInstalls": { + "xdm:value": 0 + }, + "xdm:appOpens": { + "xdm:value": 0 + }, + "xdm:leadSubmissions": { + "xdm:value": 245 + }, + "xdm:signups": { + "xdm:value": 320 + }, + "xdm:downloads": { + "xdm:value": 456 + }, + "xdm:subscriptions": { + "xdm:value": 95 + }, + "xdm:checkouts": { + "xdm:value": 1450 + }, + "xdm:addToCarts": { + "xdm:value": 2340 + }, + "xdm:wishlistAdds": { + "xdm:value": 678 + }, + "xdm:productViews": { + "xdm:value": 12500 + }, + "xdm:photoViews": { + "xdm:value": 12500 + }, + "xdm:catalogViews": { + "xdm:value": 3450 + }, + "xdm:storeVisits": { + "xdm:value": 0 + }, + "xdm:callsGenerated": { + "xdm:value": 89 + }, + "xdm:directionsRequested": { + "xdm:value": 156 + }, + "xdm:eventResponses": { + "xdm:value": 78 + }, + "xdm:messagesSent": { + "xdm:value": 234 + } } } } diff --git a/components/fieldgroups/paid-media/core-paid-media-extended-metrics.schema.json b/components/fieldgroups/paid-media/core-paid-media-extended-metrics.schema.json index b2c187315..ef2a1dfc7 100644 --- a/components/fieldgroups/paid-media/core-paid-media-extended-metrics.schema.json +++ b/components/fieldgroups/paid-media/core-paid-media-extended-metrics.schema.json @@ -25,227 +25,189 @@ "description": "Additional metrics beyond core metrics", "properties": { "xdm:viewableImpressions": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Viewable Impressions", - "description": "Number of viewable impressions", - "minimum": 0 + "description": "Number of viewable impressions" }, "xdm:viewabilityRate": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Viewability Rate", - "description": "Percentage of impressions that were viewable", - "minimum": 0, - "maximum": 1 + "description": "Percentage of impressions that were viewable" }, "xdm:uniqueClicks": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Unique Clicks", - "description": "Number of unique users who clicked", - "minimum": 0 + "description": "Number of unique users who clicked" }, "xdm:linkClicks": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Link Clicks", - "description": "Number of clicks on links", - "minimum": 0 + "description": "Number of clicks on links" }, "xdm:outboundClicks": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Outbound Clicks", - "description": "Number of clicks leading to external sites", - "minimum": 0 + "description": "Number of clicks leading to external sites" }, "xdm:saves": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Saves", - "description": "Number of saves/bookmarks", - "minimum": 0 + "description": "Number of saves/bookmarks" }, "xdm:shares": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Shares", - "description": "Number of shares", - "minimum": 0 + "description": "Number of shares" }, "xdm:likes": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Likes", - "description": "Number of likes/reactions", - "minimum": 0 + "description": "Number of likes/reactions" }, "xdm:comments": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Comments", - "description": "Number of comments", - "minimum": 0 + "description": "Number of comments" }, "xdm:pageEngagement": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Page Engagement", - "description": "Page engagement actions", - "minimum": 0 + "description": "Page engagement actions" }, "xdm:pageLikes": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Page Likes", - "description": "Page likes", - "minimum": 0 + "description": "Page likes" }, "xdm:postEngagement": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Post Engagement", - "description": "Post engagement actions", - "minimum": 0 + "description": "Post engagement actions" }, "xdm:postComments": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Post Comments", - "description": "Comments on posts", - "minimum": 0 + "description": "Comments on posts" }, "xdm:postReactions": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Post Reactions", - "description": "Reactions on posts", - "minimum": 0 + "description": "Reactions on posts" }, "xdm:postShares": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Post Shares", - "description": "Shares of posts", - "minimum": 0 + "description": "Shares of posts" }, "xdm:postSaves": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Post Saves", - "description": "Saves of posts", - "minimum": 0 + "description": "Saves of posts" }, "xdm:follows": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Follows", - "description": "Number of new followers gained", - "minimum": 0 + "description": "Number of new followers gained" }, "xdm:profileVisits": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Profile Visits", - "description": "Number of profile visits generated", - "minimum": 0 + "description": "Number of profile visits generated" }, "xdm:websiteVisits": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Website Visits", - "description": "Number of website visits generated", - "minimum": 0 + "description": "Number of website visits generated" }, "xdm:averageDwellTime": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Average Dwell Time", - "description": "Average dwell time (seconds) (alias for qualityMetrics.dwellTime to ease migration)", - "minimum": 0 + "description": "Average dwell time (seconds) (alias for qualityMetrics.dwellTime to ease migration)" }, "xdm:appInstalls": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "App Installs", - "description": "Number of app installations", - "minimum": 0 + "description": "Number of app installations" }, "xdm:appOpens": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "App Opens", - "description": "Number of app opens", - "minimum": 0 + "description": "Number of app opens" }, "xdm:leadSubmissions": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Lead Submissions", - "description": "Number of lead form submissions", - "minimum": 0 + "description": "Number of lead form submissions" }, "xdm:signups": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Signups", - "description": "Number of user signups", - "minimum": 0 + "description": "Number of user signups" }, "xdm:downloads": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Downloads", - "description": "Number of downloads", - "minimum": 0 + "description": "Number of downloads" }, "xdm:subscriptions": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Subscriptions", - "description": "Number of subscriptions", - "minimum": 0 + "description": "Number of subscriptions" }, "xdm:checkouts": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Checkouts", - "description": "Number of checkout initiations", - "minimum": 0 + "description": "Number of checkout initiations" }, "xdm:addToCarts": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Add to Carts", - "description": "Number of add to cart actions", - "minimum": 0 + "description": "Number of add to cart actions" }, "xdm:wishlistAdds": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Wishlist Adds", - "description": "Number of wishlist additions", - "minimum": 0 + "description": "Number of wishlist additions" }, "xdm:productViews": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Product Views", - "description": "Number of product page views", - "minimum": 0 + "description": "Number of product page views" }, "xdm:photoViews": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Photo Views", - "description": "Number of photo views", - "minimum": 0 + "description": "Number of photo views" }, "xdm:catalogViews": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Catalog Views", - "description": "Number of catalog views", - "minimum": 0 + "description": "Number of catalog views" }, "xdm:storeVisits": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Store Visits", - "description": "Number of physical store visits", - "minimum": 0 + "description": "Number of physical store visits" }, "xdm:callsGenerated": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Calls Generated", - "description": "Number of phone calls generated", - "minimum": 0 + "description": "Number of phone calls generated" }, "xdm:directionsRequested": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Directions Requested", - "description": "Number of direction requests", - "minimum": 0 + "description": "Number of direction requests" }, "xdm:eventResponses": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Event Responses", - "description": "Number of event responses", - "minimum": 0 + "description": "Number of event responses" }, "xdm:messagesSent": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Messages Sent", - "description": "Number of messages sent", - "minimum": 0 + "description": "Number of messages sent" } } } diff --git a/components/fieldgroups/paid-media/core-paid-media-metrics.example.1.json b/components/fieldgroups/paid-media/core-paid-media-metrics.example.1.json index e8b1b9b54..dc324ef0d 100644 --- a/components/fieldgroups/paid-media/core-paid-media-metrics.example.1.json +++ b/components/fieldgroups/paid-media/core-paid-media-metrics.example.1.json @@ -1,22 +1,54 @@ { "xdm:paidMedia": { "xdm:metrics": { - "xdm:impressions": 50000, - "xdm:clicks": 2500, - "xdm:spend": 18000, - "xdm:reach": 26000, - "xdm:frequency": 1.92, - "xdm:ctr": 0.05, - "xdm:cpm": 36.0, - "xdm:cpc": 7.2, - "xdm:conversions": 1250, - "xdm:conversionValue": 187500, - "xdm:costPerConversion": 14.4, - "xdm:roas": 10.42, - "xdm:videoViews": 8900, - "xdm:videoCompletions": 5785, - "xdm:engagements": 12345, - "xdm:engagementRate": 0.247, + "xdm:impressions": { + "xdm:value": 50000 + }, + "xdm:clicks": { + "xdm:value": 2500 + }, + "xdm:spend": { + "xdm:value": 18000 + }, + "xdm:reach": { + "xdm:value": 26000 + }, + "xdm:frequency": { + "xdm:value": 1.92 + }, + "xdm:ctr": { + "xdm:value": 0.05 + }, + "xdm:cpm": { + "xdm:value": 36.0 + }, + "xdm:cpc": { + "xdm:value": 7.2 + }, + "xdm:conversions": { + "xdm:value": 1250 + }, + "xdm:conversionValue": { + "xdm:value": 187500 + }, + "xdm:costPerConversion": { + "xdm:value": 14.4 + }, + "xdm:roas": { + "xdm:value": 10.42 + }, + "xdm:videoViews": { + "xdm:value": 8900 + }, + "xdm:videoCompletions": { + "xdm:value": 5785 + }, + "xdm:engagements": { + "xdm:value": 12345 + }, + "xdm:engagementRate": { + "xdm:value": 0.247 + }, "xdm:additionalMetrics": [ { "xdm:metricName": "outbound_clicks", diff --git a/components/fieldgroups/paid-media/core-paid-media-metrics.schema.json b/components/fieldgroups/paid-media/core-paid-media-metrics.schema.json index ac2a295ae..f468fa26d 100644 --- a/components/fieldgroups/paid-media/core-paid-media-metrics.schema.json +++ b/components/fieldgroups/paid-media/core-paid-media-metrics.schema.json @@ -25,102 +25,84 @@ "description": "Common performance metrics for paid media campaigns", "properties": { "xdm:impressions": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Impressions", - "description": "Number of times ads were displayed", - "minimum": 0 + "description": "Number of times ads were displayed" }, "xdm:clicks": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Clicks", - "description": "Number of clicks on ads", - "minimum": 0 + "description": "Number of clicks on ads" }, "xdm:spend": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Spend", - "description": "Amount spent in account currency", - "minimum": 0 + "description": "Amount spent in account currency" }, "xdm:reach": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Reach", - "description": "Number of unique users who saw the ads", - "minimum": 0 + "description": "Number of unique users who saw the ads" }, "xdm:frequency": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Frequency", - "description": "Average number of times each user saw the ads", - "minimum": 0 + "description": "Average number of times each user saw the ads" }, "xdm:ctr": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Click-Through Rate", - "description": "Click-through rate (clicks/impressions)", - "minimum": 0, - "maximum": 1 + "description": "Click-through rate (clicks/impressions)" }, "xdm:cpm": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Cost Per Mille", - "description": "Cost per thousand impressions", - "minimum": 0 + "description": "Cost per thousand impressions" }, "xdm:cpc": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Cost Per Click", - "description": "Average cost per click", - "minimum": 0 + "description": "Average cost per click" }, "xdm:conversions": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Conversions", - "description": "Total number of conversions", - "minimum": 0 + "description": "Total number of conversions" }, "xdm:conversionValue": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Conversion Value", - "description": "Total value of conversions in account currency", - "minimum": 0 + "description": "Total value of conversions in account currency" }, "xdm:costPerConversion": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Cost Per Conversion", - "description": "Average cost per conversion", - "minimum": 0 + "description": "Average cost per conversion" }, "xdm:roas": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Return on Ad Spend", - "description": "Return on ad spend (conversion value / spend)", - "minimum": 0 + "description": "Return on ad spend (conversion value / spend)" }, "xdm:videoViews": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Video Views", - "description": "Number of video views", - "minimum": 0 + "description": "Number of video views" }, "xdm:videoCompletions": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Video Completions", - "description": "Number of video completions", - "minimum": 0 + "description": "Number of video completions" }, "xdm:engagements": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Engagements", - "description": "Total engagement actions (likes, shares, comments, etc.)", - "minimum": 0 + "description": "Total engagement actions (likes, shares, comments, etc.)" }, "xdm:engagementRate": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Engagement Rate", - "description": "Engagement rate (engagements/impressions)", - "minimum": 0, - "maximum": 1 + "description": "Engagement rate (engagements/impressions)" }, "xdm:additionalMetrics": { "title": "Additional Metrics", diff --git a/components/fieldgroups/paid-media/core-paid-media-quality-metrics.example.1.json b/components/fieldgroups/paid-media/core-paid-media-quality-metrics.example.1.json index 43b5ba06c..3e54e5aa8 100644 --- a/components/fieldgroups/paid-media/core-paid-media-quality-metrics.example.1.json +++ b/components/fieldgroups/paid-media/core-paid-media-quality-metrics.example.1.json @@ -1,75 +1,93 @@ { "xdm:paidMedia": { "xdm:qualityMetrics": { - "xdm:relevanceScore": 9.0, - "xdm:engagementScore": 8.2, - "xdm:conversionScore": 8.8, - "xdm:overallQualityScore": 8.67, - "xdm:negativeActions": 25, - "xdm:negativeActionRate": 0.0005, - "xdm:positiveActions": 12345, - "xdm:positiveActionRate": 0.247, - "xdm:brandSafetyScore": 9.5, - "xdm:viewabilityScore": 8.5, - "xdm:fraudScore": 0.5, - "xdm:invalidTrafficRate": 0.02, - "xdm:botTrafficRate": 0.015, - "xdm:humanTrafficRate": 0.985, - "xdm:attentionScore": 7.8, - "xdm:dwellTime": 4.2, - "xdm:interactionDepth": 3.5, - "xdm:creativeFatigue": 2.1, - "xdm:frequencyFatigue": 1.8, - "xdm:audienceRelevance": 8.9, - "xdm:contextualRelevance": 8.5, - "xdm:emotionalResonance": 7.6, - "xdm:memorabilityScore": 7.2, - "xdm:brandLiftScore": 6.8, - "xdm:intentLiftScore": 7.4, + "xdm:relevanceScore": { + "xdm:value": 9.0 + }, + "xdm:engagementScore": { + "xdm:value": 8.2 + }, + "xdm:conversionScore": { + "xdm:value": 8.8 + }, + "xdm:overallQualityScore": { + "xdm:value": 8.67 + }, + "xdm:negativeActions": { + "xdm:value": 25 + }, + "xdm:negativeActionRate": { + "xdm:value": 0.0005 + }, + "xdm:positiveActions": { + "xdm:value": 12345 + }, + "xdm:positiveActionRate": { + "xdm:value": 0.247 + }, + "xdm:brandSafetyScore": { + "xdm:value": 9.5 + }, + "xdm:viewabilityScore": { + "xdm:value": 8.5 + }, + "xdm:fraudScore": { + "xdm:value": 0.5 + }, + "xdm:invalidTrafficRate": { + "xdm:value": 0.02 + }, + "xdm:botTrafficRate": { + "xdm:value": 0.015 + }, + "xdm:humanTrafficRate": { + "xdm:value": 0.985 + }, + "xdm:attentionScore": { + "xdm:value": 7.8 + }, + "xdm:dwellTime": { + "xdm:value": 4.2 + }, + "xdm:interactionDepth": { + "xdm:value": 3.5 + }, + "xdm:creativeFatigue": { + "xdm:value": 2.1 + }, + "xdm:frequencyFatigue": { + "xdm:value": 1.8 + }, + "xdm:audienceRelevance": { + "xdm:value": 8.9 + }, + "xdm:contextualRelevance": { + "xdm:value": 8.5 + }, + "xdm:emotionalResonance": { + "xdm:value": 7.6 + }, + "xdm:memorabilityScore": { + "xdm:value": 7.2 + }, + "xdm:brandLiftScore": { + "xdm:value": 6.8 + }, + "xdm:intentLiftScore": { + "xdm:value": 7.4 + }, "xdm:qualityTrend": "improving", "xdm:benchmarkComparison": { - "xdm:industryAverage": 7.5, - "xdm:percentileRank": 78, - "xdm:competitorAverage": 7.8 - }, - "xdm:additionalDetails": [ - { - "xdm:fieldName": "meta_quality_ranking", - "xdm:stringValue": "above_average" - }, - { - "xdm:fieldName": "meta_engagement_rate_ranking", - "xdm:stringValue": "above_average" - }, - { - "xdm:fieldName": "meta_conversion_rate_ranking", - "xdm:stringValue": "above_average" - }, - { - "xdm:fieldName": "meta_negative_feedback_rate", - "xdm:stringValue": "0.0005" - }, - { - "xdm:fieldName": "meta_hide_rate", - "xdm:stringValue": "0.00046" - }, - { - "xdm:fieldName": "meta_report_rate", - "xdm:stringValue": "0.00004" - }, - { - "xdm:fieldName": "meta_positive_feedback_rate", - "xdm:stringValue": "0.247" + "xdm:industryAverage": { + "xdm:value": 7.5 }, - { - "xdm:fieldName": "meta_viewability_rate", - "xdm:stringValue": "0.85" + "xdm:percentileRank": { + "xdm:value": 78 }, - { - "xdm:fieldName": "meta_brand_safety_score", - "xdm:stringValue": "9.5" + "xdm:competitorAverage": { + "xdm:value": 7.8 } - ] + } } } } diff --git a/components/fieldgroups/paid-media/core-paid-media-quality-metrics.schema.json b/components/fieldgroups/paid-media/core-paid-media-quality-metrics.schema.json index 21d788404..867d615ca 100644 --- a/components/fieldgroups/paid-media/core-paid-media-quality-metrics.schema.json +++ b/components/fieldgroups/paid-media/core-paid-media-quality-metrics.schema.json @@ -25,175 +25,129 @@ "description": "Ad quality and performance indicators", "properties": { "xdm:relevanceScore": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Relevance Score", - "description": "Ad relevance score", - "minimum": 0, - "maximum": 10 + "description": "Ad relevance score" }, "xdm:engagementScore": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Engagement Score", - "description": "Ad engagement quality score", - "minimum": 0, - "maximum": 10 + "description": "Ad engagement quality score" }, "xdm:conversionScore": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Conversion Score", - "description": "Ad conversion quality score", - "minimum": 0, - "maximum": 10 + "description": "Ad conversion quality score" }, "xdm:overallQualityScore": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Overall Quality Score", - "description": "Overall ad quality score", - "minimum": 0, - "maximum": 10 + "description": "Overall ad quality score" }, "xdm:negativeActions": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Negative Actions", - "description": "Number of negative actions (hides, reports, etc.)", - "minimum": 0 + "description": "Number of negative actions (hides, reports, etc.)" }, "xdm:negativeActionRate": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Negative Action Rate", - "description": "Rate of negative actions", - "minimum": 0, - "maximum": 1 + "description": "Rate of negative actions" }, "xdm:positiveActions": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Positive Actions", - "description": "Number of positive actions (likes, shares, etc.)", - "minimum": 0 + "description": "Number of positive actions (likes, shares, etc.)" }, "xdm:positiveActionRate": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Positive Action Rate", - "description": "Rate of positive actions", - "minimum": 0, - "maximum": 1 + "description": "Rate of positive actions" }, "xdm:brandSafetyScore": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Brand Safety Score", - "description": "Brand safety compliance score", - "minimum": 0, - "maximum": 10 + "description": "Brand safety compliance score" }, "xdm:viewabilityScore": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Viewability Score", - "description": "Ad viewability quality score", - "minimum": 0, - "maximum": 10 + "description": "Ad viewability quality score" }, "xdm:fraudScore": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Fraud Score", - "description": "Ad fraud risk score (higher = more risk)", - "minimum": 0, - "maximum": 10 + "description": "Ad fraud risk score (higher = more risk)" }, "xdm:invalidTrafficRate": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Invalid Traffic Rate", - "description": "Percentage of traffic flagged as invalid", - "minimum": 0, - "maximum": 1 + "description": "Percentage of traffic flagged as invalid" }, "xdm:botTrafficRate": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Bot Traffic Rate", - "description": "Percentage of traffic identified as bot traffic", - "minimum": 0, - "maximum": 1 + "description": "Percentage of traffic identified as bot traffic" }, "xdm:humanTrafficRate": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Human Traffic Rate", - "description": "Percentage of traffic verified as human", - "minimum": 0, - "maximum": 1 + "description": "Percentage of traffic verified as human" }, "xdm:attentionScore": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Attention Score", - "description": "User attention quality score", - "minimum": 0, - "maximum": 10 + "description": "User attention quality score" }, "xdm:dwellTime": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Dwell Time", - "description": "Average time users spend viewing the ad (seconds)", - "minimum": 0 + "description": "Average time users spend viewing the ad (seconds)" }, "xdm:interactionDepth": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Interaction Depth", - "description": "Depth of user interaction with the ad", - "minimum": 0 + "description": "Depth of user interaction with the ad" }, "xdm:creativeFatigue": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Creative Fatigue", - "description": "Creative fatigue score (higher = more fatigued)", - "minimum": 0, - "maximum": 10 + "description": "Creative fatigue score (higher = more fatigued)" }, "xdm:frequencyFatigue": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Frequency Fatigue", - "description": "Frequency fatigue score", - "minimum": 0, - "maximum": 10 + "description": "Frequency fatigue score" }, "xdm:audienceRelevance": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Audience Relevance", - "description": "Relevance of ad to target audience", - "minimum": 0, - "maximum": 10 + "description": "Relevance of ad to target audience" }, "xdm:contextualRelevance": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Contextual Relevance", - "description": "Relevance of ad to content context", - "minimum": 0, - "maximum": 10 + "description": "Relevance of ad to content context" }, "xdm:emotionalResonance": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Emotional Resonance", - "description": "Emotional impact score of the ad", - "minimum": 0, - "maximum": 10 + "description": "Emotional impact score of the ad" }, "xdm:memorabilityScore": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Memorability Score", - "description": "Ad memorability score", - "minimum": 0, - "maximum": 10 + "description": "Ad memorability score" }, "xdm:brandLiftScore": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Brand Lift Score", - "description": "Brand awareness lift score", - "minimum": 0, - "maximum": 10 + "description": "Brand awareness lift score" }, "xdm:intentLiftScore": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Intent Lift Score", - "description": "Purchase intent lift score", - "minimum": 0, - "maximum": 10 + "description": "Purchase intent lift score" }, "xdm:qualityTrend": { "type": "string", @@ -213,19 +167,17 @@ "description": "Comparison to industry benchmarks", "properties": { "xdm:industryAverage": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Industry Average", "description": "Industry average quality score" }, "xdm:percentileRank": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Percentile Rank", - "description": "Percentile rank compared to industry", - "minimum": 0, - "maximum": 100 + "description": "Percentile rank compared to industry" }, "xdm:competitorAverage": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Competitor Average", "description": "Average quality score of competitors" } diff --git a/components/fieldgroups/paid-media/core-paid-media-video-metrics.example.1.json b/components/fieldgroups/paid-media/core-paid-media-video-metrics.example.1.json index 67e70e26e..f46caf40b 100644 --- a/components/fieldgroups/paid-media/core-paid-media-video-metrics.example.1.json +++ b/components/fieldgroups/paid-media/core-paid-media-video-metrics.example.1.json @@ -1,95 +1,111 @@ { "xdm:paidMedia": { "xdm:videoMetrics": { - "xdm:videoPlays": 9500, - "xdm:video3SecViews": 8900, - "xdm:video2SecViews": 9200, - "xdm:video6SecViews": 8450, - "xdm:video10SecViews": 7890, - "xdm:videoViewRate2Sec": 0.968, - "xdm:videoViewRate6Sec": 0.889, - "xdm:video15SecViews": 7234, - "xdm:video30SecViews": 6234, - "xdm:videoQuartile1": 8234, - "xdm:videoQuartile2": 7456, - "xdm:videoQuartile3": 6789, - "xdm:videoCompletions": 5785, - "xdm:videoCompletionRate": 0.65, - "xdm:videoViewRate25Percent": 0.867, - "xdm:videoViewRate50Percent": 0.785, - "xdm:videoViewRate75Percent": 0.715, - "xdm:videoViewRate100Percent": 0.609, - "xdm:averageVideoWatchTime": 18.5, - "xdm:totalVideoWatchTime": 175750, - "xdm:videoMrcViews": 8234, - "xdm:videoThroughplayViews": 5785, - "xdm:videoSkips": 1265, - "xdm:videoSkipRate": 0.133, - "xdm:videoReplays": 456, - "xdm:videoPauses": 1234, - "xdm:videoResumes": 1156, - "xdm:videoFullscreenViews": 2345, - "xdm:videoMutes": 890, - "xdm:videoUnmutes": 678, - "xdm:videoVolumeChanges": 234, - "xdm:videoClickToPlays": 3456, - "xdm:videoAutoPlays": 6044, - "xdm:videoViewabilityRate": 0.85, - "xdm:videoAudibilityRate": 0.72, - "xdm:additionalDetails": [ - { - "xdm:fieldName": "meta_video_plays", - "xdm:stringValue": "9500" - }, - { - "xdm:fieldName": "meta_video_3_sec_views", - "xdm:stringValue": "8900" - }, - { - "xdm:fieldName": "meta_video_30_sec_watched_actions", - "xdm:stringValue": "6234" - }, - { - "xdm:fieldName": "meta_video_p25_watched_actions", - "xdm:stringValue": "8234" - }, - { - "xdm:fieldName": "meta_video_p50_watched_actions", - "xdm:stringValue": "7456" - }, - { - "xdm:fieldName": "meta_video_p75_watched_actions", - "xdm:stringValue": "6789" - }, - { - "xdm:fieldName": "meta_video_p95_watched_actions", - "xdm:stringValue": "5785" - }, - { - "xdm:fieldName": "meta_video_p100_watched_actions", - "xdm:stringValue": "5785" - }, - { - "xdm:fieldName": "meta_video_avg_time_watched_actions", - "xdm:stringValue": "18.5" - }, - { - "xdm:fieldName": "meta_video_total_time_watched", - "xdm:stringValue": "175750" - }, - { - "xdm:fieldName": "meta_video_completion_rate", - "xdm:stringValue": "0.65" - }, - { - "xdm:fieldName": "meta_video_viewability_rate", - "xdm:stringValue": "0.85" - }, - { - "xdm:fieldName": "meta_video_sound_on_rate", - "xdm:stringValue": "0.72" - } - ] + "xdm:videoPlays": { + "xdm:value": 9500 + }, + "xdm:video3SecViews": { + "xdm:value": 8900 + }, + "xdm:video2SecViews": { + "xdm:value": 9200 + }, + "xdm:video6SecViews": { + "xdm:value": 8450 + }, + "xdm:video10SecViews": { + "xdm:value": 7890 + }, + "xdm:videoViewRate2Sec": { + "xdm:value": 0.968 + }, + "xdm:videoViewRate6Sec": { + "xdm:value": 0.889 + }, + "xdm:video15SecViews": { + "xdm:value": 7234 + }, + "xdm:video30SecViews": { + "xdm:value": 6234 + }, + "xdm:videoQuartile1": { + "xdm:value": 8234 + }, + "xdm:videoQuartile2": { + "xdm:value": 7456 + }, + "xdm:videoQuartile3": { + "xdm:value": 6789 + }, + "xdm:videoCompletions": { + "xdm:value": 5785 + }, + "xdm:videoCompletionRate": { + "xdm:value": 0.65 + }, + "xdm:videoViewRate25Percent": { + "xdm:value": 0.867 + }, + "xdm:videoViewRate50Percent": { + "xdm:value": 0.785 + }, + "xdm:videoViewRate75Percent": { + "xdm:value": 0.715 + }, + "xdm:videoViewRate100Percent": { + "xdm:value": 0.609 + }, + "xdm:averageVideoWatchTime": { + "xdm:value": 18.5 + }, + "xdm:totalVideoWatchTime": { + "xdm:value": 175750 + }, + "xdm:videoMrcViews": { + "xdm:value": 8234 + }, + "xdm:videoThroughplayViews": { + "xdm:value": 5785 + }, + "xdm:videoSkips": { + "xdm:value": 1265 + }, + "xdm:videoSkipRate": { + "xdm:value": 0.133 + }, + "xdm:videoReplays": { + "xdm:value": 456 + }, + "xdm:videoPauses": { + "xdm:value": 1234 + }, + "xdm:videoResumes": { + "xdm:value": 1156 + }, + "xdm:videoFullscreenViews": { + "xdm:value": 2345 + }, + "xdm:videoMutes": { + "xdm:value": 890 + }, + "xdm:videoUnmutes": { + "xdm:value": 678 + }, + "xdm:videoVolumeChanges": { + "xdm:value": 234 + }, + "xdm:videoClickToPlays": { + "xdm:value": 3456 + }, + "xdm:videoAutoPlays": { + "xdm:value": 6044 + }, + "xdm:videoViewabilityRate": { + "xdm:value": 0.85 + }, + "xdm:videoAudibilityRate": { + "xdm:value": 0.72 + } } } } diff --git a/components/fieldgroups/paid-media/core-paid-media-video-metrics.schema.json b/components/fieldgroups/paid-media/core-paid-media-video-metrics.schema.json index c7c4c86b3..467f4b9a4 100644 --- a/components/fieldgroups/paid-media/core-paid-media-video-metrics.schema.json +++ b/components/fieldgroups/paid-media/core-paid-media-video-metrics.schema.json @@ -25,224 +25,179 @@ "description": "Metrics specific to video ads", "properties": { "xdm:videoPlays": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Video Plays", - "description": "Number of video plays", - "minimum": 0 + "description": "Number of video plays" }, "xdm:video3SecViews": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "3-Second Video Views", - "description": "Number of 3-second video views", - "minimum": 0 + "description": "Number of 3-second video views" }, "xdm:video2SecViews": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "2-Second Video Views", - "description": "Number of times video was viewed for at least 2 seconds", - "minimum": 0 + "description": "Number of times video was viewed for at least 2 seconds" }, "xdm:video6SecViews": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "6-Second Video Views", - "description": "Number of times video was viewed for at least 6 seconds", - "minimum": 0 + "description": "Number of times video was viewed for at least 6 seconds" }, "xdm:video10SecViews": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "10-Second Video Views", - "description": "Number of times video was viewed for at least 10 seconds", - "minimum": 0 + "description": "Number of times video was viewed for at least 10 seconds" }, "xdm:videoViewRate2Sec": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "2-Second Video View Rate", - "description": "Percentage of videos viewed for at least 2 seconds", - "minimum": 0, - "maximum": 1 + "description": "Percentage of videos viewed for at least 2 seconds" }, "xdm:videoViewRate6Sec": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "6-Second Video View Rate", - "description": "Percentage of videos viewed for at least 6 seconds", - "minimum": 0, - "maximum": 1 + "description": "Percentage of videos viewed for at least 6 seconds" }, "xdm:video15SecViews": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "15-Second Video Views", - "description": "Number of 15-second video views", - "minimum": 0 + "description": "Number of 15-second video views" }, "xdm:video30SecViews": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "30-Second Video Views", - "description": "Number of 30-second video views", - "minimum": 0 + "description": "Number of 30-second video views" }, "xdm:videoQuartile1": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Video 25% Completion", - "description": "Number of videos watched to 25%", - "minimum": 0 + "description": "Number of videos watched to 25%" }, "xdm:videoQuartile2": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Video 50% Completion", - "description": "Number of videos watched to 50%", - "minimum": 0 + "description": "Number of videos watched to 50%" }, "xdm:videoQuartile3": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Video 75% Completion", - "description": "Number of videos watched to 75%", - "minimum": 0 + "description": "Number of videos watched to 75%" }, "xdm:videoCompletions": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Video Completions", - "description": "Number of videos watched to completion", - "minimum": 0 + "description": "Number of videos watched to completion" }, "xdm:videoCompletionRate": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Video Completion Rate", - "description": "Percentage of videos watched to completion", - "minimum": 0, - "maximum": 1 + "description": "Percentage of videos watched to completion" }, "xdm:videoViewRate25Percent": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "25% Video View Rate", - "description": "Percentage of videos viewed to 25% completion", - "minimum": 0, - "maximum": 1 + "description": "Percentage of videos viewed to 25% completion" }, "xdm:videoViewRate50Percent": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "50% Video View Rate", - "description": "Percentage of videos viewed to 50% completion", - "minimum": 0, - "maximum": 1 + "description": "Percentage of videos viewed to 50% completion" }, "xdm:videoViewRate75Percent": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "75% Video View Rate", - "description": "Percentage of videos viewed to 75% completion", - "minimum": 0, - "maximum": 1 + "description": "Percentage of videos viewed to 75% completion" }, "xdm:videoViewRate100Percent": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "100% Video View Rate", - "description": "Percentage of videos viewed to 100% completion", - "minimum": 0, - "maximum": 1 + "description": "Percentage of videos viewed to 100% completion" }, "xdm:averageVideoWatchTime": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Average Video Watch Time", - "description": "Average time spent watching videos in seconds", - "minimum": 0 + "description": "Average time spent watching videos in seconds" }, "xdm:totalVideoWatchTime": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Total Video Watch Time", - "description": "Total time spent watching videos in seconds", - "minimum": 0 + "description": "Total time spent watching videos in seconds" }, "xdm:videoMrcViews": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Video MRC Views", - "description": "Video views meeting MRC standards", - "minimum": 0 + "description": "Video views meeting MRC standards" }, "xdm:videoThroughplayViews": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Video Throughplay Views", - "description": "Number of throughplay video views", - "minimum": 0 + "description": "Number of throughplay video views" }, "xdm:videoSkips": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Video Skips", - "description": "Number of video skips", - "minimum": 0 + "description": "Number of video skips" }, "xdm:videoSkipRate": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Video Skip Rate", - "description": "Percentage of videos that were skipped", - "minimum": 0, - "maximum": 1 + "description": "Percentage of videos that were skipped" }, "xdm:videoReplays": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Video Replays", - "description": "Number of video replays", - "minimum": 0 + "description": "Number of video replays" }, "xdm:videoPauses": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Video Pauses", - "description": "Number of video pauses", - "minimum": 0 + "description": "Number of video pauses" }, "xdm:videoResumes": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Video Resumes", - "description": "Number of video resumes after pause", - "minimum": 0 + "description": "Number of video resumes after pause" }, "xdm:videoFullscreenViews": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Video Fullscreen Views", - "description": "Number of fullscreen video views", - "minimum": 0 + "description": "Number of fullscreen video views" }, "xdm:videoMutes": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Video Mutes", - "description": "Number of video mutes", - "minimum": 0 + "description": "Number of video mutes" }, "xdm:videoUnmutes": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Video Unmutes", - "description": "Number of video unmutes", - "minimum": 0 + "description": "Number of video unmutes" }, "xdm:videoVolumeChanges": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Video Volume Changes", - "description": "Number of video volume changes", - "minimum": 0 + "description": "Number of video volume changes" }, "xdm:videoClickToPlays": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Video Click to Plays", - "description": "Number of click-to-play actions", - "minimum": 0 + "description": "Number of click-to-play actions" }, "xdm:videoAutoPlays": { - "type": "integer", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Video Auto Plays", - "description": "Number of auto-play video starts", - "minimum": 0 + "description": "Number of auto-play video starts" }, "xdm:videoViewabilityRate": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Video Viewability Rate", - "description": "Percentage of video impressions that were viewable", - "minimum": 0, - "maximum": 1 + "description": "Percentage of video impressions that were viewable" }, "xdm:videoAudibilityRate": { - "type": "number", + "$ref": "https://ns.adobe.com/xdm/data/measure", "title": "Video Audibility Rate", - "description": "Percentage of video views with audible sound", - "minimum": 0, - "maximum": 1 + "description": "Percentage of video views with audible sound" } } } From c87fcf2dd17aefb4c886a4d601e35a303632b131 Mon Sep 17 00:00:00 2001 From: Dan Bunker Date: Wed, 19 Nov 2025 15:07:14 -0800 Subject: [PATCH 10/22] Fix incorrect example files --- ...-paid-media-account-details.example.1.json | 153 ++------------ .../core-paid-media-ad-details.example.1.json | 116 +---------- .../core-paid-media-ad-details.example.2.json | 117 +---------- .../core-paid-media-ad-details.example.3.json | 116 +---------- ...-paid-media-adgroup-details.example.1.json | 163 ++------------- ...re-paid-media-asset-details.example.1.json | 122 +++-------- ...re-paid-media-asset-details.example.2.json | 116 +++-------- ...re-paid-media-asset-details.example.3.json | 128 ++---------- ...d-media-attribution-metrics.example.1.json | 195 ++++++------------ ...paid-media-campaign-details.example.1.json | 128 ++---------- ...edia-dimensional-breakdowns.example.1.json | 83 ++------ ...id-media-experience-details.example.1.json | 160 ++++++++------ ...core-paid-media-identifiers.example.1.json | 48 +++-- 13 files changed, 346 insertions(+), 1299 deletions(-) diff --git a/components/fieldgroups/paid-media/core-paid-media-account-details.example.1.json b/components/fieldgroups/paid-media/core-paid-media-account-details.example.1.json index 080084903..938151dda 100644 --- a/components/fieldgroups/paid-media/core-paid-media-account-details.example.1.json +++ b/components/fieldgroups/paid-media/core-paid-media-account-details.example.1.json @@ -7,148 +7,33 @@ "xdm:industry": "Technology", "xdm:country": "US", "xdm:isTestAccount": false, - "xdm:businessInfo": { - "xdm:businessID": "123456789012345", - "xdm:businessManagerID": "987654321098765", - "xdm:legalEntityName": "Acme Corporation Inc.", - "xdm:taxID": "12-3456789", - "xdm:businessAddress": { - "xdm:street1": "123 Innovation Drive", - "xdm:street2": "Suite 500", - "xdm:city": "San Francisco", - "xdm:region": "CA", - "xdm:postalCode": "94105", - "xdm:country": "US" - }, - "xdm:businessPhone": "+1-415-555-0100", - "xdm:businessEmail": "advertising@acmecorp.com", - "xdm:businessWebsite": "https://www.acmecorp.com", - "xdm:businessCategory": "Technology Company", - "xdm:businessVertical": "Software as a Service", - "xdm:employeeCount": "1001-5000", - "xdm:annualRevenue": "50000000-100000000", - "xdm:yearEstablished": 2010, - "xdm:publiclyTraded": true, - "xdm:stockSymbol": "ACME", - "xdm:parentCompany": "Acme Holdings LLC" + "xdm:parentAccountID": "parent_account_987654321", + "xdm:agencyID": "agency_456789123", + "xdm:permissions": ["owner", "admin"], + "xdm:spendingLimits": { + "xdm:dailyLimit": 5000, + "xdm:monthlyLimit": 150000, + "xdm:totalLimit": 1000000 }, "xdm:billingInfo": { "xdm:billingType": "credit_card", - "xdm:paymentMethodID": "pm_1234567890abcdef", - "xdm:billingCurrency": "USD", - "xdm:billingAddress": { + "xdm:paymentMethod": "Visa ending in 1234", + "xdm:creditLimit": 500000, + "xdm:currentBalance": 125000 + }, + "xdm:contactInfo": { + "xdm:primaryEmail": "john.doe@acmecorp.com", + "xdm:phone": "+1-415-555-0120", + "xdm:website": "https://www.acmecorp.com", + "xdm:address": { "xdm:street1": "123 Innovation Drive", - "xdm:street2": "Finance Department", + "xdm:street2": "Suite 500", "xdm:city": "San Francisco", + "xdm:state": "California", "xdm:region": "CA", "xdm:postalCode": "94105", "xdm:country": "US" - }, - "xdm:billingEmail": "billing@acmecorp.com", - "xdm:billingContact": "Jane Smith", - "xdm:billingPhone": "+1-415-555-0150", - "xdm:invoiceDelivery": "email", - "xdm:paymentTerms": "immediate", - "xdm:creditLimit": 500000, - "xdm:currentBalance": 125000, - "xdm:availableCredit": 375000, - "xdm:lastPaymentDate": "2025-11-03T10:30:00Z", - "xdm:lastPaymentAmount": 45000, - "xdm:nextBillingDate": "2025-12-01T00:00:00Z", - "xdm:autoPayEnabled": true, - "xdm:billingThreshold": 10000, - "xdm:taxExempt": false - }, - "xdm:contactInfo": { - "xdm:primaryContact": { - "xdm:name": "John Doe", - "xdm:email": "john.doe@acmecorp.com", - "xdm:phone": "+1-415-555-0120", - "xdm:title": "Director of Digital Marketing", - "xdm:userID": "user_abc123xyz" - }, - "xdm:technicalContact": { - "xdm:name": "Sarah Johnson", - "xdm:email": "sarah.johnson@acmecorp.com", - "xdm:phone": "+1-415-555-0130", - "xdm:title": "Marketing Technology Manager", - "xdm:userID": "user_def456uvw" - }, - "xdm:billingContact": { - "xdm:name": "Jane Smith", - "xdm:email": "jane.smith@acmecorp.com", - "xdm:phone": "+1-415-555-0150", - "xdm:title": "Finance Manager", - "xdm:userID": "user_ghi789rst" - }, - "xdm:notificationEmails": [ - "marketing-alerts@acmecorp.com", - "performance-reports@acmecorp.com", - "billing-notifications@acmecorp.com" - ] - }, - "xdm:spendingLimits": { - "xdm:dailySpendLimit": 5000, - "xdm:monthlySpendLimit": 150000, - "xdm:lifetimeSpendLimit": 1000000, - "xdm:currentDailySpend": 3250, - "xdm:currentMonthlySpend": 87500, - "xdm:lifetimeSpend": 425000, - "xdm:spendLimitResetDay": 1, - "xdm:alertThreshold": 0.8, - "xdm:alertsEnabled": true, - "xdm:pauseOnLimitReached": false - }, - "xdm:accountPermissions": { - "xdm:canCreateCampaigns": true, - "xdm:canEditCampaigns": true, - "xdm:canDeleteCampaigns": true, - "xdm:canViewReports": true, - "xdm:canManageBilling": true, - "xdm:canManageUsers": true, - "xdm:canAccessAPI": true, - "xdm:canUseAdvancedFeatures": true, - "xdm:restrictedPlacements": [], - "xdm:allowedCountries": ["US", "CA", "GB", "AU", "DE", "FR"], - "xdm:blockedCategories": ["gambling", "alcohol"], - "xdm:requiresApproval": false - }, - "xdm:accountSettings": { - "xdm:timezone": "America/Los_Angeles", - "xdm:language": "en_US", - "xdm:currency": "USD", - "xdm:attributionWindow": "28d_click_1d_view", - "xdm:conversionTracking": true, - "xdm:pixelID": "pixel_123456789", - "xdm:catalogID": "catalog_987654321", - "xdm:appID": "app_456789123", - "xdm:domainVerification": true, - "xdm:verifiedDomains": ["acmecorp.com", "shop.acmecorp.com"], - "xdm:brandSafetyEnabled": true, - "xdm:adReviewEnabled": true, - "xdm:autoOptimizationEnabled": true - }, - "xdm:accountStatus": { - "xdm:status": "active", - "xdm:accountHealth": "good", - "xdm:complianceStatus": "compliant", - "xdm:verificationStatus": "verified", - "xdm:riskLevel": "low", - "xdm:restrictions": [], - "xdm:warnings": [], - "xdm:lastReviewDate": "2025-10-15T14:30:00Z", - "xdm:nextReviewDate": "2026-01-15T00:00:00Z" - }, - "xdm:partnerIntegrations": { - "xdm:crmIntegration": true, - "xdm:crmProvider": "Salesforce", - "xdm:analyticsIntegration": true, - "xdm:analyticsProvider": "Adobe Analytics", - "xdm:cdpIntegration": true, - "xdm:cdpProvider": "Adobe Real-Time CDP", - "xdm:attributionProvider": "Adobe Attribution AI", - "xdm:dataWarehouseIntegration": true, - "xdm:dataWarehouseProvider": "Snowflake" + } }, "xdm:additionalDetails": [ { diff --git a/components/fieldgroups/paid-media/core-paid-media-ad-details.example.1.json b/components/fieldgroups/paid-media/core-paid-media-ad-details.example.1.json index 60839f3de..b0dd553af 100644 --- a/components/fieldgroups/paid-media/core-paid-media-ad-details.example.1.json +++ b/components/fieldgroups/paid-media/core-paid-media-ad-details.example.1.json @@ -2,122 +2,16 @@ "xdm:paidMedia": { "xdm:adDetails": { "xdm:adType": "video", - "xdm:adFormat": "single_video", "xdm:reviewStatus": "approved", + "xdm:reviewStatusReasons": [], "xdm:deliveryStatus": "active", "xdm:isPinDeleted": false, "xdm:isRemovable": true, - "xdm:creativeDetails": { - "xdm:creativeID": "creative_vid_987654321", - "xdm:creativeName": "Fall Product Launch - 30s Video", - "xdm:creativeType": "video", - "xdm:creativeFormat": "feed_video", - "xdm:creativeVersion": "v2.1", - "xdm:creativeTemplate": "video_standard", - "xdm:dynamicCreative": false, - "xdm:personalized": true, - "xdm:localized": true, - "xdm:locale": "en_US", - "xdm:brandID": "brand_acme_123", - "xdm:campaignTheme": "fall_2025_launch" - }, - "xdm:adReviewDetails": { - "xdm:reviewStatus": "approved", - "xdm:reviewDate": "2025-11-05T14:30:00Z", - "xdm:reviewerID": "meta_reviewer_456", - "xdm:reviewNotes": "Approved - complies with all advertising policies", - "xdm:policyViolations": [], - "xdm:appealStatus": "not_applicable", - "xdm:lastModifiedDate": "2025-11-05T10:15:00Z", - "xdm:autoApproved": false, - "xdm:requiresManualReview": false - }, - "xdm:deliveryDetails": { - "xdm:deliveryStatus": "active", - "xdm:effectiveStatus": "active", - "xdm:servingStatus": "CAMPAIGN_STATUS_ENABLED", - "xdm:pacing": "standard", - "xdm:deliveryEstimate": "good", - "xdm:learningPhase": "completed", - "xdm:lastDeliveryCheck": "2025-11-10T08:00:00Z", - "xdm:estimatedDailyReach": 125000, - "xdm:saturationLevel": "low" - }, + "xdm:payingAdvertiserName": "Acme Corporation", "xdm:socialMediaProperties": { - "xdm:postID": "post_123456789_987654321", - "xdm:pageID": "page_acmecorp_official", - "xdm:instagramAccountID": "ig_acmecorp", - "xdm:allowComments": true, - "xdm:allowSharing": true, - "xdm:allowLikes": true, - "xdm:commentCount": 1247, - "xdm:shareCount": 892, - "xdm:likeCount": 8934, - "xdm:reactionCount": 9876, - "xdm:saveCount": 456, - "xdm:hideCount": 23, - "xdm:reportCount": 2, - "xdm:organicImpressions": 45000, - "xdm:organicReach": 32000, - "xdm:viralImpressions": 12000, - "xdm:viralReach": 8500 - }, - "xdm:callToAction": { - "xdm:type": "learn_more", - "xdm:text": "Learn More", - "xdm:url": "https://www.acmecorp.com/fall-launch?utm_source=facebook&utm_medium=video&utm_campaign=fall2025", - "xdm:displayUrl": "acmecorp.com/fall-launch", - "xdm:deepLink": "acmecorp://products/fall-launch", - "xdm:trackingTemplate": "https://track.acmecorp.com/click?ad={ad_id}&placement={placement}", - "xdm:utmParameters": { - "xdm:source": "facebook", - "xdm:medium": "video", - "xdm:campaign": "fall2025", - "xdm:content": "30s_video", - "xdm:term": "product_launch" - } - }, - "xdm:linkProperties": { - "xdm:destinationURL": "https://www.acmecorp.com/fall-launch", - "xdm:displayURL": "acmecorp.com", - "xdm:urlTags": "utm_source=facebook&utm_medium=video&utm_campaign=fall2025", - "xdm:trackingPixels": [ - "https://track.acmecorp.com/impression?ad=vid_987654321", - "https://analytics.acmecorp.com/pixel?type=view&id=fall2025" - ], - "xdm:clickTrackers": [ - "https://track.acmecorp.com/click?ad=vid_987654321", - "https://analytics.acmecorp.com/pixel?type=click&id=fall2025" - ], - "xdm:conversionTracking": true, - "xdm:conversionPixelID": "pixel_123456789" - }, - "xdm:appProperties": { - "xdm:appID": "app_456789123", - "xdm:appName": "Acme Shopping", - "xdm:appPlatform": "ios", - "xdm:appStoreURL": "https://apps.apple.com/app/acme-shopping/id123456789", - "xdm:appDeepLink": "acmecorp://products/fall-launch", - "xdm:appEventTracking": true, - "xdm:appEventName": "product_view", - "xdm:sdkVersion": "9.2.1" - }, - "xdm:leadGenProperties": { - "xdm:formID": "form_not_applicable", - "xdm:formType": "not_applicable", - "xdm:instantForm": false, - "xdm:privacyPolicyURL": "https://www.acmecorp.com/privacy", - "xdm:customDisclaimer": "By submitting, you agree to receive marketing communications from Acme Corp." - }, - "xdm:interactionProperties": { - "xdm:allowInteraction": true, - "xdm:interactionType": "video_engagement", - "xdm:swipeUpEnabled": false, - "xdm:pollEnabled": false, - "xdm:quizEnabled": false, - "xdm:gamificationEnabled": false, - "xdm:arEnabled": false, - "xdm:threeDEnabled": false + "xdm:effectiveObjectStoryID": "post_123456789_987654321", + "xdm:isShareable": true, + "xdm:favoriteDisplayMode": "default" }, "xdm:additionalDetails": [ { diff --git a/components/fieldgroups/paid-media/core-paid-media-ad-details.example.2.json b/components/fieldgroups/paid-media/core-paid-media-ad-details.example.2.json index 49054e197..9a7c15e47 100644 --- a/components/fieldgroups/paid-media/core-paid-media-ad-details.example.2.json +++ b/components/fieldgroups/paid-media/core-paid-media-ad-details.example.2.json @@ -2,122 +2,17 @@ "xdm:paidMedia": { "xdm:adDetails": { "xdm:adType": "image", - "xdm:adFormat": "single_image", "xdm:reviewStatus": "approved", + "xdm:reviewStatusReasons": [], "xdm:deliveryStatus": "active", "xdm:isPinDeleted": false, "xdm:isRemovable": true, - "xdm:creativeDetails": { - "xdm:creativeID": "creative_img_456789123", - "xdm:creativeName": "Holiday Sale - Hero Image", - "xdm:creativeType": "image", - "xdm:creativeFormat": "feed_image", - "xdm:creativeVersion": "v1.0", - "xdm:creativeTemplate": "image_standard", - "xdm:dynamicCreative": true, - "xdm:personalized": true, - "xdm:localized": true, - "xdm:locale": "en_US", - "xdm:brandID": "brand_acme_123", - "xdm:campaignTheme": "holiday_2025" - }, - "xdm:adReviewDetails": { - "xdm:reviewStatus": "approved", - "xdm:reviewDate": "2025-11-08T09:15:00Z", - "xdm:reviewerID": "meta_reviewer_789", - "xdm:reviewNotes": "Approved - meets all policy requirements", - "xdm:policyViolations": [], - "xdm:appealStatus": "not_applicable", - "xdm:lastModifiedDate": "2025-11-08T08:00:00Z", - "xdm:autoApproved": true, - "xdm:requiresManualReview": false - }, - "xdm:deliveryDetails": { - "xdm:deliveryStatus": "active", - "xdm:effectiveStatus": "active", - "xdm:servingStatus": "CAMPAIGN_STATUS_ENABLED", - "xdm:pacing": "standard", - "xdm:deliveryEstimate": "excellent", - "xdm:learningPhase": "learning", - "xdm:lastDeliveryCheck": "2025-11-10T08:30:00Z", - "xdm:estimatedDailyReach": 85000, - "xdm:saturationLevel": "low" - }, + "xdm:payingAdvertiserName": "Acme Corporation", "xdm:socialMediaProperties": { - "xdm:postID": "post_123456789_111222333", - "xdm:pageID": "page_acmecorp_official", - "xdm:instagramAccountID": "ig_acmecorp", - "xdm:allowComments": true, - "xdm:allowSharing": true, - "xdm:allowLikes": true, - "xdm:commentCount": 543, - "xdm:shareCount": 234, - "xdm:likeCount": 4567, - "xdm:reactionCount": 5123, - "xdm:saveCount": 789, - "xdm:hideCount": 12, - "xdm:reportCount": 1, - "xdm:organicImpressions": 23000, - "xdm:organicReach": 18000, - "xdm:viralImpressions": 8000, - "xdm:viralReach": 6000 - }, - "xdm:callToAction": { - "xdm:type": "shop_now", - "xdm:text": "Shop Now", - "xdm:url": "https://shop.acmecorp.com/holiday-sale?utm_source=facebook&utm_medium=image&utm_campaign=holiday2025", - "xdm:displayUrl": "shop.acmecorp.com/holiday-sale", - "xdm:deepLink": "acmecorp://shop/holiday-sale", - "xdm:trackingTemplate": "https://track.acmecorp.com/click?ad={ad_id}&placement={placement}&creative={creative_id}", - "xdm:utmParameters": { - "xdm:source": "facebook", - "xdm:medium": "image", - "xdm:campaign": "holiday2025", - "xdm:content": "hero_image", - "xdm:term": "holiday_sale" - } - }, - "xdm:linkProperties": { - "xdm:destinationURL": "https://shop.acmecorp.com/holiday-sale", - "xdm:displayURL": "shop.acmecorp.com", - "xdm:urlTags": "utm_source=facebook&utm_medium=image&utm_campaign=holiday2025", - "xdm:trackingPixels": [ - "https://track.acmecorp.com/impression?ad=img_456789123", - "https://analytics.acmecorp.com/pixel?type=view&id=holiday2025" - ], - "xdm:clickTrackers": [ - "https://track.acmecorp.com/click?ad=img_456789123", - "https://analytics.acmecorp.com/pixel?type=click&id=holiday2025" - ], - "xdm:conversionTracking": true, - "xdm:conversionPixelID": "pixel_123456789" - }, - "xdm:appProperties": { - "xdm:appID": "app_456789123", - "xdm:appName": "Acme Shopping", - "xdm:appPlatform": "android", - "xdm:appStoreURL": "https://play.google.com/store/apps/details?id=com.acmecorp.shopping", - "xdm:appDeepLink": "acmecorp://shop/holiday-sale", - "xdm:appEventTracking": true, - "xdm:appEventName": "add_to_cart", - "xdm:sdkVersion": "9.2.1" - }, - "xdm:leadGenProperties": { - "xdm:formID": "form_not_applicable", - "xdm:formType": "not_applicable", - "xdm:instantForm": false, - "xdm:privacyPolicyURL": "https://www.acmecorp.com/privacy", - "xdm:customDisclaimer": "By submitting, you agree to receive promotional emails from Acme Corp." - }, - "xdm:interactionProperties": { - "xdm:allowInteraction": true, - "xdm:interactionType": "click_to_website", - "xdm:swipeUpEnabled": false, - "xdm:pollEnabled": false, - "xdm:quizEnabled": false, - "xdm:gamificationEnabled": false, - "xdm:arEnabled": false, - "xdm:threeDEnabled": false + "xdm:effectiveObjectStoryID": "post_123456789_111222333", + "xdm:sourceInstagramMediaID": "ig_acmecorp_media_111222333", + "xdm:isShareable": true, + "xdm:favoriteDisplayMode": "default" }, "xdm:additionalDetails": [ { diff --git a/components/fieldgroups/paid-media/core-paid-media-ad-details.example.3.json b/components/fieldgroups/paid-media/core-paid-media-ad-details.example.3.json index fb3ad64a0..3e4718534 100644 --- a/components/fieldgroups/paid-media/core-paid-media-ad-details.example.3.json +++ b/components/fieldgroups/paid-media/core-paid-media-ad-details.example.3.json @@ -2,122 +2,16 @@ "xdm:paidMedia": { "xdm:adDetails": { "xdm:adType": "carousel", - "xdm:adFormat": "carousel_ad", "xdm:reviewStatus": "approved", + "xdm:reviewStatusReasons": [], "xdm:deliveryStatus": "active", "xdm:isPinDeleted": false, "xdm:isRemovable": true, - "xdm:creativeDetails": { - "xdm:creativeID": "creative_car_789456123", - "xdm:creativeName": "Product Showcase - 5 Card Carousel", - "xdm:creativeType": "carousel", - "xdm:creativeFormat": "carousel_feed", - "xdm:creativeVersion": "v3.2", - "xdm:creativeTemplate": "carousel_product", - "xdm:dynamicCreative": false, - "xdm:personalized": true, - "xdm:localized": true, - "xdm:locale": "en_US", - "xdm:brandID": "brand_acme_123", - "xdm:campaignTheme": "product_showcase_2025" - }, - "xdm:adReviewDetails": { - "xdm:reviewStatus": "approved", - "xdm:reviewDate": "2025-11-07T16:45:00Z", - "xdm:reviewerID": "meta_reviewer_321", - "xdm:reviewNotes": "All carousel cards approved - complies with commerce policies", - "xdm:policyViolations": [], - "xdm:appealStatus": "not_applicable", - "xdm:lastModifiedDate": "2025-11-07T15:30:00Z", - "xdm:autoApproved": false, - "xdm:requiresManualReview": true - }, - "xdm:deliveryDetails": { - "xdm:deliveryStatus": "active", - "xdm:effectiveStatus": "active", - "xdm:servingStatus": "CAMPAIGN_STATUS_ENABLED", - "xdm:pacing": "accelerated", - "xdm:deliveryEstimate": "good", - "xdm:learningPhase": "completed", - "xdm:lastDeliveryCheck": "2025-11-10T09:00:00Z", - "xdm:estimatedDailyReach": 95000, - "xdm:saturationLevel": "medium" - }, + "xdm:payingAdvertiserName": "Acme Corporation", "xdm:socialMediaProperties": { - "xdm:postID": "post_123456789_444555666", - "xdm:pageID": "page_acmecorp_official", - "xdm:instagramAccountID": "ig_acmecorp", - "xdm:allowComments": true, - "xdm:allowSharing": true, - "xdm:allowLikes": true, - "xdm:commentCount": 892, - "xdm:shareCount": 456, - "xdm:likeCount": 6789, - "xdm:reactionCount": 7234, - "xdm:saveCount": 1234, - "xdm:hideCount": 18, - "xdm:reportCount": 3, - "xdm:organicImpressions": 34000, - "xdm:organicReach": 26000, - "xdm:viralImpressions": 15000, - "xdm:viralReach": 11000 - }, - "xdm:callToAction": { - "xdm:type": "shop_now", - "xdm:text": "Shop Now", - "xdm:url": "https://shop.acmecorp.com/products?utm_source=facebook&utm_medium=carousel&utm_campaign=showcase2025", - "xdm:displayUrl": "shop.acmecorp.com/products", - "xdm:deepLink": "acmecorp://products/showcase", - "xdm:trackingTemplate": "https://track.acmecorp.com/click?ad={ad_id}&card={card_id}&placement={placement}", - "xdm:utmParameters": { - "xdm:source": "facebook", - "xdm:medium": "carousel", - "xdm:campaign": "showcase2025", - "xdm:content": "5_card_carousel", - "xdm:term": "product_showcase" - } - }, - "xdm:linkProperties": { - "xdm:destinationURL": "https://shop.acmecorp.com/products", - "xdm:displayURL": "shop.acmecorp.com", - "xdm:urlTags": "utm_source=facebook&utm_medium=carousel&utm_campaign=showcase2025", - "xdm:trackingPixels": [ - "https://track.acmecorp.com/impression?ad=car_789456123", - "https://analytics.acmecorp.com/pixel?type=view&id=showcase2025" - ], - "xdm:clickTrackers": [ - "https://track.acmecorp.com/click?ad=car_789456123", - "https://analytics.acmecorp.com/pixel?type=click&id=showcase2025" - ], - "xdm:conversionTracking": true, - "xdm:conversionPixelID": "pixel_123456789" - }, - "xdm:appProperties": { - "xdm:appID": "app_456789123", - "xdm:appName": "Acme Shopping", - "xdm:appPlatform": "ios", - "xdm:appStoreURL": "https://apps.apple.com/app/acme-shopping/id123456789", - "xdm:appDeepLink": "acmecorp://products/showcase", - "xdm:appEventTracking": true, - "xdm:appEventName": "view_content", - "xdm:sdkVersion": "9.2.1" - }, - "xdm:leadGenProperties": { - "xdm:formID": "form_not_applicable", - "xdm:formType": "not_applicable", - "xdm:instantForm": false, - "xdm:privacyPolicyURL": "https://www.acmecorp.com/privacy", - "xdm:customDisclaimer": "By submitting, you agree to receive product updates from Acme Corp." - }, - "xdm:interactionProperties": { - "xdm:allowInteraction": true, - "xdm:interactionType": "carousel_swipe", - "xdm:swipeUpEnabled": false, - "xdm:pollEnabled": false, - "xdm:quizEnabled": false, - "xdm:gamificationEnabled": false, - "xdm:arEnabled": false, - "xdm:threeDEnabled": false + "xdm:effectiveObjectStoryID": "post_123456789_444555666", + "xdm:isShareable": true, + "xdm:favoriteDisplayMode": "default" }, "xdm:additionalDetails": [ { diff --git a/components/fieldgroups/paid-media/core-paid-media-adgroup-details.example.1.json b/components/fieldgroups/paid-media/core-paid-media-adgroup-details.example.1.json index 5081c3e92..ddcca3362 100644 --- a/components/fieldgroups/paid-media/core-paid-media-adgroup-details.example.1.json +++ b/components/fieldgroups/paid-media/core-paid-media-adgroup-details.example.1.json @@ -4,94 +4,20 @@ "xdm:adGroupType": "standard", "xdm:childAdType": "video", "xdm:budgetSettings": { - "xdm:budgetType": "daily", - "xdm:dailyBudget": 500, - "xdm:lifetimeBudget": 0, - "xdm:budgetRemaining": 350, - "xdm:budgetSpent": 150, - "xdm:budgetUtilization": 0.3, - "xdm:pacing": "standard", - "xdm:pacingType": "standard", - "xdm:budgetOptimization": false, - "xdm:sharedBudget": false, - "xdm:budgetResetTime": "00:00:00", - "xdm:budgetTimezone": "America/Los_Angeles" - }, - "xdm:targetingSettings": { - "xdm:geoTargeting": { - "xdm:countries": ["US"], - "xdm:regions": ["California", "New York", "Texas", "Florida"], - "xdm:cities": [ - "San Francisco", - "Los Angeles", - "New York", - "Austin", - "Miami" - ], - "xdm:postalCodes": [], - "xdm:dmas": ["807", "501", "803"], - "xdm:radius": 0, - "xdm:radiusUnit": "mile", - "xdm:locationType": "home" - }, - "xdm:demographicTargeting": { - "xdm:ageMin": 25, - "xdm:ageMax": 54, - "xdm:genders": ["male", "female"], - "xdm:languages": ["en"], - "xdm:education": ["college", "grad_school"], - "xdm:relationshipStatus": [], - "xdm:workEmployers": [], - "xdm:workPositions": ["manager", "director", "executive"] - }, - "xdm:interestTargeting": { - "xdm:interests": [ - "Technology", - "Business", - "Innovation", - "Entrepreneurship" - ], - "xdm:behaviors": [ - "Early technology adopters", - "Business decision makers" - ], - "xdm:lifeEvents": [] - }, - "xdm:audienceTargeting": { - "xdm:customAudiences": [ - "audience_website_visitors_30d", - "audience_app_users" - ], - "xdm:lookalikeSources": ["audience_purchasers_90d"], - "xdm:lookalikeSimilarity": 0.05, - "xdm:excludedAudiences": ["audience_existing_customers"], - "xdm:audienceExpansion": true, - "xdm:detailedTargeting": "expansion_all" - }, - "xdm:deviceTargeting": { - "xdm:devices": ["mobile", "desktop"], - "xdm:platforms": ["ios", "android", "windows", "mac"], - "xdm:osVersions": [], - "xdm:deviceModels": [], - "xdm:connectionTypes": ["wifi", "cellular"] - } + "xdm:budgetInMicroCurrency": 500000000, + "xdm:bidInMicroCurrency": 1250000, + "xdm:bidStrategyType": "lowest_cost", + "xdm:targetCpa": 25.5, + "xdm:targetRoas": 3.5, + "xdm:roasValueMicro": 3500000 }, "xdm:optimizationSettings": { - "xdm:optimizationGoal": "link_clicks", - "xdm:billingEvent": "impressions", - "xdm:bidStrategy": "lowest_cost_without_cap", - "xdm:bidAmount": 0, - "xdm:bidCap": 0, - "xdm:costCap": 0, - "xdm:roas": 0, - "xdm:optimizationEvent": "LINK_CLICK", "xdm:conversionWindow": "7d_click_1d_view", - "xdm:attributionSetting": "7_day_click_1_day_view", - "xdm:deliveryType": "standard", - "xdm:campaignBudgetOptimization": false + "xdm:isAutoTargetingEnabled": true, + "xdm:isCampaignOptimization": false }, "xdm:placementSettings": { - "xdm:placementType": "automatic", + "xdm:placementGroup": "automatic_placements", "xdm:placements": [ "facebook_feed", "instagram_feed", @@ -106,71 +32,26 @@ "audience_network_interstitial", "audience_network_rewarded_video" ], - "xdm:excludedPlacements": [], - "xdm:publisherPlatforms": [ - "facebook", - "instagram", - "messenger", - "audience_network" - ], - "xdm:devicePlatforms": ["mobile", "desktop"], - "xdm:facebookPositions": [ - "feed", - "marketplace", - "video_feeds", - "right_column", - "instant_article", - "instream_video" - ], - "xdm:instagramPositions": ["stream", "story", "explore", "reels"], - "xdm:messengerPositions": ["messenger_home", "sponsored_messages"], - "xdm:audienceNetworkPositions": [ - "classic", - "instream_video", - "rewarded_video" - ] + "xdm:deviceTypes": ["mobile", "desktop"] }, "xdm:deliverySettings": { - "xdm:startTime": "2025-11-01T00:00:00Z", - "xdm:endTime": "2025-11-30T23:59:59Z", - "xdm:scheduleType": "continuous", - "xdm:dayParting": false, - "xdm:dayPartingSchedule": [], - "xdm:frequencyCap": { - "xdm:enabled": true, - "xdm:impressions": 3, - "xdm:period": "day" - }, - "xdm:deliveryEstimate": "good", - "xdm:learningPhase": "learning", - "xdm:minimumRoas": 0 + "xdm:pacingDeliveryType": "standard", + "xdm:deliveryConstraint": "none", + "xdm:deliveryStatus": "active", + "xdm:reachGoal": 125000, + "xdm:impressionGoal": 500000 }, "xdm:trackingSettings": { "xdm:pixelID": "pixel_123456789", - "xdm:conversionTracking": true, - "xdm:offlineConversionTracking": false, - "xdm:appEventTracking": true, - "xdm:urlParameters": "utm_source=facebook&utm_medium=paid&utm_campaign=fall2025&utm_content=video_adset", - "xdm:trackingSpecs": [ - { - "xdm:eventType": "LINK_CLICK", - "xdm:eventSource": "pixel", - "xdm:eventID": "pixel_123456789" - }, - { - "xdm:eventType": "PAGE_VIEW", - "xdm:eventSource": "pixel", - "xdm:eventID": "pixel_123456789" - } - ] + "xdm:measurementProviderNames": ["meta", "adobe"], + "xdm:eventSources": ["pixel", "app"], + "xdm:skadnetworkProperties": { + "xdm:status": "enrolled" + } }, - "xdm:brandSafetySettings": { - "xdm:blockLists": ["block_list_sensitive_content"], + "xdm:brandSafetyConfig": { "xdm:inventoryFilter": "standard", - "xdm:contentCategories": ["news", "entertainment", "technology"], - "xdm:excludedCategories": ["mature_content", "political"], - "xdm:publisherBlockLists": [], - "xdm:appBlockLists": [] + "xdm:blockedCategories": ["mature_content", "political"] }, "xdm:additionalDetails": [ { diff --git a/components/fieldgroups/paid-media/core-paid-media-asset-details.example.1.json b/components/fieldgroups/paid-media/core-paid-media-asset-details.example.1.json index 631d9b365..1519d22a6 100644 --- a/components/fieldgroups/paid-media/core-paid-media-asset-details.example.1.json +++ b/components/fieldgroups/paid-media/core-paid-media-asset-details.example.1.json @@ -2,111 +2,43 @@ "xdm:paidMedia": { "xdm:assetDetails": { "xdm:assetType": "video", - "xdm:title": "Fall Product Launch - 30 Second Hero Video", - "xdm:description": "Introducing our latest product innovation with stunning visuals and compelling storytelling. Features product benefits, customer testimonials, and call-to-action.", + "xdm:assetSubType": "mp4", + "title": "Fall Product Launch - 30 Second Hero Video", + "description": "Introducing our latest product innovation with stunning visuals and compelling storytelling. Features product benefits, customer testimonials, and call-to-action.", + "xdm:content": "", "xdm:mediaProperties": { "xdm:url": "https://cdn.acmecorp.com/videos/fall-launch-hero-30s.mp4", - "xdm:thumbnailUrl": "https://cdn.acmecorp.com/videos/thumbnails/fall-launch-hero-30s.jpg", - "xdm:previewUrl": "https://cdn.acmecorp.com/videos/previews/fall-launch-hero-30s-preview.mp4", - "xdm:mimeType": "video/mp4", - "xdm:fileSize": 45678912, + "xdm:permalinkURL": "https://cdn.acmecorp.com/videos/fall-launch-hero-30s.mp4", + "xdm:thumbnailURL": "https://cdn.acmecorp.com/videos/thumbnails/fall-launch-hero-30s.jpg", + "xdm:source": "https://cdn.acmecorp.com/videos/fall-launch-hero-30s.mp4", + "xdm:hash": "sha256:abc123def456ghi789jkl012mno345pqr678stu901vwx234yz" + }, + "xdm:dimensions": { "xdm:width": 1920, "xdm:height": 1080, "xdm:aspectRatio": "16:9", - "xdm:orientation": "landscape", - "xdm:duration": 30, - "xdm:bitrate": 12000, - "xdm:frameRate": 30, - "xdm:codec": "h264", - "xdm:colorSpace": "sRGB", - "xdm:hasAudio": true, - "xdm:audioCodec": "aac", - "xdm:audioChannels": 2, - "xdm:audioBitrate": 128 + "xdm:orientation": "landscape" }, "xdm:fileProperties": { - "xdm:fileName": "fall-launch-hero-30s.mp4", - "xdm:fileHash": "sha256:abc123def456ghi789jkl012mno345pqr678stu901vwx234yz", - "xdm:uploadDate": "2025-10-28T14:30:00Z", - "xdm:lastModifiedDate": "2025-10-28T14:30:00Z", - "xdm:version": "1.0", - "xdm:source": "professional_production", - "xdm:uploadedBy": "user_creative_team_lead" + "xdm:fileSize": 45678912, + "xdm:fileSizeFormatted": "43.5 MB", + "xdm:mimeType": "video/mp4", + "xdm:fileExtension": "mp4", + "xdm:encoding": "h264" }, "xdm:videoProperties": { - "xdm:videoID": "video_987654321012345", - "xdm:videoFormat": "mp4", - "xdm:videoQuality": "hd", - "xdm:videoLength": 30, - "xdm:videoResolution": "1080p", - "xdm:videoOrientation": "landscape", - "xdm:hasSubtitles": true, - "xdm:subtitleLanguages": ["en", "es", "fr"], - "xdm:hasCaptions": true, - "xdm:captionLanguages": ["en"], - "xdm:soundOn": true, - "xdm:autoPlay": true, - "xdm:looping": false, - "xdm:thumbnailTimestamp": 5, - "xdm:videoStyle": "cinematic", - "xdm:videoTone": "inspirational", - "xdm:videoPacing": "fast", - "xdm:sceneCount": 8, - "xdm:transitionStyle": "smooth_cuts", - "xdm:colorGrading": "warm_vibrant", - "xdm:musicTrack": "upbeat_corporate", - "xdm:voiceOver": true, - "xdm:voiceOverLanguage": "en", - "xdm:textOverlays": true, - "xdm:brandLogoPresent": true, - "xdm:productShown": true, - "xdm:peopleShown": true, - "xdm:locationShown": false - }, - "xdm:creativeMetadata": { - "xdm:creativeID": "creative_vid_987654321", - "xdm:creativeName": "Fall Product Launch - 30s Video", - "xdm:creativeVersion": "v2.1", - "xdm:creativeStatus": "approved", - "xdm:creativeCategory": "product_video", - "xdm:creativeTheme": "fall_2025_launch", - "xdm:creativeConcept": "Innovation meets simplicity", - "xdm:targetAudience": "tech_enthusiasts_25_54", - "xdm:brandGuidelines": "compliant", - "xdm:legalApproval": true, - "xdm:legalApprovalDate": "2025-10-30T10:00:00Z", - "xdm:copyrightOwner": "Acme Corporation", - "xdm:licenseType": "owned", - "xdm:rightsExpiration": "perpetual", - "xdm:creativeAgency": "Acme In-House Creative", - "xdm:productionCompany": "Acme Studios", - "xdm:director": "Jane Creative", - "xdm:producer": "John Producer" - }, - "xdm:performanceHints": { - "xdm:recommendedPlacements": [ - "facebook_feed", - "instagram_feed", - "instagram_reels" - ], - "xdm:recommendedDevices": ["mobile", "desktop"], - "xdm:recommendedAudiences": ["tech_enthusiasts", "early_adopters"], - "xdm:estimatedEngagementRate": 0.08, - "xdm:estimatedCompletionRate": 0.65, - "xdm:qualityScore": 8.5, - "xdm:relevanceScore": 9.0, - "xdm:creativeFatigueRisk": "low", - "xdm:seasonality": "fall_winter" + "xdm:duration": 30, + "xdm:frameRate": 30, + "xdm:bitrate": 12000, + "xdm:codec": "h264", + "xdm:hasAudio": true, + "xdm:youtubeVideoID": "" }, - "xdm:accessibilityFeatures": { - "xdm:altText": "30-second video showcasing Acme's new product with dynamic visuals and customer testimonials", - "xdm:closedCaptions": true, - "xdm:audioDescription": false, - "xdm:transcriptAvailable": true, - "xdm:transcriptUrl": "https://cdn.acmecorp.com/videos/transcripts/fall-launch-hero-30s.txt", - "xdm:signLanguage": false, - "xdm:highContrast": false, - "xdm:wcagCompliance": "AA" + "xdm:usageMetadata": { + "xdm:usageCount": 5, + "xdm:lastUsedDate": "2025-11-10T08:00:00Z", + "xdm:associatedCampaigns": ["campaign_fall_2025_launch"], + "xdm:associatedAds": ["ad_vid_987654321", "ad_vid_987654322"] }, "xdm:additionalDetails": [ { diff --git a/components/fieldgroups/paid-media/core-paid-media-asset-details.example.2.json b/components/fieldgroups/paid-media/core-paid-media-asset-details.example.2.json index 4765b04d3..85028ab06 100644 --- a/components/fieldgroups/paid-media/core-paid-media-asset-details.example.2.json +++ b/components/fieldgroups/paid-media/core-paid-media-asset-details.example.2.json @@ -2,111 +2,41 @@ "xdm:paidMedia": { "xdm:assetDetails": { "xdm:assetType": "image", - "xdm:title": "Holiday Sale - Hero Banner Image", - "xdm:description": "Eye-catching hero banner featuring holiday sale messaging with product showcase and promotional offer. Optimized for feed and story placements.", + "xdm:assetSubType": "jpeg", + "title": "Holiday Sale - Hero Banner Image", + "description": "Eye-catching hero banner featuring holiday sale messaging with product showcase and promotional offer. Optimized for feed and story placements.", + "xdm:content": "", "xdm:mediaProperties": { "xdm:url": "https://cdn.acmecorp.com/images/holiday-sale-hero-banner.jpg", - "xdm:thumbnailUrl": "https://cdn.acmecorp.com/images/thumbnails/holiday-sale-hero-banner-thumb.jpg", - "xdm:previewUrl": "https://cdn.acmecorp.com/images/previews/holiday-sale-hero-banner-preview.jpg", - "xdm:mimeType": "image/jpeg", - "xdm:fileSize": 2456789, + "xdm:permalinkURL": "https://cdn.acmecorp.com/images/holiday-sale-hero-banner.jpg", + "xdm:thumbnailURL": "https://cdn.acmecorp.com/images/thumbnails/holiday-sale-hero-banner-thumb.jpg", + "xdm:source": "https://cdn.acmecorp.com/images/holiday-sale-hero-banner.jpg", + "xdm:hash": "sha256:xyz789abc456def123ghi890jkl567mno234pqr901stu678vwx345" + }, + "xdm:dimensions": { "xdm:width": 1200, "xdm:height": 628, "xdm:aspectRatio": "1.91:1", - "xdm:orientation": "landscape", - "xdm:duration": 0, - "xdm:bitrate": 0, - "xdm:frameRate": 0, - "xdm:codec": "jpeg", - "xdm:colorSpace": "sRGB", - "xdm:hasAudio": false, - "xdm:audioCodec": "", - "xdm:audioChannels": 0, - "xdm:audioBitrate": 0 + "xdm:orientation": "landscape" }, "xdm:fileProperties": { - "xdm:fileName": "holiday-sale-hero-banner.jpg", - "xdm:fileHash": "sha256:xyz789abc456def123ghi890jkl567mno234pqr901stu678vwx345", - "xdm:uploadDate": "2025-11-01T09:00:00Z", - "xdm:lastModifiedDate": "2025-11-01T09:00:00Z", - "xdm:version": "1.0", - "xdm:source": "professional_design", - "xdm:uploadedBy": "user_design_team_lead" + "xdm:fileSize": 2456789, + "xdm:fileSizeFormatted": "2.3 MB", + "xdm:mimeType": "image/jpeg", + "xdm:fileExtension": "jpg", + "xdm:encoding": "jpeg" }, "xdm:imageProperties": { - "xdm:imageID": "image_456789123456789", - "xdm:imageFormat": "jpeg", - "xdm:imageQuality": "high", - "xdm:imageResolution": "1200x628", - "xdm:imageOrientation": "landscape", - "xdm:dpi": 72, - "xdm:colorProfile": "sRGB IEC61966-2.1", + "xdm:colorSpace": "sRGB", "xdm:hasTransparency": false, "xdm:isAnimated": false, - "xdm:frameCount": 1, - "xdm:compressionQuality": 90, - "xdm:imageStyle": "modern_clean", - "xdm:imageComposition": "rule_of_thirds", - "xdm:dominantColors": ["#FF6B35", "#004E89", "#FFFFFF"], - "xdm:colorPalette": "warm_vibrant", - "xdm:textOverlay": true, - "xdm:textPercentage": 15, - "xdm:brandLogoPresent": true, - "xdm:productShown": true, - "xdm:peopleShown": false, - "xdm:faceCount": 0, - "xdm:backgroundType": "solid_color", - "xdm:lightingStyle": "bright_even", - "xdm:photographyStyle": "product_photography" - }, - "xdm:creativeMetadata": { - "xdm:creativeID": "creative_img_456789123", - "xdm:creativeName": "Holiday Sale - Hero Banner", - "xdm:creativeVersion": "v1.0", - "xdm:creativeStatus": "approved", - "xdm:creativeCategory": "promotional_image", - "xdm:creativeTheme": "holiday_2025", - "xdm:creativeConcept": "Festive savings celebration", - "xdm:targetAudience": "value_shoppers_all_ages", - "xdm:brandGuidelines": "compliant", - "xdm:legalApproval": true, - "xdm:legalApprovalDate": "2025-11-01T08:00:00Z", - "xdm:copyrightOwner": "Acme Corporation", - "xdm:licenseType": "owned", - "xdm:rightsExpiration": "perpetual", - "xdm:creativeAgency": "Acme In-House Design", - "xdm:productionCompany": "Acme Creative Studio", - "xdm:director": "", - "xdm:producer": "Sarah Designer" - }, - "xdm:performanceHints": { - "xdm:recommendedPlacements": [ - "facebook_feed", - "instagram_feed", - "facebook_marketplace" - ], - "xdm:recommendedDevices": ["mobile", "desktop"], - "xdm:recommendedAudiences": [ - "shoppers", - "deal_seekers", - "holiday_shoppers" - ], - "xdm:estimatedEngagementRate": 0.06, - "xdm:estimatedCompletionRate": 1.0, - "xdm:qualityScore": 9.0, - "xdm:relevanceScore": 8.5, - "xdm:creativeFatigueRisk": "medium", - "xdm:seasonality": "holiday_season" + "xdm:dominantColors": ["#FF6B35", "#004E89", "#FFFFFF"] }, - "xdm:accessibilityFeatures": { - "xdm:altText": "Holiday sale banner featuring 40% off promotion with festive red and blue color scheme and product images", - "xdm:closedCaptions": false, - "xdm:audioDescription": false, - "xdm:transcriptAvailable": false, - "xdm:transcriptUrl": "", - "xdm:signLanguage": false, - "xdm:highContrast": false, - "xdm:wcagCompliance": "AA" + "xdm:usageMetadata": { + "xdm:usageCount": 3, + "xdm:lastUsedDate": "2025-11-10T09:00:00Z", + "xdm:associatedCampaigns": ["campaign_holiday_2025"], + "xdm:associatedAds": ["ad_img_456789123"] }, "xdm:additionalDetails": [ { diff --git a/components/fieldgroups/paid-media/core-paid-media-asset-details.example.3.json b/components/fieldgroups/paid-media/core-paid-media-asset-details.example.3.json index 66eaf6d47..30e49764f 100644 --- a/components/fieldgroups/paid-media/core-paid-media-asset-details.example.3.json +++ b/components/fieldgroups/paid-media/core-paid-media-asset-details.example.3.json @@ -2,44 +2,28 @@ "xdm:paidMedia": { "xdm:assetDetails": { "xdm:assetType": "lead_form", - "xdm:title": "Product Demo Request - Instant Form", - "xdm:description": "Lead generation form for product demo requests. Collects contact information and company details for sales follow-up.", + "xdm:assetSubType": "instant_form", + "title": "Product Demo Request - Instant Form", + "description": "Lead generation form for product demo requests. Collects contact information and company details for sales follow-up.", + "xdm:content": "", "xdm:mediaProperties": { "xdm:url": "", - "xdm:thumbnailUrl": "", - "xdm:previewUrl": "", - "xdm:mimeType": "application/json", - "xdm:fileSize": 0, - "xdm:width": 0, - "xdm:height": 0, - "xdm:aspectRatio": "", - "xdm:orientation": "", - "xdm:duration": 0, - "xdm:bitrate": 0, - "xdm:frameRate": 0, - "xdm:codec": "", - "xdm:colorSpace": "", - "xdm:hasAudio": false, - "xdm:audioCodec": "", - "xdm:audioChannels": 0, - "xdm:audioBitrate": 0 + "xdm:permalinkURL": "", + "xdm:thumbnailURL": "", + "xdm:source": "", + "xdm:hash": "" }, "xdm:fileProperties": { - "xdm:fileName": "product-demo-request-form.json", - "xdm:fileHash": "", - "xdm:uploadDate": "2025-10-25T11:00:00Z", - "xdm:lastModifiedDate": "2025-11-02T14:30:00Z", - "xdm:version": "2.3", - "xdm:source": "meta_lead_ads", - "xdm:uploadedBy": "user_marketing_ops" + "xdm:fileSize": 0, + "xdm:fileSizeFormatted": "0 B", + "xdm:mimeType": "application/json", + "xdm:fileExtension": "json", + "xdm:encoding": "" }, "xdm:leadFormProperties": { "xdm:formID": "form_lead_789123456", "xdm:formName": "Product Demo Request Form", "xdm:formType": "instant_form", - "xdm:formVersion": "2.3", - "xdm:formStatus": "active", - "xdm:formLanguage": "en_US", "xdm:formFields": [ { "xdm:fieldName": "full_name", @@ -121,86 +105,14 @@ ] } ], - "xdm:customQuestions": [ - { - "xdm:questionText": "What is your primary business challenge?", - "xdm:questionType": "multiple_choice", - "xdm:required": false, - "xdm:options": [ - "Scaling operations", - "Improving efficiency", - "Reducing costs", - "Increasing revenue", - "Other" - ] - } - ], - "xdm:privacyPolicy": { - "xdm:url": "https://www.acmecorp.com/privacy", - "xdm:text": "By submitting this form, you agree to our Privacy Policy and Terms of Service." - }, - "xdm:customDisclaimer": "We respect your privacy. Your information will only be used to contact you about our products and services.", - "xdm:thankYouScreen": { - "xdm:headline": "Thank you for your interest!", - "xdm:description": "A member of our team will contact you within 24 hours to schedule your personalized demo.", - "xdm:ctaButton": { - "xdm:text": "Visit Our Website", - "xdm:url": "https://www.acmecorp.com" - } - }, - "xdm:completionTracking": true, - "xdm:partialSubmissionTracking": false, - "xdm:fieldValidation": true, - "xdm:spamProtection": true, - "xdm:duplicateDetection": true - }, - "xdm:creativeMetadata": { - "xdm:creativeID": "creative_form_789123456", - "xdm:creativeName": "Product Demo Request Form", - "xdm:creativeVersion": "v2.3", - "xdm:creativeStatus": "approved", - "xdm:creativeCategory": "lead_generation_form", - "xdm:creativeTheme": "b2b_lead_gen", - "xdm:creativeConcept": "Frictionless demo request", - "xdm:targetAudience": "b2b_decision_makers", - "xdm:brandGuidelines": "compliant", - "xdm:legalApproval": true, - "xdm:legalApprovalDate": "2025-10-25T10:00:00Z", - "xdm:copyrightOwner": "Acme Corporation", - "xdm:licenseType": "owned", - "xdm:rightsExpiration": "perpetual", - "xdm:creativeAgency": "Acme Marketing Ops", - "xdm:productionCompany": "", - "xdm:director": "", - "xdm:producer": "Mike Marketing" - }, - "xdm:performanceHints": { - "xdm:recommendedPlacements": [ - "facebook_feed", - "instagram_feed", - "messenger_inbox" - ], - "xdm:recommendedDevices": ["mobile", "desktop"], - "xdm:recommendedAudiences": [ - "b2b_decision_makers", - "enterprise_buyers" - ], - "xdm:estimatedEngagementRate": 0.12, - "xdm:estimatedCompletionRate": 0.75, - "xdm:qualityScore": 8.0, - "xdm:relevanceScore": 9.0, - "xdm:creativeFatigueRisk": "low", - "xdm:seasonality": "year_round" + "xdm:privacyPolicyURL": "https://www.acmecorp.com/privacy", + "xdm:customDisclaimer": "We respect your privacy. Your information will only be used to contact you about our products and services." }, - "xdm:accessibilityFeatures": { - "xdm:altText": "Lead generation form for requesting a product demo", - "xdm:closedCaptions": false, - "xdm:audioDescription": false, - "xdm:transcriptAvailable": false, - "xdm:transcriptUrl": "", - "xdm:signLanguage": false, - "xdm:highContrast": false, - "xdm:wcagCompliance": "AA" + "xdm:usageMetadata": { + "xdm:usageCount": 8, + "xdm:lastUsedDate": "2025-11-10T10:00:00Z", + "xdm:associatedCampaigns": ["campaign_b2b_lead_gen_2025"], + "xdm:associatedAds": ["ad_form_789123456"] }, "xdm:additionalDetails": [ { diff --git a/components/fieldgroups/paid-media/core-paid-media-attribution-metrics.example.1.json b/components/fieldgroups/paid-media/core-paid-media-attribution-metrics.example.1.json index cbeb5acbc..d81391a82 100644 --- a/components/fieldgroups/paid-media/core-paid-media-attribution-metrics.example.1.json +++ b/components/fieldgroups/paid-media/core-paid-media-attribution-metrics.example.1.json @@ -4,6 +4,7 @@ "xdm:attributionModel": "DATA_DRIVEN", "xdm:clickAttributionWindow": "30_DAY", "xdm:viewAttributionWindow": "1_DAY", + "xdm:engagementAttributionWindow": "7_DAY", "xdm:crossDeviceAttribution": { "xdm:enabled": true, "xdm:crossDeviceConversions": { @@ -30,149 +31,81 @@ } } }, - "xdm:attributionSettings": { - "xdm:primaryModel": "data_driven", - "xdm:comparisonModels": [ - "last_click", - "first_click", - "linear", - "time_decay", - "position_based" - ], - "xdm:clickWindow": "30d", - "xdm:viewWindow": "1d", - "xdm:engagementWindow": "7d", - "xdm:conversionLagDays": 3, - "xdm:crossDevice": true, - "xdm:crossChannel": true, - "xdm:deduplication": true, - "xdm:deduplicationWindow": "24h" + "xdm:attributionWeight": { + "xdm:value": 0.85 }, - "xdm:attributionBreakdown": { - "xdm:dataDrivernAttribution": { - "xdm:conversions": 1250, - "xdm:conversionValue": 187500, - "xdm:attributedRevenue": 187500, - "xdm:attributionPercentage": 1.0 - }, - "xdm:lastClickAttribution": { - "xdm:conversions": 980, - "xdm:conversionValue": 147000, - "xdm:attributedRevenue": 147000, - "xdm:attributionPercentage": 0.784 - }, - "xdm:firstClickAttribution": { - "xdm:conversions": 1450, - "xdm:conversionValue": 217500, - "xdm:attributedRevenue": 217500, - "xdm:attributionPercentage": 1.16 - }, - "xdm:linearAttribution": { - "xdm:conversions": 1180, - "xdm:conversionValue": 177000, - "xdm:attributedRevenue": 177000, - "xdm:attributionPercentage": 0.944 - }, - "xdm:timeDecayAttribution": { - "xdm:conversions": 1100, - "xdm:conversionValue": 165000, - "xdm:attributedRevenue": 165000, - "xdm:attributionPercentage": 0.88 - }, - "xdm:positionBasedAttribution": { - "xdm:conversions": 1220, - "xdm:conversionValue": 183000, - "xdm:attributedRevenue": 183000, - "xdm:attributionPercentage": 0.976 - } + "xdm:touchpointPosition": "middle", + "xdm:touchpointSequence": 3, + "xdm:totalTouchpoints": { + "xdm:value": 4 }, - "xdm:touchpointAnalysis": { - "xdm:averageTouchpoints": 4.2, - "xdm:medianTouchpoints": 3, - "xdm:maxTouchpoints": 15, - "xdm:singleTouchConversions": 180, - "xdm:multiTouchConversions": 1070, - "xdm:assistedConversions": 890, - "xdm:directConversions": 360, - "xdm:touchpointDistribution": { - "xdm:firstTouch": 0.28, - "xdm:midTouch": 0.45, - "xdm:lastTouch": 0.27 - }, - "xdm:averageTimeBetweenTouchpoints": 2.5, - "xdm:averageTimeToConversion": 8.3 + "xdm:pathLength": { + "xdm:value": 8.3 }, - "xdm:channelAttribution": { - "xdm:paidSocial": { - "xdm:touchpoints": 3250, - "xdm:conversions": 625, - "xdm:conversionValue": 93750, - "xdm:attributionCredit": 0.5, - "xdm:assistedConversions": 445, - "xdm:lastTouchConversions": 180 - }, - "xdm:paidSearch": { - "xdm:touchpoints": 2100, - "xdm:conversions": 375, - "xdm:conversionValue": 56250, - "xdm:attributionCredit": 0.3, - "xdm:assistedConversions": 265, - "xdm:lastTouchConversions": 110 - }, - "xdm:display": { - "xdm:touchpoints": 1850, - "xdm:conversions": 125, - "xdm:conversionValue": 18750, - "xdm:attributionCredit": 0.1, - "xdm:assistedConversions": 95, - "xdm:lastTouchConversions": 30 - }, - "xdm:email": { - "xdm:touchpoints": 950, - "xdm:conversions": 125, - "xdm:conversionValue": 18750, - "xdm:attributionCredit": 0.1, - "xdm:assistedConversions": 85, - "xdm:lastTouchConversions": 40 + "xdm:timeToConversion": { + "xdm:value": 199.2 + }, + "xdm:attributionConfidence": { + "xdm:value": 0.92 + }, + "xdm:incrementalImpact": { + "xdm:value": 0.7 + }, + "xdm:baselineConversions": { + "xdm:value": 375 + }, + "xdm:incrementalConversions": { + "xdm:value": 875 + }, + "xdm:liftPercentage": { + "xdm:value": 2.33 + }, + "xdm:attributionMethodology": { + "xdm:algorithmType": "data_driven", + "xdm:modelVersion": "v3.2", + "xdm:trainingPeriod": "90_days", + "xdm:dataQuality": { + "xdm:value": 0.95 + }, + "xdm:sampleSize": { + "xdm:value": 100000 } }, - "xdm:conversionPath": { - "xdm:topPaths": [ + "xdm:crossChannelAttribution": { + "xdm:channelContribution": { + "xdm:value": 0.5 + }, + "xdm:channelSequence": [ { - "xdm:pathSequence": "Paid Social > Paid Search > Email > Paid Social", - "xdm:conversions": 145, - "xdm:conversionValue": 21750, - "xdm:averageTimeToConversion": 12.5, - "xdm:pathLength": 4 + "xdm:channel": "paid_social", + "xdm:position": 1, + "xdm:weight": { + "xdm:value": 0.28 + } }, { - "xdm:pathSequence": "Paid Social > Display > Paid Social", - "xdm:conversions": 120, - "xdm:conversionValue": 18000, - "xdm:averageTimeToConversion": 8.2, - "xdm:pathLength": 3 + "xdm:channel": "paid_search", + "xdm:position": 2, + "xdm:weight": { + "xdm:value": 0.22 + } }, { - "xdm:pathSequence": "Paid Social > Paid Social", - "xdm:conversions": 95, - "xdm:conversionValue": 14250, - "xdm:averageTimeToConversion": 5.1, - "xdm:pathLength": 2 + "xdm:channel": "email", + "xdm:position": 3, + "xdm:weight": { + "xdm:value": 0.15 + } + }, + { + "xdm:channel": "paid_social", + "xdm:position": 4, + "xdm:weight": { + "xdm:value": 0.35 + } } ], - "xdm:pathComplexity": "medium", - "xdm:averagePathLength": 4.2, - "xdm:mostCommonFirstTouch": "paid_social", - "xdm:mostCommonLastTouch": "paid_social" - }, - "xdm:incrementalityMetrics": { - "xdm:incrementalConversions": 875, - "xdm:incrementalityRate": 0.7, - "xdm:baselineConversions": 375, - "xdm:liftPercentage": 2.33, - "xdm:incrementalROAS": 4.2, - "xdm:controlGroupSize": 50000, - "xdm:testGroupSize": 50000 + "xdm:dominantChannel": "paid_social" }, "xdm:additionalDetails": [ { diff --git a/components/fieldgroups/paid-media/core-paid-media-campaign-details.example.1.json b/components/fieldgroups/paid-media/core-paid-media-campaign-details.example.1.json index 171269a13..1a56a6039 100644 --- a/components/fieldgroups/paid-media/core-paid-media-campaign-details.example.1.json +++ b/components/fieldgroups/paid-media/core-paid-media-campaign-details.example.1.json @@ -7,67 +7,36 @@ "xdm:promotedObject": { "xdm:objectType": "page", "xdm:objectID": "page_acmecorp_official", - "xdm:pageID": "123456789012345", - "xdm:pixelID": "pixel_123456789", - "xdm:customEventType": "LINK_CLICK", - "xdm:applicationID": "app_456789123", - "xdm:productCatalogID": "catalog_987654321", - "xdm:productSetID": "product_set_123456", - "xdm:offlineConversionDataSetID": "", - "xdm:destinationURL": "https://www.acmecorp.com/fall-launch" + "xdm:objectName": "Acme Corp Official Page", + "xdm:objectURL": "https://www.acmecorp.com/fall-launch" }, "xdm:budgetSettings": { - "xdm:budgetType": "daily", - "xdm:dailyBudget": 2000, - "xdm:lifetimeBudget": 0, - "xdm:totalBudget": 60000, - "xdm:budgetRemaining": 42500, - "xdm:budgetSpent": 17500, - "xdm:budgetUtilization": 0.292, - "xdm:pacing": "standard", - "xdm:pacingType": "standard", - "xdm:campaignBudgetOptimization": true, - "xdm:cboEnabled": true, - "xdm:budgetRebalancing": true, + "xdm:isCampaignBudgetOptimization": true, "xdm:spendCap": 2500, - "xdm:bidCap": 0, - "xdm:costCap": 0 - }, - "xdm:targetingStrategy": { - "xdm:targetingExpansion": true, - "xdm:detailedTargetingExpansion": "expansion_all", - "xdm:advantagePlusAudience": false, - "xdm:advantagePlusCreative": false, - "xdm:advantagePlusCatalog": false, - "xdm:lookalikExpansion": true, - "xdm:automaticPlacements": true, - "xdm:dynamicCreative": false + "xdm:bidStrategy": "LOWEST_COST_WITHOUT_CAP", + "xdm:bidAmount": 0 }, - "xdm:schedulingSettings": { - "xdm:startDate": "2025-11-01T00:00:00Z", - "xdm:endDate": "2025-11-30T23:59:59Z", - "xdm:scheduleType": "continuous", - "xdm:runContinuously": false, - "xdm:dayParting": false, - "xdm:dayPartingSchedule": [], - "xdm:timezone": "America/Los_Angeles", + "xdm:scheduling": { + "xdm:isAlwaysOn": false, "xdm:flightDates": [ { "xdm:startDate": "2025-11-01T00:00:00Z", - "xdm:endDate": "2025-11-30T23:59:59Z" + "xdm:endDate": "2025-11-30T23:59:59Z", + "xdm:budget": 60000 } - ] + ], + "xdm:dayParting": { + "xdm:enabled": false, + "xdm:schedule": [] + } }, "xdm:frequencyCapping": { "xdm:enabled": true, "xdm:impressionCap": 5, - "xdm:timePeriod": "week", - "xdm:timePeriodDays": 7, - "xdm:applyToAllAdSets": true, - "xdm:resetFrequency": "weekly" + "xdm:timePeriod": "week" }, "xdm:conversionTracking": { - "xdm:pixelID": "pixel_123456789", + "xdm:pixelIDs": ["pixel_123456789"], "xdm:conversionEvents": [ "PageView", "ViewContent", @@ -75,67 +44,14 @@ "InitiateCheckout", "Purchase" ], - "xdm:customConversions": [ - { - "xdm:eventName": "ProductPageView", - "xdm:eventID": "custom_event_001", - "xdm:eventValue": 0 - }, - { - "xdm:eventName": "DemoRequest", - "xdm:eventID": "custom_event_002", - "xdm:eventValue": 50 - } - ], - "xdm:offlineConversions": false, - "xdm:serverSideTracking": true, - "xdm:conversionAPI": true, - "xdm:deduplication": true, "xdm:attributionWindow": "7d_click_1d_view" }, - "xdm:optimizationSettings": { - "xdm:objective": "OUTCOME_TRAFFIC", - "xdm:optimizationGoal": "LINK_CLICKS", - "xdm:billingEvent": "IMPRESSIONS", - "xdm:bidStrategy": "LOWEST_COST_WITHOUT_CAP", - "xdm:pacing": "standard", - "xdm:deliveryType": "standard", - "xdm:learningPhase": "learning", - "xdm:autoOptimization": true - }, - "xdm:ios14Settings": { - "xdm:campaignOptedIn": true, - "xdm:attOptimization": true, - "xdm:aggregatedEventMeasurement": true, - "xdm:prioritizedEvents": ["Purchase", "AddToCart", "ViewContent"], - "xdm:domainVerification": true, - "xdm:verifiedDomain": "acmecorp.com", - "xdm:skadnetworkEnabled": true, - "xdm:conversionValueSchema": "default" - }, - "xdm:brandSafety": { - "xdm:inventoryFilter": "standard", - "xdm:blockLists": ["block_list_sensitive_content"], - "xdm:contentCategories": [ - "news", - "entertainment", - "technology", - "business" - ], - "xdm:excludedCategories": ["mature_content", "political", "gambling"], - "xdm:publisherBlockLists": [], - "xdm:appBlockLists": [], - "xdm:brandSuitability": "standard" - }, - "xdm:creativeSettings": { - "xdm:dynamicCreative": false, - "xdm:multiAdvertiserAds": false, - "xdm:catalogAds": false, - "xdm:collectionAds": false, - "xdm:instantExperience": false, - "xdm:videoPolling": false, - "xdm:playableAds": false - }, + "xdm:ios14CampaignType": "REGULAR_CAMPAIGN", + "xdm:skanEnabled": true, + "xdm:skanPostbackWindow": "POSTBACK_WINDOW_MODE2", + "xdm:appProfilePageEnabled": false, + "xdm:catalogId": "catalog_987654321", + "xdm:productSetId": "product_set_123456", "xdm:additionalDetails": [ { "xdm:fieldName": "meta_campaign_id", diff --git a/components/fieldgroups/paid-media/core-paid-media-dimensional-breakdowns.example.1.json b/components/fieldgroups/paid-media/core-paid-media-dimensional-breakdowns.example.1.json index 60d725b70..12b25e2ea 100644 --- a/components/fieldgroups/paid-media/core-paid-media-dimensional-breakdowns.example.1.json +++ b/components/fieldgroups/paid-media/core-paid-media-dimensional-breakdowns.example.1.json @@ -1,84 +1,27 @@ { "xdm:paidMedia": { + "xdm:breakdownType": "device_platform_demographic", "xdm:dimensionalBreakdowns": { "xdm:deviceType": "mobile", "xdm:platform": "instagram", "xdm:placement": "instagram_feed", + "xdm:ageGroup": "25-34", "xdm:age": "25-34", "xdm:gender": "female", "xdm:country": "US", "xdm:region": "California", "xdm:city": "San Francisco", - "xdm:deviceBreakdown": { - "xdm:deviceType": "mobile", - "xdm:deviceOS": "ios", - "xdm:deviceModel": "iPhone 15 Pro", - "xdm:deviceManufacturer": "Apple", - "xdm:osVersion": "17.1", - "xdm:browserType": "in_app", - "xdm:browserVersion": "mobile_app", - "xdm:screenResolution": "1179x2556", - "xdm:connectionType": "wifi", - "xdm:carrier": "Verizon" - }, - "xdm:placementBreakdown": { - "xdm:publisher": "instagram", - "xdm:placement": "instagram_feed", - "xdm:position": "feed", - "xdm:placementType": "feed", - "xdm:adFormat": "single_image", - "xdm:inventoryType": "premium", - "xdm:environment": "mobile_app" - }, - "xdm:demographicBreakdown": { - "xdm:ageRange": "25-34", - "xdm:ageMin": 25, - "xdm:ageMax": 34, - "xdm:gender": "female", - "xdm:householdIncome": "75000-100000", - "xdm:education": "college", - "xdm:employmentStatus": "employed", - "xdm:maritalStatus": "single", - "xdm:parentalStatus": "non_parent", - "xdm:homeOwnership": "renter" - }, - "xdm:geographicBreakdown": { - "xdm:country": "US", - "xdm:countryCode": "US", - "xdm:region": "California", - "xdm:regionCode": "CA", - "xdm:city": "San Francisco", - "xdm:postalCode": "94105", - "xdm:dma": "807", - "xdm:dmaName": "San Francisco-Oakland-San Jose", - "xdm:metro": "San Francisco Bay Area", - "xdm:latitude": 37.7749, - "xdm:longitude": -122.4194, - "xdm:timezone": "America/Los_Angeles", - "xdm:locationType": "home" - }, - "xdm:audienceBreakdown": { - "xdm:audienceSegment": "tech_enthusiasts_25_54", - "xdm:audienceType": "custom", - "xdm:audienceSource": "website_visitors", - "xdm:audienceSize": 125000, - "xdm:audienceReach": 85000, - "xdm:audiencePenetration": 0.68, - "xdm:lookalikeSimilarity": 0, - "xdm:isLookalike": false, - "xdm:isRetargeting": true - }, - "xdm:temporalBreakdown": { - "xdm:dayOfWeek": "Tuesday", - "xdm:hourOfDay": 14, - "xdm:timeOfDay": "afternoon", - "xdm:dayPart": "business_hours", - "xdm:weekOfYear": 45, - "xdm:monthOfYear": 11, - "xdm:quarter": "Q4", - "xdm:isWeekend": false, - "xdm:isHoliday": false - }, + "xdm:language": "en", + "xdm:interestCategory": "technology", + "xdm:behaviorCategory": "online_shoppers", + "xdm:audienceSegment": "tech_enthusiasts_25_54", + "xdm:campaignObjective": "traffic", + "xdm:optimizationGoal": "link_clicks", + "xdm:creativeFormat": "single_image", + "xdm:adPosition": "feed", + "xdm:position": "feed", + "xdm:timeOfDay": "afternoon", + "xdm:dayOfWeek": "Tuesday", "xdm:additionalDetails": [ { "xdm:fieldName": "meta_platform", diff --git a/components/fieldgroups/paid-media/core-paid-media-experience-details.example.1.json b/components/fieldgroups/paid-media/core-paid-media-experience-details.example.1.json index aa861bb52..4957003ed 100644 --- a/components/fieldgroups/paid-media/core-paid-media-experience-details.example.1.json +++ b/components/fieldgroups/paid-media/core-paid-media-experience-details.example.1.json @@ -1,98 +1,98 @@ { "xdm:paidMedia": { "xdm:experienceDetails": { + "xdm:experienceName": "Fall 2025 Product Showcase Carousel", + "xdm:experienceDescription": "Multi-product carousel showcasing our latest tech accessories", "xdm:experienceType": "carousel", + "xdm:sourceURL": "https://cdn.acmecorp.com/experiences/fall2025-carousel", + "xdm:thumbnailURL": "https://cdn.acmecorp.com/experiences/fall2025-carousel-thumb.jpg", "xdm:landingPageURL": "https://shop.acmecorp.com/products", - "xdm:displayURL": "shop.acmecorp.com/products", - "xdm:finalURL": "https://shop.acmecorp.com/products?utm_source=facebook&utm_medium=carousel&utm_campaign=showcase2025", + "xdm:headingText": "Discover Our Latest Tech", + "xdm:bodyText": "Shop our newest collection of premium accessories", + "xdm:callToAction": "Shop Now", + "xdm:assetIDs": [ + "asset_001", + "asset_002", + "asset_003", + "asset_004", + "asset_005" + ], + "xdm:assetGUIDs": [ + "meta_act_123_asset_001", + "meta_act_123_asset_002", + "meta_act_123_asset_003", + "meta_act_123_asset_004", + "meta_act_123_asset_005" + ], "xdm:carouselProperties": { "xdm:cardCount": 5, - "xdm:carouselType": "product_carousel", - "xdm:autoAdvance": false, - "xdm:looping": true, "xdm:cards": [ { "xdm:cardIndex": 1, - "xdm:cardID": "card_001", - "xdm:headline": "Premium Wireless Headphones", - "xdm:description": "Experience crystal-clear sound with 40-hour battery life", - "xdm:imageURL": "https://cdn.acmecorp.com/products/headphones-premium.jpg", - "xdm:destinationURL": "https://shop.acmecorp.com/products/headphones-premium", - "xdm:callToAction": "Shop Now", - "xdm:price": 299.99, - "xdm:currency": "USD", - "xdm:productID": "prod_headphones_001" + "xdm:assetID": "asset_001", + "xdm:assetGUID": "meta_act_123_asset_001", + "xdm:heading": "Premium Wireless Headphones", + "description": "Experience crystal-clear sound with 40-hour battery life", + "xdm:destinationURL": "https://shop.acmecorp.com/products/headphones-premium" }, { "xdm:cardIndex": 2, - "xdm:cardID": "card_002", - "xdm:headline": "Smart Fitness Watch", - "xdm:description": "Track your health and fitness goals with precision", - "xdm:imageURL": "https://cdn.acmecorp.com/products/watch-fitness.jpg", - "xdm:destinationURL": "https://shop.acmecorp.com/products/watch-fitness", - "xdm:callToAction": "Shop Now", - "xdm:price": 399.99, - "xdm:currency": "USD", - "xdm:productID": "prod_watch_002" + "xdm:assetID": "asset_002", + "xdm:assetGUID": "meta_act_123_asset_002", + "xdm:heading": "Smart Fitness Watch", + "description": "Track your health and fitness goals with precision", + "xdm:destinationURL": "https://shop.acmecorp.com/products/watch-fitness" }, { "xdm:cardIndex": 3, - "xdm:cardID": "card_003", - "xdm:headline": "Portable Bluetooth Speaker", - "xdm:description": "Powerful sound in a compact, waterproof design", - "xdm:imageURL": "https://cdn.acmecorp.com/products/speaker-portable.jpg", - "xdm:destinationURL": "https://shop.acmecorp.com/products/speaker-portable", - "xdm:callToAction": "Shop Now", - "xdm:price": 149.99, - "xdm:currency": "USD", - "xdm:productID": "prod_speaker_003" + "xdm:assetID": "asset_003", + "xdm:assetGUID": "meta_act_123_asset_003", + "xdm:heading": "Portable Bluetooth Speaker", + "description": "Powerful sound in a compact, waterproof design", + "xdm:destinationURL": "https://shop.acmecorp.com/products/speaker-portable" }, { "xdm:cardIndex": 4, - "xdm:cardID": "card_004", - "xdm:headline": "Wireless Charging Pad", - "xdm:description": "Fast wireless charging for all your devices", - "xdm:imageURL": "https://cdn.acmecorp.com/products/charger-wireless.jpg", - "xdm:destinationURL": "https://shop.acmecorp.com/products/charger-wireless", - "xdm:callToAction": "Shop Now", - "xdm:price": 49.99, - "xdm:currency": "USD", - "xdm:productID": "prod_charger_004" + "xdm:assetID": "asset_004", + "xdm:assetGUID": "meta_act_123_asset_004", + "xdm:heading": "Wireless Charging Pad", + "description": "Fast wireless charging for all your devices", + "xdm:destinationURL": "https://shop.acmecorp.com/products/charger-wireless" }, { "xdm:cardIndex": 5, - "xdm:cardID": "card_005", - "xdm:headline": "USB-C Hub Adapter", - "xdm:description": "Connect all your devices with this versatile hub", - "xdm:imageURL": "https://cdn.acmecorp.com/products/hub-usbc.jpg", - "xdm:destinationURL": "https://shop.acmecorp.com/products/hub-usbc", - "xdm:callToAction": "Shop Now", - "xdm:price": 79.99, - "xdm:currency": "USD", - "xdm:productID": "prod_hub_005" + "xdm:assetID": "asset_005", + "xdm:assetGUID": "meta_act_123_asset_005", + "xdm:heading": "USB-C Hub Adapter", + "description": "Connect all your devices with this versatile hub", + "xdm:destinationURL": "https://shop.acmecorp.com/products/hub-usbc" } - ], - "xdm:catalogID": "catalog_987654321", - "xdm:productSetID": "product_set_123456", - "xdm:dynamicProductAds": false + ] }, "xdm:interactionProperties": { - "xdm:allowSwipe": true, - "xdm:allowTap": true, - "xdm:allowZoom": false, - "xdm:allowFullscreen": false, - "xdm:interactionTracking": true, - "xdm:cardViewTracking": true, - "xdm:swipeTracking": true + "xdm:isInteractive": true, + "xdm:interactionType": "swipe" }, "xdm:additionalDetails": [ { - "xdm:fieldName": "meta_experience_type", - "xdm:stringValue": "carousel" + "xdm:fieldName": "meta_display_url", + "xdm:stringValue": "shop.acmecorp.com/products" }, { - "xdm:fieldName": "meta_carousel_card_count", - "xdm:stringValue": "5" + "xdm:fieldName": "meta_final_url", + "xdm:stringValue": "https://shop.acmecorp.com/products?utm_source=facebook&utm_medium=carousel&utm_campaign=showcase2025" + }, + { + "xdm:fieldName": "meta_carousel_type", + "xdm:stringValue": "product_carousel" + }, + { + "xdm:fieldName": "meta_auto_advance", + "xdm:booleanValue": false + }, + { + "xdm:fieldName": "meta_looping", + "xdm:booleanValue": true }, { "xdm:fieldName": "meta_catalog_id", @@ -104,7 +104,35 @@ }, { "xdm:fieldName": "meta_dynamic_ads", - "xdm:stringValue": "false" + "xdm:booleanValue": false + }, + { + "xdm:fieldName": "meta_allow_swipe", + "xdm:booleanValue": true + }, + { + "xdm:fieldName": "meta_allow_tap", + "xdm:booleanValue": true + }, + { + "xdm:fieldName": "meta_allow_zoom", + "xdm:booleanValue": false + }, + { + "xdm:fieldName": "meta_allow_fullscreen", + "xdm:booleanValue": false + }, + { + "xdm:fieldName": "meta_interaction_tracking", + "xdm:booleanValue": true + }, + { + "xdm:fieldName": "meta_card_view_tracking", + "xdm:booleanValue": true + }, + { + "xdm:fieldName": "meta_swipe_tracking", + "xdm:booleanValue": true } ] } diff --git a/components/fieldgroups/paid-media/core-paid-media-identifiers.example.1.json b/components/fieldgroups/paid-media/core-paid-media-identifiers.example.1.json index b8f8f7e34..220a2f334 100644 --- a/components/fieldgroups/paid-media/core-paid-media-identifiers.example.1.json +++ b/components/fieldgroups/paid-media/core-paid-media-identifiers.example.1.json @@ -1,7 +1,7 @@ { "xdm:paidMedia": { "xdm:adNetwork": "meta", - "xdm:adNetworkName": "Meta (Facebook)", + "xdm:network": "meta", "xdm:entityType": "ad", "xdm:accountID": "act_123456789012345", "xdm:accountGUID": "meta_act_123456789012345", @@ -16,27 +16,31 @@ "xdm:assetID": "asset_456789123456789", "xdm:assetGUID": "meta_act_123456789012345_asset_456789123456789", "xdm:hierarchyPath": "act_123456789012345/23851234567890789/23851234567890456/23851234567890123", - "xdm:parentEntityType": "adGroup", - "xdm:parentEntityID": "23851234567890456", - "xdm:rootEntityType": "account", - "xdm:rootEntityID": "act_123456789012345", - "xdm:externalIDs": { - "xdm:businessManagerID": "987654321098765", - "xdm:pageID": "123456789012345", - "xdm:pixelID": "pixel_123456789", - "xdm:catalogID": "catalog_987654321", - "xdm:productSetID": "product_set_123456", - "xdm:appID": "app_456789123", - "xdm:instagramAccountID": "ig_acmecorp", - "xdm:creativeID": "creative_vid_987654321", - "xdm:videoID": "video_987654321012345", - "xdm:imageHash": "abc123def456ghi789jkl012" - }, - "xdm:crossNetworkIDs": { - "xdm:universalCampaignID": "ucid_550e8400e29b41d4a716446655440002", - "xdm:universalAdGroupID": "uagid_550e8400e29b41d4a716446655440003", - "xdm:universalAdID": "uaid_550e8400e29b41d4a716446655440004", - "xdm:crossNetworkTrackingID": "xnt_acme_fall2025_traffic" + "xdm:entityIDs": { + "xdm:account": { + "xdm:accountGUID": "meta_act_123456789012345", + "xdm:accountID": "act_123456789012345" + }, + "xdm:campaign": { + "xdm:campaignGUID": "meta_act_123456789012345_23851234567890789", + "xdm:campaignID": "23851234567890789" + }, + "xdm:adGroup": { + "xdm:adGroupGUID": "meta_act_123456789012345_23851234567890456", + "xdm:adGroupID": "23851234567890456" + }, + "xdm:ad": { + "xdm:adGUID": "meta_act_123456789012345_23851234567890123", + "xdm:adID": "23851234567890123" + }, + "xdm:experience": { + "xdm:experienceGUID": "meta_act_123456789012345_creative_vid_987654321", + "xdm:experienceID": "creative_vid_987654321" + }, + "xdm:asset": { + "xdm:assetGUID": "meta_act_123456789012345_asset_456789123456789", + "xdm:assetID": "asset_456789123456789" + } }, "xdm:additionalDetails": [ { From cdaec3d24cb23bd91bd44d7665690e9b1a6dcb2d Mon Sep 17 00:00:00 2001 From: Dan Bunker Date: Tue, 18 Nov 2025 13:54:20 -0800 Subject: [PATCH 11/22] Add missing fields for metrics and metadata fieldgroups --- .../core-paid-media-ad-details.schema.json | 5 ++ .../core-paid-media-asset-details.schema.json | 5 ++ ...-paid-media-conversion-metrics.schema.json | 52 +++++++++++++++++++ .../core-paid-media-metadata.schema.json | 30 +++++++---- 4 files changed, 83 insertions(+), 9 deletions(-) diff --git a/components/fieldgroups/paid-media/core-paid-media-ad-details.schema.json b/components/fieldgroups/paid-media/core-paid-media-ad-details.schema.json index bf3aff656..db4e68ba0 100644 --- a/components/fieldgroups/paid-media/core-paid-media-ad-details.schema.json +++ b/components/fieldgroups/paid-media/core-paid-media-ad-details.schema.json @@ -59,6 +59,11 @@ "other": "Other Ad Type" } }, + "xdm:adSubtype": { + "type": "string", + "title": "Ad Subtype", + "description": "Additional classification of the ad beyond the main type (GenStudio migration aid)" + }, "xdm:creative": { "$ref": "https://ns.adobe.com/xdm/datatypes/paid-media-creative", "title": "Creative Details", diff --git a/components/fieldgroups/paid-media/core-paid-media-asset-details.schema.json b/components/fieldgroups/paid-media/core-paid-media-asset-details.schema.json index fbfa81dd1..e59bc7b89 100644 --- a/components/fieldgroups/paid-media/core-paid-media-asset-details.schema.json +++ b/components/fieldgroups/paid-media/core-paid-media-asset-details.schema.json @@ -73,6 +73,11 @@ "title": "Asset Content", "description": "Text content of the asset (for text assets)" }, + "xdm:sourceURL": { + "type": "string", + "title": "Source URL", + "description": "Source URL of the asset (GenStudio migration aid)" + }, "xdm:mediaProperties": { "type": "object", "title": "Media Properties", diff --git a/components/fieldgroups/paid-media/core-paid-media-conversion-metrics.schema.json b/components/fieldgroups/paid-media/core-paid-media-conversion-metrics.schema.json index 1884c9eae..a630a84f4 100644 --- a/components/fieldgroups/paid-media/core-paid-media-conversion-metrics.schema.json +++ b/components/fieldgroups/paid-media/core-paid-media-conversion-metrics.schema.json @@ -39,6 +39,58 @@ "title": "Post-Engagement Conversions", "description": "Conversions attributed to engagements" }, + "xdm:actionValue": { + "type": "number", + "title": "Action Value", + "description": "Total value of all conversion actions", + "minimum": 0 + }, + "xdm:actionType": { + "type": "string", + "title": "Action Type", + "description": "Type of conversion action being measured (e.g., 'purchase', 'lead', 'app_install')" + }, + "xdm:actionSource": { + "type": "string", + "title": "Action Source", + "description": "Source of the conversion action (e.g., 'website', 'app', 'offline')" + }, + "xdm:oneDayClickActionValue": { + "type": "number", + "title": "1-Day Click Action Value", + "description": "Action value attributed to clicks within 1-day attribution window", + "minimum": 0 + }, + "xdm:oneDayViewActionValue": { + "type": "number", + "title": "1-Day View Action Value", + "description": "Action value attributed to views within 1-day attribution window", + "minimum": 0 + }, + "xdm:sevenDayClickActionValue": { + "type": "number", + "title": "7-Day Click Action Value", + "description": "Action value attributed to clicks within 7-day attribution window", + "minimum": 0 + }, + "xdm:oneDayClickConversions": { + "type": "number", + "title": "1-Day Click Conversions", + "description": "Number of conversions attributed to clicks within 1-day attribution window", + "minimum": 0 + }, + "xdm:oneDayViewConversions": { + "type": "number", + "title": "1-Day View Conversions", + "description": "Number of conversions attributed to views within 1-day attribution window", + "minimum": 0 + }, + "xdm:sevenDayClickConversions": { + "type": "number", + "title": "7-Day Click Conversions", + "description": "Number of conversions attributed to clicks within 7-day attribution window", + "minimum": 0 + }, "xdm:conversionsByType": { "type": "object", "title": "Conversions by Type", diff --git a/components/fieldgroups/paid-media/core-paid-media-metadata.schema.json b/components/fieldgroups/paid-media/core-paid-media-metadata.schema.json index ea0a9d0b5..62e2ab9b7 100644 --- a/components/fieldgroups/paid-media/core-paid-media-metadata.schema.json +++ b/components/fieldgroups/paid-media/core-paid-media-metadata.schema.json @@ -110,17 +110,11 @@ "title": "Timezone", "description": "Timezone for the entity (e.g., America/New_York)" }, - "xdm:createdTime": { + "xdm:timestamp": { "type": "string", "format": "date-time", - "title": "Created Time", - "description": "When the entity was created" - }, - "xdm:updatedTime": { - "type": "string", - "format": "date-time", - "title": "Updated Time", - "description": "When the entity was last updated" + "title": "Timestamp", + "description": "The time when the metadata record was captured or last updated (GenStudio migration aid)" }, "xdm:startTime": { "type": "string", @@ -134,6 +128,18 @@ "title": "End Time", "description": "When the entity stops running/expires" }, + "xdm:start": { + "type": "string", + "format": "date", + "title": "Start Date", + "description": "Campaign start date (GenStudio migration aid)" + }, + "xdm:end": { + "type": "string", + "format": "date", + "title": "End Date", + "description": "Campaign end date (GenStudio migration aid)" + }, "xdm:objective": { "type": "string", "title": "Objective", @@ -190,6 +196,12 @@ "description": "Total lifetime budget amount in account currency", "minimum": 0 }, + "xdm:budget": { + "type": "number", + "title": "Budget", + "description": "Total campaign budget (GenStudio migration aid - alias for lifetimeBudget)", + "minimum": 0 + }, "xdm:biddingStrategy": { "type": "string", "title": "Bidding Strategy", From e6fb3951fe20d9bf8f6b725d87ab174f90af9459 Mon Sep 17 00:00:00 2001 From: Dan Bunker Date: Mon, 10 Nov 2025 14:43:34 -0800 Subject: [PATCH 12/22] #2060 Add summary metrics and lookup schemas and examples supporting Paid Media --- .../core-paid-media-identifiers.schema.json | 6 +- .../paid-media-account-lookup.example.1.json | 193 +++++++++++++ .../paid-media-account-lookup.example.2.json | 196 +++++++++++++ .../paid-media-account-lookup.schema.json | 37 +++ .../paid-media-ad-lookup.example.1.json | 182 +++++++++++++ .../paid-media-ad-lookup.example.2.json | 180 ++++++++++++ .../paid-media-ad-lookup.example.3.json | 171 ++++++++++++ .../paid-media-ad-lookup.schema.json | 37 +++ .../paid-media-adgroup-lookup.example.1.json | 237 ++++++++++++++++ .../paid-media-adgroup-lookup.example.2.json | 213 +++++++++++++++ .../paid-media-adgroup-lookup.schema.json | 37 +++ .../paid-media-asset-lookup.example.1.json | 190 +++++++++++++ .../paid-media-asset-lookup.example.2.json | 169 ++++++++++++ .../paid-media-asset-lookup.example.3.json | 170 ++++++++++++ .../paid-media-asset-lookup.schema.json | 37 +++ .../paid-media-campaign-lookup.example.1.json | 207 ++++++++++++++ .../paid-media-campaign-lookup.example.2.json | 200 ++++++++++++++ .../paid-media-campaign-lookup.schema.json | 37 +++ ...aid-media-experience-lookup.example.1.json | 177 ++++++++++++ ...aid-media-experience-lookup.example.2.json | 181 ++++++++++++ .../paid-media-experience-lookup.schema.json | 37 +++ .../paid-media-summary-metrics.example.1.json | 225 +++++++++++++++ .../paid-media-summary-metrics.example.2.json | 227 ++++++++++++++++ .../paid-media-summary-metrics.example.3.json | 229 ++++++++++++++++ .../paid-media-summary-metrics.example.4.json | 257 ++++++++++++++++++ .../paid-media-summary-metrics.example.5.json | 253 +++++++++++++++++ .../paid-media-summary-metrics.example.6.json | 227 ++++++++++++++++ .../paid-media-summary-metrics.schema.json | 61 +++++ 28 files changed, 4369 insertions(+), 4 deletions(-) create mode 100644 schemas/paid-media/paid-media-account-lookup.example.1.json create mode 100644 schemas/paid-media/paid-media-account-lookup.example.2.json create mode 100644 schemas/paid-media/paid-media-account-lookup.schema.json create mode 100644 schemas/paid-media/paid-media-ad-lookup.example.1.json create mode 100644 schemas/paid-media/paid-media-ad-lookup.example.2.json create mode 100644 schemas/paid-media/paid-media-ad-lookup.example.3.json create mode 100644 schemas/paid-media/paid-media-ad-lookup.schema.json create mode 100644 schemas/paid-media/paid-media-adgroup-lookup.example.1.json create mode 100644 schemas/paid-media/paid-media-adgroup-lookup.example.2.json create mode 100644 schemas/paid-media/paid-media-adgroup-lookup.schema.json create mode 100644 schemas/paid-media/paid-media-asset-lookup.example.1.json create mode 100644 schemas/paid-media/paid-media-asset-lookup.example.2.json create mode 100644 schemas/paid-media/paid-media-asset-lookup.example.3.json create mode 100644 schemas/paid-media/paid-media-asset-lookup.schema.json create mode 100644 schemas/paid-media/paid-media-campaign-lookup.example.1.json create mode 100644 schemas/paid-media/paid-media-campaign-lookup.example.2.json create mode 100644 schemas/paid-media/paid-media-campaign-lookup.schema.json create mode 100644 schemas/paid-media/paid-media-experience-lookup.example.1.json create mode 100644 schemas/paid-media/paid-media-experience-lookup.example.2.json create mode 100644 schemas/paid-media/paid-media-experience-lookup.schema.json create mode 100644 schemas/paid-media/paid-media-summary-metrics.example.1.json create mode 100644 schemas/paid-media/paid-media-summary-metrics.example.2.json create mode 100644 schemas/paid-media/paid-media-summary-metrics.example.3.json create mode 100644 schemas/paid-media/paid-media-summary-metrics.example.4.json create mode 100644 schemas/paid-media/paid-media-summary-metrics.example.5.json create mode 100644 schemas/paid-media/paid-media-summary-metrics.example.6.json create mode 100644 schemas/paid-media/paid-media-summary-metrics.schema.json diff --git a/components/fieldgroups/paid-media/core-paid-media-identifiers.schema.json b/components/fieldgroups/paid-media/core-paid-media-identifiers.schema.json index 6e20a2fe4..5578ecbda 100644 --- a/components/fieldgroups/paid-media/core-paid-media-identifiers.schema.json +++ b/components/fieldgroups/paid-media/core-paid-media-identifiers.schema.json @@ -220,8 +220,7 @@ "adGroup", "ad", "experience", - "asset", - "metrics" + "asset" ], "meta:enum": { "account": "Ad Account", @@ -229,8 +228,7 @@ "adGroup": "Ad Group/Ad Set/Ad Squad", "ad": "Individual Ad", "experience": "Creative Experience", - "asset": "Creative Asset", - "metrics": "Performance Metrics" + "asset": "Creative Asset" } }, "xdm:hierarchyPath": { diff --git a/schemas/paid-media/paid-media-account-lookup.example.1.json b/schemas/paid-media/paid-media-account-lookup.example.1.json new file mode 100644 index 000000000..154e76b7c --- /dev/null +++ b/schemas/paid-media/paid-media-account-lookup.example.1.json @@ -0,0 +1,193 @@ +{ + "xdm:paidMedia": { + "xdm:adNetwork": "meta", + "xdm:entityType": "account", + "xdm:accountID": "act_123456789012345", + "xdm:accountGUID": "meta_act_123456789012345", + "xdm:metadata": { + "xdm:name": "Acme Corp - Meta Business Account", + "xdm:status": "active", + "xdm:currency": "USD", + "xdm:timezone": "America/Los_Angeles", + "xdm:createdTime": "2020-03-15T08:00:00Z", + "xdm:updatedTime": "2025-11-09T15:30:00Z" + }, + "xdm:accountDetails": { + "xdm:accountName": "Acme Corp - Meta Business Account", + "xdm:accountType": "business", + "xdm:businessName": "Acme Corporation", + "xdm:industry": "Technology", + "xdm:country": "US", + "xdm:isTestAccount": false, + "xdm:businessInfo": { + "xdm:businessID": "123456789012345", + "xdm:businessManagerID": "987654321098765", + "xdm:legalEntityName": "Acme Corporation Inc.", + "xdm:taxID": "12-3456789", + "xdm:businessAddress": { + "xdm:street1": "123 Innovation Drive", + "xdm:street2": "Suite 500", + "xdm:city": "San Francisco", + "xdm:region": "CA", + "xdm:postalCode": "94105", + "xdm:country": "US" + }, + "xdm:businessPhone": "+1-415-555-0100", + "xdm:businessEmail": "advertising@acmecorp.com", + "xdm:businessWebsite": "https://www.acmecorp.com", + "xdm:businessCategory": "Technology Company", + "xdm:businessVertical": "Software as a Service", + "xdm:employeeCount": "1001-5000", + "xdm:annualRevenue": "50000000-100000000", + "xdm:yearEstablished": 2010, + "xdm:publiclyTraded": true, + "xdm:stockSymbol": "ACME", + "xdm:parentCompany": "Acme Holdings LLC" + }, + "xdm:billingInfo": { + "xdm:billingType": "credit_card", + "xdm:paymentMethodID": "pm_1234567890abcdef", + "xdm:billingCurrency": "USD", + "xdm:billingAddress": { + "xdm:street1": "123 Innovation Drive", + "xdm:street2": "Finance Department", + "xdm:city": "San Francisco", + "xdm:region": "CA", + "xdm:postalCode": "94105", + "xdm:country": "US" + }, + "xdm:billingEmail": "billing@acmecorp.com", + "xdm:billingContact": "Jane Smith", + "xdm:billingPhone": "+1-415-555-0150", + "xdm:invoiceDelivery": "email", + "xdm:paymentTerms": "immediate", + "xdm:creditLimit": 500000, + "xdm:currentBalance": 125000, + "xdm:availableCredit": 375000, + "xdm:lastPaymentDate": "2025-11-03T10:30:00Z", + "xdm:lastPaymentAmount": 45000, + "xdm:nextBillingDate": "2025-12-01T00:00:00Z", + "xdm:autoPayEnabled": true, + "xdm:billingThreshold": 10000, + "xdm:taxExempt": false + }, + "xdm:contactInfo": { + "xdm:primaryContact": { + "xdm:name": "John Doe", + "xdm:email": "john.doe@acmecorp.com", + "xdm:phone": "+1-415-555-0120", + "xdm:title": "Director of Digital Marketing", + "xdm:userID": "user_abc123xyz" + }, + "xdm:technicalContact": { + "xdm:name": "Sarah Johnson", + "xdm:email": "sarah.johnson@acmecorp.com", + "xdm:phone": "+1-415-555-0130", + "xdm:title": "Marketing Technology Manager", + "xdm:userID": "user_def456uvw" + }, + "xdm:billingContact": { + "xdm:name": "Jane Smith", + "xdm:email": "jane.smith@acmecorp.com", + "xdm:phone": "+1-415-555-0150", + "xdm:title": "Finance Manager", + "xdm:userID": "user_ghi789rst" + }, + "xdm:notificationEmails": [ + "marketing-alerts@acmecorp.com", + "performance-reports@acmecorp.com", + "billing-notifications@acmecorp.com" + ] + }, + "xdm:spendingLimits": { + "xdm:dailySpendLimit": 5000, + "xdm:monthlySpendLimit": 150000, + "xdm:lifetimeSpendLimit": 1000000, + "xdm:currentDailySpend": 3250, + "xdm:currentMonthlySpend": 87500, + "xdm:lifetimeSpend": 425000, + "xdm:spendLimitResetDay": 1, + "xdm:alertThreshold": 0.8, + "xdm:alertsEnabled": true, + "xdm:pauseOnLimitReached": false + }, + "xdm:accountPermissions": { + "xdm:canCreateCampaigns": true, + "xdm:canEditCampaigns": true, + "xdm:canDeleteCampaigns": true, + "xdm:canViewReports": true, + "xdm:canManageBilling": true, + "xdm:canManageUsers": true, + "xdm:canAccessAPI": true, + "xdm:canUseAdvancedFeatures": true, + "xdm:restrictedPlacements": [], + "xdm:allowedCountries": ["US", "CA", "GB", "AU", "DE", "FR"], + "xdm:blockedCategories": ["gambling", "alcohol"], + "xdm:requiresApproval": false + }, + "xdm:accountSettings": { + "xdm:timezone": "America/Los_Angeles", + "xdm:language": "en_US", + "xdm:currency": "USD", + "xdm:attributionWindow": "28d_click_1d_view", + "xdm:conversionTracking": true, + "xdm:pixelID": "pixel_123456789", + "xdm:catalogID": "catalog_987654321", + "xdm:appID": "app_456789123", + "xdm:domainVerification": true, + "xdm:verifiedDomains": ["acmecorp.com", "shop.acmecorp.com"], + "xdm:brandSafetyEnabled": true, + "xdm:adReviewEnabled": true, + "xdm:autoOptimizationEnabled": true + }, + "xdm:accountStatus": { + "xdm:status": "active", + "xdm:accountHealth": "good", + "xdm:complianceStatus": "compliant", + "xdm:verificationStatus": "verified", + "xdm:riskLevel": "low", + "xdm:restrictions": [], + "xdm:warnings": [], + "xdm:lastReviewDate": "2025-10-15T14:30:00Z", + "xdm:nextReviewDate": "2026-01-15T00:00:00Z" + }, + "xdm:partnerIntegrations": { + "xdm:crmIntegration": true, + "xdm:crmProvider": "Salesforce", + "xdm:analyticsIntegration": true, + "xdm:analyticsProvider": "Adobe Analytics", + "xdm:cdpIntegration": true, + "xdm:cdpProvider": "Adobe Real-Time CDP", + "xdm:attributionProvider": "Adobe Attribution AI", + "xdm:dataWarehouseIntegration": true, + "xdm:dataWarehouseProvider": "Snowflake" + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "meta_business_verification_status", + "xdm:stringValue": "verified" + }, + { + "xdm:fieldName": "meta_ad_account_id", + "xdm:stringValue": "act_123456789012345" + }, + { + "xdm:fieldName": "meta_business_manager_name", + "xdm:stringValue": "Acme Corp Business Manager" + }, + { + "xdm:fieldName": "meta_account_creation_date", + "xdm:stringValue": "2020-03-15T08:00:00Z" + }, + { + "xdm:fieldName": "meta_two_factor_enabled", + "xdm:stringValue": "true" + }, + { + "xdm:fieldName": "meta_agency_relationship", + "xdm:stringValue": "direct" + } + ] + } + } +} diff --git a/schemas/paid-media/paid-media-account-lookup.example.2.json b/schemas/paid-media/paid-media-account-lookup.example.2.json new file mode 100644 index 000000000..8adc18f3b --- /dev/null +++ b/schemas/paid-media/paid-media-account-lookup.example.2.json @@ -0,0 +1,196 @@ +{ + "xdm:paidMedia": { + "xdm:adNetwork": "google_ads", + "xdm:entityType": "account", + "xdm:accountID": "1234567890", + "xdm:accountGUID": "google_ads_1234567890", + "xdm:metadata": { + "xdm:name": "Acme Corp - Google Ads Account", + "xdm:status": "active", + "xdm:currency": "USD", + "xdm:timezone": "America/New_York", + "xdm:createdTime": "2019-06-20T10:00:00Z", + "xdm:updatedTime": "2025-11-09T12:00:00Z" + }, + "xdm:accountDetails": { + "xdm:accountName": "Acme Corp - Google Ads Account", + "xdm:accountType": "business", + "xdm:businessName": "Acme Corporation", + "xdm:industry": "Technology", + "xdm:country": "US", + "xdm:isTestAccount": false, + "xdm:businessInfo": { + "xdm:businessID": "google_business_987654321", + "xdm:businessManagerID": "mcc_111222333444", + "xdm:legalEntityName": "Acme Corporation Inc.", + "xdm:taxID": "12-3456789", + "xdm:businessAddress": { + "xdm:street1": "456 Commerce Boulevard", + "xdm:street2": "Floor 12", + "xdm:city": "New York", + "xdm:region": "NY", + "xdm:postalCode": "10001", + "xdm:country": "US" + }, + "xdm:businessPhone": "+1-212-555-0200", + "xdm:businessEmail": "google-ads@acmecorp.com", + "xdm:businessWebsite": "https://www.acmecorp.com", + "xdm:businessCategory": "Technology Company", + "xdm:businessVertical": "Software as a Service", + "xdm:employeeCount": "1001-5000", + "xdm:annualRevenue": "50000000-100000000", + "xdm:yearEstablished": 2010, + "xdm:publiclyTraded": true, + "xdm:stockSymbol": "ACME", + "xdm:parentCompany": "Acme Holdings LLC" + }, + "xdm:billingInfo": { + "xdm:billingType": "postpaid", + "xdm:paymentMethodID": "billing_profile_567890", + "xdm:billingCurrency": "USD", + "xdm:billingAddress": { + "xdm:street1": "456 Commerce Boulevard", + "xdm:street2": "Accounts Payable", + "xdm:city": "New York", + "xdm:region": "NY", + "xdm:postalCode": "10001", + "xdm:country": "US" + }, + "xdm:billingEmail": "ap@acmecorp.com", + "xdm:billingContact": "Robert Finance", + "xdm:billingPhone": "+1-212-555-0250", + "xdm:invoiceDelivery": "email", + "xdm:paymentTerms": "net_30", + "xdm:creditLimit": 750000, + "xdm:currentBalance": 85000, + "xdm:availableCredit": 665000, + "xdm:lastPaymentDate": "2025-11-01T09:00:00Z", + "xdm:lastPaymentAmount": 62000, + "xdm:nextBillingDate": "2025-12-01T00:00:00Z", + "xdm:autoPayEnabled": false, + "xdm:billingThreshold": 50000, + "xdm:taxExempt": false + }, + "xdm:contactInfo": { + "xdm:primaryContact": { + "xdm:name": "Emily Marketing", + "xdm:email": "emily.marketing@acmecorp.com", + "xdm:phone": "+1-212-555-0220", + "xdm:title": "VP of Digital Marketing", + "xdm:userID": "user_google_xyz789" + }, + "xdm:technicalContact": { + "xdm:name": "Michael Tech", + "xdm:email": "michael.tech@acmecorp.com", + "xdm:phone": "+1-212-555-0230", + "xdm:title": "Senior Marketing Analyst", + "xdm:userID": "user_google_abc456" + }, + "xdm:billingContact": { + "xdm:name": "Robert Finance", + "xdm:email": "robert.finance@acmecorp.com", + "xdm:phone": "+1-212-555-0250", + "xdm:title": "Controller", + "xdm:userID": "user_google_def123" + }, + "xdm:notificationEmails": [ + "google-ads-alerts@acmecorp.com", + "sem-reports@acmecorp.com" + ] + }, + "xdm:spendingLimits": { + "xdm:dailySpendLimit": 8000, + "xdm:monthlySpendLimit": 240000, + "xdm:lifetimeSpendLimit": 0, + "xdm:currentDailySpend": 6500, + "xdm:currentMonthlySpend": 145000, + "xdm:lifetimeSpend": 2850000, + "xdm:spendLimitResetDay": 1, + "xdm:alertThreshold": 0.9, + "xdm:alertsEnabled": true, + "xdm:pauseOnLimitReached": true + }, + "xdm:accountPermissions": { + "xdm:canCreateCampaigns": true, + "xdm:canEditCampaigns": true, + "xdm:canDeleteCampaigns": true, + "xdm:canViewReports": true, + "xdm:canManageBilling": true, + "xdm:canManageUsers": true, + "xdm:canAccessAPI": true, + "xdm:canUseAdvancedFeatures": true, + "xdm:restrictedPlacements": [], + "xdm:allowedCountries": ["US", "CA", "GB", "AU", "DE", "FR", "JP"], + "xdm:blockedCategories": [], + "xdm:requiresApproval": false + }, + "xdm:accountSettings": { + "xdm:timezone": "America/New_York", + "xdm:language": "en_US", + "xdm:currency": "USD", + "xdm:attributionWindow": "30d_click", + "xdm:conversionTracking": true, + "xdm:pixelID": "", + "xdm:catalogID": "", + "xdm:appID": "", + "xdm:domainVerification": true, + "xdm:verifiedDomains": [ + "acmecorp.com", + "shop.acmecorp.com", + "www.acmecorp.com" + ], + "xdm:brandSafetyEnabled": true, + "xdm:adReviewEnabled": true, + "xdm:autoOptimizationEnabled": true + }, + "xdm:accountStatus": { + "xdm:status": "active", + "xdm:accountHealth": "excellent", + "xdm:complianceStatus": "compliant", + "xdm:verificationStatus": "verified", + "xdm:riskLevel": "low", + "xdm:restrictions": [], + "xdm:warnings": [], + "xdm:lastReviewDate": "2025-09-20T10:00:00Z", + "xdm:nextReviewDate": "2025-12-20T00:00:00Z" + }, + "xdm:partnerIntegrations": { + "xdm:crmIntegration": true, + "xdm:crmProvider": "Salesforce", + "xdm:analyticsIntegration": true, + "xdm:analyticsProvider": "Google Analytics 4", + "xdm:cdpIntegration": true, + "xdm:cdpProvider": "Adobe Real-Time CDP", + "xdm:attributionProvider": "Google Ads Attribution", + "xdm:dataWarehouseIntegration": true, + "xdm:dataWarehouseProvider": "BigQuery" + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "google_customer_id", + "xdm:stringValue": "1234567890" + }, + { + "xdm:fieldName": "google_manager_customer_id", + "xdm:stringValue": "111222333444" + }, + { + "xdm:fieldName": "google_account_type", + "xdm:stringValue": "standard" + }, + { + "xdm:fieldName": "google_account_creation_date", + "xdm:stringValue": "2019-06-20T10:00:00Z" + }, + { + "xdm:fieldName": "google_conversion_tracking_id", + "xdm:stringValue": "AW-123456789" + }, + { + "xdm:fieldName": "google_remarketing_tag_id", + "xdm:stringValue": "DC-987654321" + } + ] + } + } +} diff --git a/schemas/paid-media/paid-media-account-lookup.schema.json b/schemas/paid-media/paid-media-account-lookup.schema.json new file mode 100644 index 000000000..7bfc220cc --- /dev/null +++ b/schemas/paid-media/paid-media-account-lookup.schema.json @@ -0,0 +1,37 @@ +{ + "meta:license": [ + "Copyright 2025 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "https://ns.adobe.com/xdm/schemas/paid-media-account-lookup", + "title": "Paid Media Account Lookup", + "type": "object", + "description": "Schema for paid media account lookup dataset containing account metadata across all ad networks", + "meta:class": "https://ns.adobe.com/xdm/data/record", + "meta:extensible": false, + "meta:abstract": false, + "meta:extends": [ + "https://ns.adobe.com/xdm/data/record", + "https://ns.adobe.com/xdm/mixins/paid-media/core-identifiers", + "https://ns.adobe.com/xdm/mixins/paid-media/core-metadata", + "https://ns.adobe.com/xdm/mixins/paid-media/account-details" + ], + "allOf": [ + { + "$ref": "https://ns.adobe.com/xdm/data/record" + }, + { + "$ref": "https://ns.adobe.com/xdm/mixins/paid-media/core-identifiers" + }, + { + "$ref": "https://ns.adobe.com/xdm/mixins/paid-media/core-metadata" + }, + { + "$ref": "https://ns.adobe.com/xdm/mixins/paid-media/account-details" + } + ], + "meta:status": "experimental" +} diff --git a/schemas/paid-media/paid-media-ad-lookup.example.1.json b/schemas/paid-media/paid-media-ad-lookup.example.1.json new file mode 100644 index 000000000..72d3d94e3 --- /dev/null +++ b/schemas/paid-media/paid-media-ad-lookup.example.1.json @@ -0,0 +1,182 @@ +{ + "xdm:paidMedia": { + "xdm:adNetwork": "meta", + "xdm:entityType": "ad", + "xdm:accountID": "act_123456789012345", + "xdm:accountGUID": "meta_act_123456789012345", + "xdm:campaignID": "23851234567890789", + "xdm:campaignGUID": "meta_act_123456789012345_23851234567890789", + "xdm:adGroupID": "23851234567890456", + "xdm:adGroupGUID": "meta_act_123456789012345_23851234567890456", + "xdm:adID": "23851234567890123", + "xdm:adGUID": "meta_act_123456789012345_23851234567890123", + "xdm:experienceID": "creative_vid_987654321", + "xdm:experienceGUID": "meta_act_123456789012345_creative_vid_987654321", + "xdm:hierarchyPath": "act_123456789012345/23851234567890789/23851234567890456/23851234567890123", + "xdm:metadata": { + "xdm:name": "Fall Product Launch - 30s Video Ad", + "xdm:status": "active", + "xdm:servingStatus": "CAMPAIGN_STATUS_ENABLED", + "xdm:currency": "USD", + "xdm:timezone": "America/Los_Angeles", + "xdm:createdTime": "2025-10-28T16:00:00Z", + "xdm:updatedTime": "2025-11-09T13:00:00Z", + "xdm:startTime": "2025-11-01T00:00:00Z", + "xdm:endTime": "2025-11-30T23:59:59Z" + }, + "xdm:adDetails": { + "xdm:adType": "video", + "xdm:adFormat": "single_video", + "xdm:reviewStatus": "approved", + "xdm:deliveryStatus": "active", + "xdm:isPinDeleted": false, + "xdm:isRemovable": true, + "xdm:creativeDetails": { + "xdm:creativeID": "creative_vid_987654321", + "xdm:creativeName": "Fall Product Launch - 30s Video", + "xdm:creativeType": "video", + "xdm:creativeFormat": "feed_video", + "xdm:creativeVersion": "v2.1", + "xdm:creativeTemplate": "video_standard", + "xdm:dynamicCreative": false, + "xdm:personalized": true, + "xdm:localized": true, + "xdm:locale": "en_US", + "xdm:brandID": "brand_acme_123", + "xdm:campaignTheme": "fall_2025_launch" + }, + "xdm:adReviewDetails": { + "xdm:reviewStatus": "approved", + "xdm:reviewDate": "2025-11-05T14:30:00Z", + "xdm:reviewerID": "meta_reviewer_456", + "xdm:reviewNotes": "Approved - complies with all advertising policies", + "xdm:policyViolations": [], + "xdm:appealStatus": "not_applicable", + "xdm:lastModifiedDate": "2025-11-05T10:15:00Z", + "xdm:autoApproved": false, + "xdm:requiresManualReview": false + }, + "xdm:deliveryDetails": { + "xdm:deliveryStatus": "active", + "xdm:effectiveStatus": "active", + "xdm:servingStatus": "CAMPAIGN_STATUS_ENABLED", + "xdm:pacing": "standard", + "xdm:deliveryEstimate": "good", + "xdm:learningPhase": "completed", + "xdm:lastDeliveryCheck": "2025-11-10T08:00:00Z", + "xdm:estimatedDailyReach": 125000, + "xdm:saturationLevel": "low" + }, + "xdm:socialMediaProperties": { + "xdm:postID": "post_123456789_987654321", + "xdm:pageID": "page_acmecorp_official", + "xdm:instagramAccountID": "ig_acmecorp", + "xdm:allowComments": true, + "xdm:allowSharing": true, + "xdm:allowLikes": true, + "xdm:commentCount": 1247, + "xdm:shareCount": 892, + "xdm:likeCount": 8934, + "xdm:reactionCount": 9876, + "xdm:saveCount": 456, + "xdm:hideCount": 23, + "xdm:reportCount": 2, + "xdm:organicImpressions": 45000, + "xdm:organicReach": 32000, + "xdm:viralImpressions": 12000, + "xdm:viralReach": 8500 + }, + "xdm:callToAction": { + "xdm:type": "learn_more", + "xdm:text": "Learn More", + "xdm:url": "https://www.acmecorp.com/fall-launch?utm_source=facebook&utm_medium=video&utm_campaign=fall2025", + "xdm:displayUrl": "acmecorp.com/fall-launch", + "xdm:deepLink": "acmecorp://products/fall-launch", + "xdm:trackingTemplate": "https://track.acmecorp.com/click?ad={ad_id}&placement={placement}", + "xdm:utmParameters": { + "xdm:source": "facebook", + "xdm:medium": "video", + "xdm:campaign": "fall2025", + "xdm:content": "30s_video", + "xdm:term": "product_launch" + } + }, + "xdm:linkProperties": { + "xdm:destinationURL": "https://www.acmecorp.com/fall-launch", + "xdm:displayURL": "acmecorp.com", + "xdm:urlTags": "utm_source=facebook&utm_medium=video&utm_campaign=fall2025", + "xdm:trackingPixels": [ + "https://track.acmecorp.com/impression?ad=vid_987654321", + "https://analytics.acmecorp.com/pixel?type=view&id=fall2025" + ], + "xdm:clickTrackers": [ + "https://track.acmecorp.com/click?ad=vid_987654321", + "https://analytics.acmecorp.com/pixel?type=click&id=fall2025" + ], + "xdm:conversionTracking": true, + "xdm:conversionPixelID": "pixel_123456789" + }, + "xdm:appProperties": { + "xdm:appID": "app_456789123", + "xdm:appName": "Acme Shopping", + "xdm:appPlatform": "ios", + "xdm:appStoreURL": "https://apps.apple.com/app/acme-shopping/id123456789", + "xdm:appDeepLink": "acmecorp://products/fall-launch", + "xdm:appEventTracking": true, + "xdm:appEventName": "product_view", + "xdm:sdkVersion": "9.2.1" + }, + "xdm:leadGenProperties": { + "xdm:formID": "form_not_applicable", + "xdm:formType": "not_applicable", + "xdm:instantForm": false, + "xdm:privacyPolicyURL": "https://www.acmecorp.com/privacy", + "xdm:customDisclaimer": "By submitting, you agree to receive marketing communications from Acme Corp." + }, + "xdm:interactionProperties": { + "xdm:allowInteraction": true, + "xdm:interactionType": "video_engagement", + "xdm:swipeUpEnabled": false, + "xdm:pollEnabled": false, + "xdm:quizEnabled": false, + "xdm:gamificationEnabled": false, + "xdm:arEnabled": false, + "xdm:threeDEnabled": false + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "meta_ad_id", + "xdm:stringValue": "23851234567890123" + }, + { + "xdm:fieldName": "meta_adset_id", + "xdm:stringValue": "23851234567890456" + }, + { + "xdm:fieldName": "meta_campaign_id", + "xdm:stringValue": "23851234567890789" + }, + { + "xdm:fieldName": "meta_video_id", + "xdm:stringValue": "987654321012345" + }, + { + "xdm:fieldName": "meta_placement_optimization", + "xdm:stringValue": "automatic" + }, + { + "xdm:fieldName": "meta_objective", + "xdm:stringValue": "OUTCOME_TRAFFIC" + }, + { + "xdm:fieldName": "meta_buying_type", + "xdm:stringValue": "AUCTION" + }, + { + "xdm:fieldName": "meta_bid_strategy", + "xdm:stringValue": "LOWEST_COST_WITHOUT_CAP" + } + ] + } + } +} diff --git a/schemas/paid-media/paid-media-ad-lookup.example.2.json b/schemas/paid-media/paid-media-ad-lookup.example.2.json new file mode 100644 index 000000000..c36a5a72b --- /dev/null +++ b/schemas/paid-media/paid-media-ad-lookup.example.2.json @@ -0,0 +1,180 @@ +{ + "xdm:paidMedia": { + "xdm:adNetwork": "meta", + "xdm:entityType": "ad", + "xdm:accountID": "act_123456789012345", + "xdm:accountGUID": "meta_act_123456789012345", + "xdm:campaignID": "23851234567890789", + "xdm:campaignGUID": "meta_act_123456789012345_23851234567890789", + "xdm:adGroupID": "23851234567890456", + "xdm:adGroupGUID": "meta_act_123456789012345_23851234567890456", + "xdm:adID": "23851234567890124", + "xdm:adGUID": "meta_act_123456789012345_23851234567890124", + "xdm:experienceID": "creative_img_456789123", + "xdm:experienceGUID": "meta_act_123456789012345_creative_img_456789123", + "xdm:hierarchyPath": "act_123456789012345/23851234567890789/23851234567890456/23851234567890124", + "xdm:metadata": { + "xdm:name": "Holiday Sale - Hero Banner Ad", + "xdm:status": "active", + "xdm:servingStatus": "CAMPAIGN_STATUS_ENABLED", + "xdm:currency": "USD", + "xdm:timezone": "America/Los_Angeles", + "xdm:createdTime": "2025-11-01T10:00:00Z", + "xdm:updatedTime": "2025-11-09T11:00:00Z", + "xdm:startTime": "2025-11-01T00:00:00Z", + "xdm:endTime": "2025-11-30T23:59:59Z" + }, + "xdm:adDetails": { + "xdm:adType": "image", + "xdm:adFormat": "single_image", + "xdm:reviewStatus": "approved", + "xdm:deliveryStatus": "active", + "xdm:isPinDeleted": false, + "xdm:isRemovable": true, + "xdm:creativeDetails": { + "xdm:creativeID": "creative_img_456789123", + "xdm:creativeName": "Holiday Sale - Hero Banner", + "xdm:creativeType": "image", + "xdm:creativeFormat": "feed_image", + "xdm:creativeVersion": "v1.0", + "xdm:creativeTemplate": "image_standard", + "xdm:dynamicCreative": false, + "xdm:personalized": false, + "xdm:localized": true, + "xdm:locale": "en_US", + "xdm:brandID": "brand_acme_123", + "xdm:campaignTheme": "holiday_2025" + }, + "xdm:adReviewDetails": { + "xdm:reviewStatus": "approved", + "xdm:reviewDate": "2025-11-01T12:00:00Z", + "xdm:reviewerID": "meta_reviewer_789", + "xdm:reviewNotes": "Approved - meets all policy requirements", + "xdm:policyViolations": [], + "xdm:appealStatus": "not_applicable", + "xdm:lastModifiedDate": "2025-11-01T09:30:00Z", + "xdm:autoApproved": true, + "xdm:requiresManualReview": false + }, + "xdm:deliveryDetails": { + "xdm:deliveryStatus": "active", + "xdm:effectiveStatus": "active", + "xdm:servingStatus": "CAMPAIGN_STATUS_ENABLED", + "xdm:pacing": "standard", + "xdm:deliveryEstimate": "excellent", + "xdm:learningPhase": "completed", + "xdm:lastDeliveryCheck": "2025-11-10T08:00:00Z", + "xdm:estimatedDailyReach": 85000, + "xdm:saturationLevel": "low" + }, + "xdm:socialMediaProperties": { + "xdm:postID": "post_123456789_987654322", + "xdm:pageID": "page_acmecorp_official", + "xdm:instagramAccountID": "ig_acmecorp", + "xdm:allowComments": true, + "xdm:allowSharing": true, + "xdm:allowLikes": true, + "xdm:commentCount": 856, + "xdm:shareCount": 623, + "xdm:likeCount": 6234, + "xdm:reactionCount": 6890, + "xdm:saveCount": 312, + "xdm:hideCount": 15, + "xdm:reportCount": 1, + "xdm:organicImpressions": 28000, + "xdm:organicReach": 21000, + "xdm:viralImpressions": 8500, + "xdm:viralReach": 6200 + }, + "xdm:callToAction": { + "xdm:type": "shop_now", + "xdm:text": "Shop Now", + "xdm:url": "https://shop.acmecorp.com/holiday-sale?utm_source=facebook&utm_medium=image&utm_campaign=holiday2025", + "xdm:displayUrl": "shop.acmecorp.com/holiday-sale", + "xdm:deepLink": "acmecorp://shop/holiday-sale", + "xdm:trackingTemplate": "https://track.acmecorp.com/click?ad={ad_id}&placement={placement}", + "xdm:utmParameters": { + "xdm:source": "facebook", + "xdm:medium": "image", + "xdm:campaign": "holiday2025", + "xdm:content": "hero_banner", + "xdm:term": "holiday_sale" + } + }, + "xdm:linkProperties": { + "xdm:destinationURL": "https://shop.acmecorp.com/holiday-sale", + "xdm:displayURL": "shop.acmecorp.com", + "xdm:urlTags": "utm_source=facebook&utm_medium=image&utm_campaign=holiday2025", + "xdm:trackingPixels": [ + "https://track.acmecorp.com/impression?ad=img_456789123" + ], + "xdm:clickTrackers": [ + "https://track.acmecorp.com/click?ad=img_456789123" + ], + "xdm:conversionTracking": true, + "xdm:conversionPixelID": "pixel_123456789" + }, + "xdm:appProperties": { + "xdm:appID": "app_456789123", + "xdm:appName": "Acme Shopping", + "xdm:appPlatform": "ios", + "xdm:appStoreURL": "https://apps.apple.com/app/acme-shopping/id123456789", + "xdm:appDeepLink": "acmecorp://shop/holiday-sale", + "xdm:appEventTracking": true, + "xdm:appEventName": "view_sale", + "xdm:sdkVersion": "9.2.1" + }, + "xdm:leadGenProperties": { + "xdm:formID": "form_not_applicable", + "xdm:formType": "not_applicable", + "xdm:instantForm": false, + "xdm:privacyPolicyURL": "https://www.acmecorp.com/privacy", + "xdm:customDisclaimer": "" + }, + "xdm:interactionProperties": { + "xdm:allowInteraction": true, + "xdm:interactionType": "click", + "xdm:swipeUpEnabled": false, + "xdm:pollEnabled": false, + "xdm:quizEnabled": false, + "xdm:gamificationEnabled": false, + "xdm:arEnabled": false, + "xdm:threeDEnabled": false + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "meta_ad_id", + "xdm:stringValue": "23851234567890124" + }, + { + "xdm:fieldName": "meta_adset_id", + "xdm:stringValue": "23851234567890456" + }, + { + "xdm:fieldName": "meta_campaign_id", + "xdm:stringValue": "23851234567890789" + }, + { + "xdm:fieldName": "meta_image_hash", + "xdm:stringValue": "abc123def456ghi789jkl012" + }, + { + "xdm:fieldName": "meta_placement_optimization", + "xdm:stringValue": "automatic" + }, + { + "xdm:fieldName": "meta_objective", + "xdm:stringValue": "OUTCOME_TRAFFIC" + }, + { + "xdm:fieldName": "meta_buying_type", + "xdm:stringValue": "AUCTION" + }, + { + "xdm:fieldName": "meta_bid_strategy", + "xdm:stringValue": "LOWEST_COST_WITHOUT_CAP" + } + ] + } + } +} diff --git a/schemas/paid-media/paid-media-ad-lookup.example.3.json b/schemas/paid-media/paid-media-ad-lookup.example.3.json new file mode 100644 index 000000000..13b64e152 --- /dev/null +++ b/schemas/paid-media/paid-media-ad-lookup.example.3.json @@ -0,0 +1,171 @@ +{ + "xdm:paidMedia": { + "xdm:adNetwork": "google_ads", + "xdm:entityType": "ad", + "xdm:accountID": "1234567890", + "xdm:accountGUID": "google_ads_1234567890", + "xdm:campaignID": "9876543210", + "xdm:campaignGUID": "google_ads_1234567890_9876543210", + "xdm:adGroupID": "5555666677", + "xdm:adGroupGUID": "google_ads_1234567890_5555666677", + "xdm:adID": "8888999900", + "xdm:adGUID": "google_ads_1234567890_8888999900", + "xdm:experienceID": "creative_rda_111222333", + "xdm:experienceGUID": "google_ads_1234567890_creative_rda_111222333", + "xdm:hierarchyPath": "1234567890/9876543210/5555666677/8888999900", + "xdm:metadata": { + "xdm:name": "Responsive Display Ad - Tech Solutions", + "xdm:status": "active", + "xdm:servingStatus": "CAMPAIGN_STATUS_ENABLED", + "xdm:currency": "USD", + "xdm:timezone": "America/New_York", + "xdm:createdTime": "2025-09-20T14:00:00Z", + "xdm:updatedTime": "2025-11-09T08:00:00Z", + "xdm:startTime": "2025-10-01T00:00:00Z" + }, + "xdm:adDetails": { + "xdm:adType": "responsive", + "xdm:adFormat": "responsive_display_ad", + "xdm:reviewStatus": "approved", + "xdm:deliveryStatus": "active", + "xdm:isPinDeleted": false, + "xdm:isRemovable": true, + "xdm:creativeDetails": { + "xdm:creativeID": "creative_rda_111222333", + "xdm:creativeName": "Responsive Display Ad - Tech Solutions", + "xdm:creativeType": "responsive_display", + "xdm:creativeFormat": "responsive_display_ad", + "xdm:creativeVersion": "v3.2", + "xdm:creativeTemplate": "responsive_display_standard", + "xdm:dynamicCreative": true, + "xdm:personalized": true, + "xdm:localized": true, + "xdm:locale": "en_US", + "xdm:brandID": "brand_acme_123", + "xdm:campaignTheme": "tech_solutions_2025" + }, + "xdm:adReviewDetails": { + "xdm:reviewStatus": "approved", + "xdm:reviewDate": "2025-09-21T10:00:00Z", + "xdm:reviewerID": "google_reviewer_123", + "xdm:reviewNotes": "Approved - complies with Google Ads policies", + "xdm:policyViolations": [], + "xdm:appealStatus": "not_applicable", + "xdm:lastModifiedDate": "2025-09-20T16:00:00Z", + "xdm:autoApproved": false, + "xdm:requiresManualReview": true + }, + "xdm:deliveryDetails": { + "xdm:deliveryStatus": "active", + "xdm:effectiveStatus": "active", + "xdm:servingStatus": "CAMPAIGN_STATUS_ENABLED", + "xdm:pacing": "standard", + "xdm:deliveryEstimate": "good", + "xdm:learningPhase": "completed", + "xdm:lastDeliveryCheck": "2025-11-10T07:00:00Z", + "xdm:estimatedDailyReach": 95000, + "xdm:saturationLevel": "medium" + }, + "xdm:socialMediaProperties": { + "xdm:postID": "", + "xdm:pageID": "", + "xdm:instagramAccountID": "", + "xdm:allowComments": false, + "xdm:allowSharing": false, + "xdm:allowLikes": false, + "xdm:commentCount": 0, + "xdm:shareCount": 0, + "xdm:likeCount": 0, + "xdm:reactionCount": 0, + "xdm:saveCount": 0, + "xdm:hideCount": 0, + "xdm:reportCount": 0, + "xdm:organicImpressions": 0, + "xdm:organicReach": 0, + "xdm:viralImpressions": 0, + "xdm:viralReach": 0 + }, + "xdm:callToAction": { + "xdm:type": "learn_more", + "xdm:text": "Learn More", + "xdm:url": "https://www.acmecorp.com/solutions?utm_source=google&utm_medium=display&utm_campaign=tech_solutions", + "xdm:displayUrl": "acmecorp.com/solutions", + "xdm:deepLink": "", + "xdm:trackingTemplate": "{lpurl}?ad_id={creative}&placement={placement}", + "xdm:utmParameters": { + "xdm:source": "google", + "xdm:medium": "display", + "xdm:campaign": "tech_solutions", + "xdm:content": "responsive_display", + "xdm:term": "" + } + }, + "xdm:linkProperties": { + "xdm:destinationURL": "https://www.acmecorp.com/solutions", + "xdm:displayURL": "acmecorp.com", + "xdm:urlTags": "utm_source=google&utm_medium=display&utm_campaign=tech_solutions", + "xdm:trackingPixels": [], + "xdm:clickTrackers": [], + "xdm:conversionTracking": true, + "xdm:conversionPixelID": "" + }, + "xdm:appProperties": { + "xdm:appID": "", + "xdm:appName": "", + "xdm:appPlatform": "", + "xdm:appStoreURL": "", + "xdm:appDeepLink": "", + "xdm:appEventTracking": false, + "xdm:appEventName": "", + "xdm:sdkVersion": "" + }, + "xdm:leadGenProperties": { + "xdm:formID": "form_not_applicable", + "xdm:formType": "not_applicable", + "xdm:instantForm": false, + "xdm:privacyPolicyURL": "https://www.acmecorp.com/privacy", + "xdm:customDisclaimer": "" + }, + "xdm:interactionProperties": { + "xdm:allowInteraction": true, + "xdm:interactionType": "click", + "xdm:swipeUpEnabled": false, + "xdm:pollEnabled": false, + "xdm:quizEnabled": false, + "xdm:gamificationEnabled": false, + "xdm:arEnabled": false, + "xdm:threeDEnabled": false + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "google_ad_id", + "xdm:stringValue": "8888999900" + }, + { + "xdm:fieldName": "google_ad_group_id", + "xdm:stringValue": "5555666677" + }, + { + "xdm:fieldName": "google_campaign_id", + "xdm:stringValue": "9876543210" + }, + { + "xdm:fieldName": "google_ad_type", + "xdm:stringValue": "RESPONSIVE_DISPLAY_AD" + }, + { + "xdm:fieldName": "google_ad_status", + "xdm:stringValue": "ENABLED" + }, + { + "xdm:fieldName": "google_policy_summary_approval_status", + "xdm:stringValue": "APPROVED" + }, + { + "xdm:fieldName": "google_ad_strength", + "xdm:stringValue": "EXCELLENT" + } + ] + } + } +} diff --git a/schemas/paid-media/paid-media-ad-lookup.schema.json b/schemas/paid-media/paid-media-ad-lookup.schema.json new file mode 100644 index 000000000..9758f1bef --- /dev/null +++ b/schemas/paid-media/paid-media-ad-lookup.schema.json @@ -0,0 +1,37 @@ +{ + "meta:license": [ + "Copyright 2025 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "https://ns.adobe.com/xdm/schemas/paid-media-ad-lookup", + "title": "Paid Media Ad Lookup", + "type": "object", + "description": "Schema for paid media ad lookup dataset containing individual ad metadata across all ad networks", + "meta:class": "https://ns.adobe.com/xdm/data/record", + "meta:extensible": false, + "meta:abstract": false, + "meta:extends": [ + "https://ns.adobe.com/xdm/data/record", + "https://ns.adobe.com/xdm/mixins/paid-media/core-identifiers", + "https://ns.adobe.com/xdm/mixins/paid-media/core-metadata", + "https://ns.adobe.com/xdm/mixins/paid-media/ad-details" + ], + "allOf": [ + { + "$ref": "https://ns.adobe.com/xdm/data/record" + }, + { + "$ref": "https://ns.adobe.com/xdm/mixins/paid-media/core-identifiers" + }, + { + "$ref": "https://ns.adobe.com/xdm/mixins/paid-media/core-metadata" + }, + { + "$ref": "https://ns.adobe.com/xdm/mixins/paid-media/ad-details" + } + ], + "meta:status": "experimental" +} diff --git a/schemas/paid-media/paid-media-adgroup-lookup.example.1.json b/schemas/paid-media/paid-media-adgroup-lookup.example.1.json new file mode 100644 index 000000000..f1a859ee8 --- /dev/null +++ b/schemas/paid-media/paid-media-adgroup-lookup.example.1.json @@ -0,0 +1,237 @@ +{ + "xdm:paidMedia": { + "xdm:adNetwork": "meta", + "xdm:entityType": "adGroup", + "xdm:accountID": "act_123456789012345", + "xdm:accountGUID": "meta_act_123456789012345", + "xdm:campaignID": "23851234567890789", + "xdm:campaignGUID": "meta_act_123456789012345_23851234567890789", + "xdm:adGroupID": "23851234567890456", + "xdm:adGroupGUID": "meta_act_123456789012345_23851234567890456", + "xdm:hierarchyPath": "act_123456789012345/23851234567890789/23851234567890456", + "xdm:metadata": { + "xdm:name": "Fall Launch - Video - 25-54 - Tech Enthusiasts", + "xdm:status": "active", + "xdm:servingStatus": "CAMPAIGN_STATUS_ENABLED", + "xdm:currency": "USD", + "xdm:timezone": "America/Los_Angeles", + "xdm:createdTime": "2025-10-20T12:00:00Z", + "xdm:updatedTime": "2025-11-09T14:00:00Z", + "xdm:startTime": "2025-11-01T00:00:00Z", + "xdm:endTime": "2025-11-30T23:59:59Z", + "xdm:objective": "traffic", + "xdm:budgetType": "daily", + "xdm:dailyBudget": 500, + "xdm:lifetimeBudget": 0, + "xdm:biddingStrategy": "lowest_cost_without_cap", + "xdm:optimizationGoal": "link_clicks" + }, + "xdm:adGroupDetails": { + "xdm:adGroupType": "standard", + "xdm:childAdType": "video", + "xdm:budgetSettings": { + "xdm:budgetType": "daily", + "xdm:dailyBudget": 500, + "xdm:lifetimeBudget": 0, + "xdm:budgetRemaining": 350, + "xdm:budgetSpent": 150, + "xdm:budgetUtilization": 0.3, + "xdm:pacing": "standard", + "xdm:pacingType": "standard", + "xdm:budgetOptimization": false, + "xdm:sharedBudget": false, + "xdm:budgetResetTime": "00:00:00", + "xdm:budgetTimezone": "America/Los_Angeles" + }, + "xdm:targetingSettings": { + "xdm:geoTargeting": { + "xdm:countries": ["US"], + "xdm:regions": ["California", "New York", "Texas", "Florida"], + "xdm:cities": [ + "San Francisco", + "Los Angeles", + "New York", + "Austin", + "Miami" + ], + "xdm:postalCodes": [], + "xdm:dmas": ["807", "501", "803"], + "xdm:radius": 0, + "xdm:radiusUnit": "mile", + "xdm:locationType": "home" + }, + "xdm:demographicTargeting": { + "xdm:ageMin": 25, + "xdm:ageMax": 54, + "xdm:genders": ["male", "female"], + "xdm:languages": ["en"], + "xdm:education": ["college", "grad_school"], + "xdm:relationshipStatus": [], + "xdm:workEmployers": [], + "xdm:workPositions": ["manager", "director", "executive"] + }, + "xdm:interestTargeting": { + "xdm:interests": [ + "Technology", + "Business", + "Innovation", + "Entrepreneurship" + ], + "xdm:behaviors": [ + "Early technology adopters", + "Business decision makers" + ], + "xdm:lifeEvents": [] + }, + "xdm:audienceTargeting": { + "xdm:customAudiences": [ + "audience_website_visitors_30d", + "audience_app_users" + ], + "xdm:lookalikeSources": ["audience_purchasers_90d"], + "xdm:lookalikeSimilarity": 0.05, + "xdm:excludedAudiences": ["audience_existing_customers"], + "xdm:audienceExpansion": true, + "xdm:detailedTargeting": "expansion_all" + }, + "xdm:deviceTargeting": { + "xdm:devices": ["mobile", "desktop"], + "xdm:platforms": ["ios", "android", "windows", "mac"], + "xdm:osVersions": [], + "xdm:deviceModels": [], + "xdm:connectionTypes": ["wifi", "cellular"] + } + }, + "xdm:optimizationSettings": { + "xdm:optimizationGoal": "link_clicks", + "xdm:billingEvent": "impressions", + "xdm:bidStrategy": "lowest_cost_without_cap", + "xdm:bidAmount": 0, + "xdm:bidCap": 0, + "xdm:costCap": 0, + "xdm:roas": 0, + "xdm:optimizationEvent": "LINK_CLICK", + "xdm:conversionWindow": "7d_click_1d_view", + "xdm:attributionSetting": "7_day_click_1_day_view", + "xdm:deliveryType": "standard", + "xdm:campaignBudgetOptimization": false + }, + "xdm:placementSettings": { + "xdm:placementType": "automatic", + "xdm:placements": [ + "facebook_feed", + "instagram_feed", + "facebook_marketplace", + "facebook_video_feeds", + "facebook_right_column", + "instagram_explore", + "instagram_reels", + "messenger_inbox", + "audience_network_native", + "audience_network_banner", + "audience_network_interstitial", + "audience_network_rewarded_video" + ], + "xdm:excludedPlacements": [], + "xdm:publisherPlatforms": [ + "facebook", + "instagram", + "messenger", + "audience_network" + ], + "xdm:devicePlatforms": ["mobile", "desktop"], + "xdm:facebookPositions": [ + "feed", + "marketplace", + "video_feeds", + "right_column", + "instant_article", + "instream_video" + ], + "xdm:instagramPositions": ["stream", "story", "explore", "reels"], + "xdm:messengerPositions": ["messenger_home", "sponsored_messages"], + "xdm:audienceNetworkPositions": [ + "classic", + "instream_video", + "rewarded_video" + ] + }, + "xdm:deliverySettings": { + "xdm:startTime": "2025-11-01T00:00:00Z", + "xdm:endTime": "2025-11-30T23:59:59Z", + "xdm:scheduleType": "continuous", + "xdm:dayParting": false, + "xdm:dayPartingSchedule": [], + "xdm:frequencyCap": { + "xdm:enabled": true, + "xdm:impressions": 3, + "xdm:period": "day" + }, + "xdm:deliveryEstimate": "good", + "xdm:learningPhase": "learning", + "xdm:minimumRoas": 0 + }, + "xdm:trackingSettings": { + "xdm:pixelID": "pixel_123456789", + "xdm:conversionTracking": true, + "xdm:offlineConversionTracking": false, + "xdm:appEventTracking": true, + "xdm:urlParameters": "utm_source=facebook&utm_medium=paid&utm_campaign=fall2025&utm_content=video_adset", + "xdm:trackingSpecs": [ + { + "xdm:eventType": "LINK_CLICK", + "xdm:eventSource": "pixel", + "xdm:eventID": "pixel_123456789" + }, + { + "xdm:eventType": "PAGE_VIEW", + "xdm:eventSource": "pixel", + "xdm:eventID": "pixel_123456789" + } + ] + }, + "xdm:brandSafetySettings": { + "xdm:blockLists": ["block_list_sensitive_content"], + "xdm:inventoryFilter": "standard", + "xdm:contentCategories": ["news", "entertainment", "technology"], + "xdm:excludedCategories": ["mature_content", "political"], + "xdm:publisherBlockLists": [], + "xdm:appBlockLists": [] + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "meta_adset_id", + "xdm:stringValue": "23851234567890456" + }, + { + "xdm:fieldName": "meta_campaign_id", + "xdm:stringValue": "23851234567890789" + }, + { + "xdm:fieldName": "meta_adset_name", + "xdm:stringValue": "Fall Launch - Video - 25-54 - Tech Enthusiasts" + }, + { + "xdm:fieldName": "meta_optimization_goal", + "xdm:stringValue": "LINK_CLICKS" + }, + { + "xdm:fieldName": "meta_billing_event", + "xdm:stringValue": "IMPRESSIONS" + }, + { + "xdm:fieldName": "meta_bid_strategy", + "xdm:stringValue": "LOWEST_COST_WITHOUT_CAP" + }, + { + "xdm:fieldName": "meta_destination_type", + "xdm:stringValue": "WEBSITE" + }, + { + "xdm:fieldName": "meta_promoted_object_type", + "xdm:stringValue": "PAGE" + } + ] + } + } +} diff --git a/schemas/paid-media/paid-media-adgroup-lookup.example.2.json b/schemas/paid-media/paid-media-adgroup-lookup.example.2.json new file mode 100644 index 000000000..0f83defeb --- /dev/null +++ b/schemas/paid-media/paid-media-adgroup-lookup.example.2.json @@ -0,0 +1,213 @@ +{ + "xdm:paidMedia": { + "xdm:adNetwork": "google_ads", + "xdm:entityType": "adGroup", + "xdm:accountID": "1234567890", + "xdm:accountGUID": "google_ads_1234567890", + "xdm:campaignID": "9876543210", + "xdm:campaignGUID": "google_ads_1234567890_9876543210", + "xdm:adGroupID": "5555666677", + "xdm:adGroupGUID": "google_ads_1234567890_5555666677", + "xdm:hierarchyPath": "1234567890/9876543210/5555666677", + "xdm:metadata": { + "xdm:name": "Tech Professionals - Responsive Display", + "xdm:status": "active", + "xdm:servingStatus": "CAMPAIGN_STATUS_ENABLED", + "xdm:currency": "USD", + "xdm:timezone": "America/New_York", + "xdm:createdTime": "2025-09-15T10:00:00Z", + "xdm:updatedTime": "2025-11-09T09:00:00Z", + "xdm:startTime": "2025-10-01T00:00:00Z", + "xdm:objective": "awareness", + "xdm:budgetType": "daily", + "xdm:dailyBudget": 0, + "xdm:lifetimeBudget": 0, + "xdm:biddingStrategy": "target_cpm", + "xdm:optimizationGoal": "impressions" + }, + "xdm:adGroupDetails": { + "xdm:adGroupType": "standard", + "xdm:childAdType": "responsive_display", + "xdm:budgetSettings": { + "xdm:budgetType": "campaign", + "xdm:dailyBudget": 0, + "xdm:lifetimeBudget": 0, + "xdm:budgetRemaining": 0, + "xdm:budgetSpent": 18500, + "xdm:budgetUtilization": 0, + "xdm:pacing": "standard", + "xdm:pacingType": "standard", + "xdm:budgetOptimization": false, + "xdm:sharedBudget": false, + "xdm:budgetResetTime": "00:00:00", + "xdm:budgetTimezone": "America/New_York" + }, + "xdm:targetingSettings": { + "xdm:geoTargeting": { + "xdm:countries": ["US"], + "xdm:regions": [ + "New York", + "California", + "Massachusetts", + "Washington" + ], + "xdm:cities": ["New York", "San Francisco", "Boston", "Seattle"], + "xdm:postalCodes": [], + "xdm:dmas": [], + "xdm:radius": 0, + "xdm:radiusUnit": "mile", + "xdm:locationType": "presence" + }, + "xdm:demographicTargeting": { + "xdm:ageMin": 25, + "xdm:ageMax": 65, + "xdm:genders": ["male", "female"], + "xdm:languages": ["en"], + "xdm:education": [], + "xdm:relationshipStatus": [], + "xdm:workEmployers": [], + "xdm:workPositions": [] + }, + "xdm:interestTargeting": { + "xdm:interests": [ + "Technology & Computing", + "Business & Industrial", + "Software" + ], + "xdm:behaviors": [], + "xdm:lifeEvents": [] + }, + "xdm:audienceTargeting": { + "xdm:customAudiences": [ + "remarketing_website_visitors", + "customer_match_list" + ], + "xdm:lookalikeSources": [], + "xdm:lookalikeSimilarity": 0, + "xdm:excludedAudiences": ["converters_last_30d"], + "xdm:audienceExpansion": true, + "xdm:detailedTargeting": "" + }, + "xdm:deviceTargeting": { + "xdm:devices": ["mobile", "desktop", "tablet"], + "xdm:platforms": [], + "xdm:osVersions": [], + "xdm:deviceModels": [], + "xdm:connectionTypes": [] + } + }, + "xdm:optimizationSettings": { + "xdm:optimizationGoal": "impressions", + "xdm:billingEvent": "impressions", + "xdm:bidStrategy": "target_cpm", + "xdm:bidAmount": 5.0, + "xdm:bidCap": 0, + "xdm:costCap": 0, + "xdm:roas": 0, + "xdm:optimizationEvent": "", + "xdm:conversionWindow": "", + "xdm:attributionSetting": "", + "xdm:deliveryType": "standard", + "xdm:campaignBudgetOptimization": false + }, + "xdm:placementSettings": { + "xdm:placementType": "automatic", + "xdm:placements": [ + "google_display_network", + "youtube", + "gmail", + "discover" + ], + "xdm:excludedPlacements": [], + "xdm:publisherPlatforms": [], + "xdm:devicePlatforms": ["mobile", "desktop", "tablet"], + "xdm:facebookPositions": [], + "xdm:instagramPositions": [], + "xdm:messengerPositions": [], + "xdm:audienceNetworkPositions": [] + }, + "xdm:deliverySettings": { + "xdm:startTime": "2025-10-01T00:00:00Z", + "xdm:scheduleType": "continuous", + "xdm:dayParting": true, + "xdm:dayPartingSchedule": [ + { + "xdm:dayOfWeek": "monday", + "xdm:startHour": 9, + "xdm:endHour": 21 + }, + { + "xdm:dayOfWeek": "tuesday", + "xdm:startHour": 9, + "xdm:endHour": 21 + }, + { + "xdm:dayOfWeek": "wednesday", + "xdm:startHour": 9, + "xdm:endHour": 21 + }, + { + "xdm:dayOfWeek": "thursday", + "xdm:startHour": 9, + "xdm:endHour": 21 + }, + { + "xdm:dayOfWeek": "friday", + "xdm:startHour": 9, + "xdm:endHour": 21 + } + ], + "xdm:frequencyCap": { + "xdm:enabled": true, + "xdm:impressions": 3, + "xdm:period": "day" + }, + "xdm:deliveryEstimate": "good", + "xdm:learningPhase": "completed", + "xdm:minimumRoas": 0 + }, + "xdm:trackingSettings": { + "xdm:pixelID": "", + "xdm:conversionTracking": true, + "xdm:offlineConversionTracking": false, + "xdm:appEventTracking": false, + "xdm:urlParameters": "utm_source=google&utm_medium=display&utm_campaign=brand_awareness&utm_content=tech_professionals", + "xdm:trackingSpecs": [] + }, + "xdm:brandSafetySettings": { + "xdm:blockLists": [], + "xdm:inventoryFilter": "expanded", + "xdm:contentCategories": [], + "xdm:excludedCategories": ["mature_content"], + "xdm:publisherBlockLists": [], + "xdm:appBlockLists": [] + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "google_ad_group_id", + "xdm:stringValue": "5555666677" + }, + { + "xdm:fieldName": "google_campaign_id", + "xdm:stringValue": "9876543210" + }, + { + "xdm:fieldName": "google_ad_group_name", + "xdm:stringValue": "Tech Professionals - Responsive Display" + }, + { + "xdm:fieldName": "google_ad_group_type", + "xdm:stringValue": "DISPLAY_STANDARD" + }, + { + "xdm:fieldName": "google_ad_group_status", + "xdm:stringValue": "ENABLED" + }, + { + "xdm:fieldName": "google_target_cpm_micros", + "xdm:stringValue": "5000000" + } + ] + } + } +} diff --git a/schemas/paid-media/paid-media-adgroup-lookup.schema.json b/schemas/paid-media/paid-media-adgroup-lookup.schema.json new file mode 100644 index 000000000..f869ab43b --- /dev/null +++ b/schemas/paid-media/paid-media-adgroup-lookup.schema.json @@ -0,0 +1,37 @@ +{ + "meta:license": [ + "Copyright 2025 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "https://ns.adobe.com/xdm/schemas/paid-media-adgroup-lookup", + "title": "Paid Media Ad Group Lookup", + "type": "object", + "description": "Schema for paid media ad group/ad set/ad squad lookup dataset containing ad group metadata across all ad networks", + "meta:class": "https://ns.adobe.com/xdm/data/record", + "meta:extensible": false, + "meta:abstract": false, + "meta:extends": [ + "https://ns.adobe.com/xdm/data/record", + "https://ns.adobe.com/xdm/mixins/paid-media/core-identifiers", + "https://ns.adobe.com/xdm/mixins/paid-media/core-metadata", + "https://ns.adobe.com/xdm/mixins/paid-media/adgroup-details" + ], + "allOf": [ + { + "$ref": "https://ns.adobe.com/xdm/data/record" + }, + { + "$ref": "https://ns.adobe.com/xdm/mixins/paid-media/core-identifiers" + }, + { + "$ref": "https://ns.adobe.com/xdm/mixins/paid-media/core-metadata" + }, + { + "$ref": "https://ns.adobe.com/xdm/mixins/paid-media/adgroup-details" + } + ], + "meta:status": "experimental" +} diff --git a/schemas/paid-media/paid-media-asset-lookup.example.1.json b/schemas/paid-media/paid-media-asset-lookup.example.1.json new file mode 100644 index 000000000..f5b901efb --- /dev/null +++ b/schemas/paid-media/paid-media-asset-lookup.example.1.json @@ -0,0 +1,190 @@ +{ + "xdm:paidMedia": { + "xdm:adNetwork": "meta", + "xdm:entityType": "asset", + "xdm:accountID": "act_123456789012345", + "xdm:accountGUID": "meta_act_123456789012345", + "xdm:assetID": "987654321012345", + "xdm:assetGUID": "meta_act_123456789012345_asset_987654321012345", + "xdm:metadata": { + "xdm:name": "Fall Product Launch - 30 Second Video", + "xdm:status": "active", + "xdm:createdTime": "2025-10-25T14:00:00Z", + "xdm:updatedTime": "2025-11-05T10:00:00Z" + }, + "xdm:assetDetails": { + "xdm:assetType": "video", + "xdm:assetFormat": "mp4", + "xdm:assetSubType": "feed_video", + "xdm:assetCategory": "product_demo", + "xdm:assetSource": "uploaded", + "xdm:assetLibrary": "meta_creative_hub", + "xdm:assetOwner": "acme_corp", + "xdm:assetPermissions": "private", + "xdm:isStockAsset": false, + "xdm:stockProvider": "", + "xdm:stockAssetID": "", + "xdm:licenseType": "owned", + "xdm:rightsManagement": { + "xdm:copyrightOwner": "Acme Corporation", + "xdm:licenseExpiration": "", + "xdm:usageRights": "unlimited", + "xdm:geographicRestrictions": [], + "xdm:platformRestrictions": [], + "xdm:exclusivityPeriod": "" + }, + "xdm:fileProperties": { + "xdm:fileName": "fall_product_launch_30s_v2.mp4", + "xdm:fileSize": 45678912, + "xdm:fileSizeUnit": "bytes", + "xdm:fileHash": "sha256:abc123def456ghi789jkl012mno345pqr678stu901vwx234yz", + "xdm:mimeType": "video/mp4", + "xdm:encoding": "h264", + "xdm:bitrate": 5000, + "xdm:bitrateUnit": "kbps", + "xdm:colorSpace": "sRGB", + "xdm:colorDepth": 24, + "xdm:compressionType": "lossy" + }, + "xdm:urlProperties": { + "xdm:assetURL": "https://video.xx.fbcdn.net/v/t42.1790-2/987654321012345_video.mp4", + "xdm:thumbnailURL": "https://scontent.xx.fbcdn.net/v/t45.1600-4/987654321012345_thumb.jpg", + "xdm:previewURL": "https://business.facebook.com/creatives/preview/987654321012345", + "xdm:downloadURL": "https://business.facebook.com/creatives/download/987654321012345", + "xdm:cdnURL": "https://cdn.acmecorp.com/assets/fall_product_launch_30s_v2.mp4", + "xdm:streamingURL": "https://stream.acmecorp.com/assets/987654321012345/manifest.m3u8", + "xdm:embedCode": "" + }, + "xdm:videoProperties": { + "xdm:duration": 30.5, + "xdm:durationUnit": "seconds", + "xdm:width": 1920, + "xdm:height": 1080, + "xdm:aspectRatio": "16:9", + "xdm:orientation": "landscape", + "xdm:frameRate": 30, + "xdm:frameRateUnit": "fps", + "xdm:videoCodec": "h264", + "xdm:audioCodec": "aac", + "xdm:audioChannels": 2, + "xdm:audioSampleRate": 48000, + "xdm:audioBitrate": 192, + "xdm:hasAudio": true, + "xdm:hasSubtitles": true, + "xdm:subtitleLanguages": ["en", "es", "fr"], + "xdm:closedCaptions": true, + "xdm:captionFormat": "srt", + "xdm:videoQuality": "1080p", + "xdm:hdrEnabled": false, + "xdm:is360": false, + "xdm:isVertical": false, + "xdm:isSquare": false, + "xdm:autoplay": true, + "xdm:looping": false, + "xdm:soundOn": true + }, + "xdm:contentProperties": { + "xdm:title": "Introducing Our Revolutionary New Product", + "xdm:description": "Experience the future of technology with our latest innovation. Available now for a limited time.", + "xdm:headline": "Revolutionary Innovation", + "xdm:bodyText": "Transform your workflow with cutting-edge features designed for modern professionals.", + "xdm:callToAction": "Learn More", + "xdm:brandName": "Acme Corp", + "xdm:productName": "Acme Pro X", + "xdm:tagline": "Innovation Meets Excellence", + "xdm:keywords": [ + "technology", + "innovation", + "productivity", + "professional", + "software" + ], + "xdm:hashtags": [ + "#AcmeCorp", + "#Innovation", + "#TechSolutions", + "#ProductLaunch" + ], + "xdm:mentions": ["@AcmeCorp"], + "xdm:language": "en", + "xdm:locale": "en_US" + }, + "xdm:creativeElements": { + "xdm:primaryColor": "#0066CC", + "xdm:secondaryColor": "#FFFFFF", + "xdm:accentColor": "#FF6600", + "xdm:backgroundColor": "#F5F5F5", + "xdm:textColor": "#333333", + "xdm:fontFamily": "Helvetica Neue", + "xdm:logoIncluded": true, + "xdm:logoPosition": "top_left", + "xdm:brandingLevel": "prominent", + "xdm:visualStyle": "modern", + "xdm:mood": "professional", + "xdm:tone": "confident" + }, + "xdm:performanceMetadata": { + "xdm:assetScore": 8.5, + "xdm:qualityScore": 9.2, + "xdm:relevanceScore": 8.8, + "xdm:engagementScore": 8.3, + "xdm:creativeFatigue": 0.15, + "xdm:freshnessScore": 0.95, + "xdm:adStrength": "excellent", + "xdm:predictedPerformance": "high", + "xdm:benchmarkComparison": "above_average" + }, + "xdm:usageTracking": { + "xdm:timesUsed": 12, + "xdm:activeCampaigns": 3, + "xdm:activeAdGroups": 5, + "xdm:activeAds": 8, + "xdm:firstUsedDate": "2025-11-01T00:00:00Z", + "xdm:lastUsedDate": "2025-11-09T15:00:00Z", + "xdm:totalImpressions": 1250000, + "xdm:totalClicks": 45000, + "xdm:totalSpend": 12500 + }, + "xdm:reviewStatus": { + "xdm:status": "approved", + "xdm:reviewDate": "2025-10-26T10:00:00Z", + "xdm:reviewerID": "meta_reviewer_456", + "xdm:reviewNotes": "Approved - high quality video content", + "xdm:policyViolations": [], + "xdm:appealStatus": "not_applicable", + "xdm:autoApproved": false, + "xdm:requiresManualReview": true + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "meta_video_id", + "xdm:stringValue": "987654321012345" + }, + { + "xdm:fieldName": "meta_video_title", + "xdm:stringValue": "Fall Product Launch - 30 Second Video" + }, + { + "xdm:fieldName": "meta_upload_date", + "xdm:stringValue": "2025-10-25T14:00:00Z" + }, + { + "xdm:fieldName": "meta_video_status", + "xdm:stringValue": "ready" + }, + { + "xdm:fieldName": "meta_video_type", + "xdm:stringValue": "uploaded" + }, + { + "xdm:fieldName": "meta_thumbnail_source", + "xdm:stringValue": "auto_generated" + }, + { + "xdm:fieldName": "meta_video_insights_enabled", + "xdm:stringValue": "true" + } + ] + } + } +} diff --git a/schemas/paid-media/paid-media-asset-lookup.example.2.json b/schemas/paid-media/paid-media-asset-lookup.example.2.json new file mode 100644 index 000000000..2c88d328b --- /dev/null +++ b/schemas/paid-media/paid-media-asset-lookup.example.2.json @@ -0,0 +1,169 @@ +{ + "xdm:paidMedia": { + "xdm:adNetwork": "meta", + "xdm:entityType": "asset", + "xdm:accountID": "act_123456789012345", + "xdm:accountGUID": "meta_act_123456789012345", + "xdm:assetID": "456789123456789", + "xdm:assetGUID": "meta_act_123456789012345_asset_456789123456789", + "xdm:metadata": { + "xdm:name": "Holiday Sale - Hero Banner Image", + "xdm:status": "active", + "xdm:createdTime": "2025-10-28T09:00:00Z", + "xdm:updatedTime": "2025-11-01T08:00:00Z" + }, + "xdm:assetDetails": { + "xdm:assetType": "image", + "xdm:assetFormat": "jpg", + "xdm:assetSubType": "feed_image", + "xdm:assetCategory": "promotional", + "xdm:assetSource": "uploaded", + "xdm:assetLibrary": "meta_creative_hub", + "xdm:assetOwner": "acme_corp", + "xdm:assetPermissions": "private", + "xdm:isStockAsset": false, + "xdm:stockProvider": "", + "xdm:stockAssetID": "", + "xdm:licenseType": "owned", + "xdm:rightsManagement": { + "xdm:copyrightOwner": "Acme Corporation", + "xdm:licenseExpiration": "", + "xdm:usageRights": "unlimited", + "xdm:geographicRestrictions": [], + "xdm:platformRestrictions": [], + "xdm:exclusivityPeriod": "" + }, + "xdm:fileProperties": { + "xdm:fileName": "holiday_sale_hero_banner_1200x628.jpg", + "xdm:fileSize": 2456789, + "xdm:fileSizeUnit": "bytes", + "xdm:fileHash": "sha256:xyz789abc123def456ghi789jkl012mno345pqr678stu901vwx234", + "xdm:mimeType": "image/jpeg", + "xdm:encoding": "", + "xdm:bitrate": 0, + "xdm:bitrateUnit": "", + "xdm:colorSpace": "sRGB", + "xdm:colorDepth": 24, + "xdm:compressionType": "lossy" + }, + "xdm:urlProperties": { + "xdm:assetURL": "https://scontent.xx.fbcdn.net/v/t45.1600-4/456789123456789_image.jpg", + "xdm:thumbnailURL": "https://scontent.xx.fbcdn.net/v/t45.1600-4/456789123456789_thumb.jpg", + "xdm:previewURL": "https://business.facebook.com/creatives/preview/456789123456789", + "xdm:downloadURL": "https://business.facebook.com/creatives/download/456789123456789", + "xdm:cdnURL": "https://cdn.acmecorp.com/assets/holiday_sale_hero_banner.jpg", + "xdm:streamingURL": "", + "xdm:embedCode": "" + }, + "xdm:imageProperties": { + "xdm:width": 1200, + "xdm:height": 628, + "xdm:aspectRatio": "1.91:1", + "xdm:orientation": "landscape", + "xdm:resolution": 72, + "xdm:resolutionUnit": "dpi", + "xdm:format": "jpeg", + "xdm:transparency": false, + "xdm:animated": false, + "xdm:frameCount": 1, + "xdm:colorProfile": "sRGB IEC61966-2.1", + "xdm:hasAlphaChannel": false, + "xdm:imageQuality": "high", + "xdm:optimizedForWeb": true, + "xdm:progressive": true + }, + "xdm:contentProperties": { + "xdm:title": "Holiday Sale - Up to 50% Off", + "xdm:description": "Don't miss our biggest sale of the year! Save up to 50% on select products.", + "xdm:headline": "Holiday Sale", + "xdm:bodyText": "Up to 50% Off Select Items", + "xdm:callToAction": "Shop Now", + "xdm:brandName": "Acme Corp", + "xdm:productName": "", + "xdm:tagline": "Limited Time Offer", + "xdm:keywords": ["sale", "holiday", "discount", "shopping", "deals"], + "xdm:hashtags": [ + "#HolidaySale", + "#AcmeCorp", + "#ShopNow", + "#LimitedTime" + ], + "xdm:mentions": ["@AcmeCorp"], + "xdm:language": "en", + "xdm:locale": "en_US" + }, + "xdm:creativeElements": { + "xdm:primaryColor": "#CC0000", + "xdm:secondaryColor": "#FFFFFF", + "xdm:accentColor": "#FFD700", + "xdm:backgroundColor": "#F8F8F8", + "xdm:textColor": "#FFFFFF", + "xdm:fontFamily": "Arial", + "xdm:logoIncluded": true, + "xdm:logoPosition": "top_center", + "xdm:brandingLevel": "prominent", + "xdm:visualStyle": "bold", + "xdm:mood": "exciting", + "xdm:tone": "urgent" + }, + "xdm:performanceMetadata": { + "xdm:assetScore": 7.8, + "xdm:qualityScore": 8.5, + "xdm:relevanceScore": 8.2, + "xdm:engagementScore": 7.5, + "xdm:creativeFatigue": 0.25, + "xdm:freshnessScore": 0.9, + "xdm:adStrength": "good", + "xdm:predictedPerformance": "medium_high", + "xdm:benchmarkComparison": "average" + }, + "xdm:usageTracking": { + "xdm:timesUsed": 8, + "xdm:activeCampaigns": 2, + "xdm:activeAdGroups": 3, + "xdm:activeAds": 5, + "xdm:firstUsedDate": "2025-11-01T00:00:00Z", + "xdm:lastUsedDate": "2025-11-09T12:00:00Z", + "xdm:totalImpressions": 850000, + "xdm:totalClicks": 28000, + "xdm:totalSpend": 7500 + }, + "xdm:reviewStatus": { + "xdm:status": "approved", + "xdm:reviewDate": "2025-10-29T09:00:00Z", + "xdm:reviewerID": "meta_reviewer_789", + "xdm:reviewNotes": "Approved - meets all policy requirements", + "xdm:policyViolations": [], + "xdm:appealStatus": "not_applicable", + "xdm:autoApproved": true, + "xdm:requiresManualReview": false + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "meta_image_hash", + "xdm:stringValue": "abc123def456ghi789jkl012" + }, + { + "xdm:fieldName": "meta_image_name", + "xdm:stringValue": "Holiday Sale - Hero Banner Image" + }, + { + "xdm:fieldName": "meta_upload_date", + "xdm:stringValue": "2025-10-28T09:00:00Z" + }, + { + "xdm:fieldName": "meta_image_status", + "xdm:stringValue": "active" + }, + { + "xdm:fieldName": "meta_image_type", + "xdm:stringValue": "uploaded" + }, + { + "xdm:fieldName": "meta_image_category", + "xdm:stringValue": "promotional" + } + ] + } + } +} diff --git a/schemas/paid-media/paid-media-asset-lookup.example.3.json b/schemas/paid-media/paid-media-asset-lookup.example.3.json new file mode 100644 index 000000000..943bfcefc --- /dev/null +++ b/schemas/paid-media/paid-media-asset-lookup.example.3.json @@ -0,0 +1,170 @@ +{ + "xdm:paidMedia": { + "xdm:adNetwork": "google_ads", + "xdm:entityType": "asset", + "xdm:accountID": "1234567890", + "xdm:accountGUID": "google_ads_1234567890", + "xdm:assetID": "222333444555", + "xdm:assetGUID": "google_ads_1234567890_asset_222333444555", + "xdm:metadata": { + "xdm:name": "Tech Solutions - Product Image 1", + "xdm:status": "active", + "xdm:createdTime": "2025-09-18T11:00:00Z", + "xdm:updatedTime": "2025-10-05T14:00:00Z" + }, + "xdm:assetDetails": { + "xdm:assetType": "image", + "xdm:assetFormat": "png", + "xdm:assetSubType": "marketing_image", + "xdm:assetCategory": "product", + "xdm:assetSource": "uploaded", + "xdm:assetLibrary": "google_ads_asset_library", + "xdm:assetOwner": "acme_corp", + "xdm:assetPermissions": "private", + "xdm:isStockAsset": false, + "xdm:stockProvider": "", + "xdm:stockAssetID": "", + "xdm:licenseType": "owned", + "xdm:rightsManagement": { + "xdm:copyrightOwner": "Acme Corporation", + "xdm:licenseExpiration": "", + "xdm:usageRights": "unlimited", + "xdm:geographicRestrictions": [], + "xdm:platformRestrictions": [], + "xdm:exclusivityPeriod": "" + }, + "xdm:fileProperties": { + "xdm:fileName": "tech_solutions_product_1_1200x1200.png", + "xdm:fileSize": 3456789, + "xdm:fileSizeUnit": "bytes", + "xdm:fileHash": "sha256:pqr678stu901vwx234yz567abc123def456ghi789jkl012mno345", + "xdm:mimeType": "image/png", + "xdm:encoding": "", + "xdm:bitrate": 0, + "xdm:bitrateUnit": "", + "xdm:colorSpace": "sRGB", + "xdm:colorDepth": 32, + "xdm:compressionType": "lossless" + }, + "xdm:urlProperties": { + "xdm:assetURL": "https://googleads.g.doubleclick.net/pagead/imgad?id=222333444555", + "xdm:thumbnailURL": "https://googleads.g.doubleclick.net/pagead/imgad?id=222333444555&sz=150x150", + "xdm:previewURL": "https://ads.google.com/aw/assets/preview/222333444555", + "xdm:downloadURL": "https://ads.google.com/aw/assets/download/222333444555", + "xdm:cdnURL": "https://cdn.acmecorp.com/assets/tech_solutions_product_1.png", + "xdm:streamingURL": "", + "xdm:embedCode": "" + }, + "xdm:imageProperties": { + "xdm:width": 1200, + "xdm:height": 1200, + "xdm:aspectRatio": "1:1", + "xdm:orientation": "square", + "xdm:resolution": 300, + "xdm:resolutionUnit": "dpi", + "xdm:format": "png", + "xdm:transparency": true, + "xdm:animated": false, + "xdm:frameCount": 1, + "xdm:colorProfile": "sRGB IEC61966-2.1", + "xdm:hasAlphaChannel": true, + "xdm:imageQuality": "high", + "xdm:optimizedForWeb": true, + "xdm:progressive": false + }, + "xdm:contentProperties": { + "xdm:title": "Acme Pro X - Professional Software Solution", + "xdm:description": "Transform your business with our cutting-edge software platform designed for modern enterprises.", + "xdm:headline": "Professional Software Solution", + "xdm:bodyText": "Streamline operations and boost productivity", + "xdm:callToAction": "Learn More", + "xdm:brandName": "Acme Corp", + "xdm:productName": "Acme Pro X", + "xdm:tagline": "Built for Excellence", + "xdm:keywords": [ + "software", + "enterprise", + "productivity", + "business", + "technology" + ], + "xdm:hashtags": [], + "xdm:mentions": [], + "xdm:language": "en", + "xdm:locale": "en_US" + }, + "xdm:creativeElements": { + "xdm:primaryColor": "#0066CC", + "xdm:secondaryColor": "#FFFFFF", + "xdm:accentColor": "#00CC66", + "xdm:backgroundColor": "transparent", + "xdm:textColor": "#333333", + "xdm:fontFamily": "Roboto", + "xdm:logoIncluded": true, + "xdm:logoPosition": "center", + "xdm:brandingLevel": "moderate", + "xdm:visualStyle": "clean", + "xdm:mood": "professional", + "xdm:tone": "informative" + }, + "xdm:performanceMetadata": { + "xdm:assetScore": 8.2, + "xdm:qualityScore": 9.0, + "xdm:relevanceScore": 8.5, + "xdm:engagementScore": 7.8, + "xdm:creativeFatigue": 0.35, + "xdm:freshnessScore": 0.75, + "xdm:adStrength": "good", + "xdm:predictedPerformance": "medium_high", + "xdm:benchmarkComparison": "above_average" + }, + "xdm:usageTracking": { + "xdm:timesUsed": 15, + "xdm:activeCampaigns": 3, + "xdm:activeAdGroups": 4, + "xdm:activeAds": 6, + "xdm:firstUsedDate": "2025-10-01T00:00:00Z", + "xdm:lastUsedDate": "2025-11-09T10:00:00Z", + "xdm:totalImpressions": 1850000, + "xdm:totalClicks": 52000, + "xdm:totalSpend": 18500 + }, + "xdm:reviewStatus": { + "xdm:status": "approved", + "xdm:reviewDate": "2025-09-19T08:00:00Z", + "xdm:reviewerID": "google_reviewer_456", + "xdm:reviewNotes": "Approved - complies with Google Ads policies", + "xdm:policyViolations": [], + "xdm:appealStatus": "not_applicable", + "xdm:autoApproved": false, + "xdm:requiresManualReview": true + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "google_asset_id", + "xdm:stringValue": "222333444555" + }, + { + "xdm:fieldName": "google_asset_name", + "xdm:stringValue": "Tech Solutions - Product Image 1" + }, + { + "xdm:fieldName": "google_asset_type", + "xdm:stringValue": "IMAGE" + }, + { + "xdm:fieldName": "google_upload_date", + "xdm:stringValue": "2025-09-18T11:00:00Z" + }, + { + "xdm:fieldName": "google_asset_status", + "xdm:stringValue": "ENABLED" + }, + { + "xdm:fieldName": "google_asset_performance_label", + "xdm:stringValue": "GOOD" + } + ] + } + } +} diff --git a/schemas/paid-media/paid-media-asset-lookup.schema.json b/schemas/paid-media/paid-media-asset-lookup.schema.json new file mode 100644 index 000000000..a82362583 --- /dev/null +++ b/schemas/paid-media/paid-media-asset-lookup.schema.json @@ -0,0 +1,37 @@ +{ + "meta:license": [ + "Copyright 2025 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "https://ns.adobe.com/xdm/schemas/paid-media-asset-lookup", + "title": "Paid Media Asset Lookup", + "type": "object", + "description": "Schema for paid media asset lookup dataset containing creative asset metadata across all ad networks", + "meta:class": "https://ns.adobe.com/xdm/data/record", + "meta:extensible": false, + "meta:abstract": false, + "meta:extends": [ + "https://ns.adobe.com/xdm/data/record", + "https://ns.adobe.com/xdm/mixins/paid-media/core-identifiers", + "https://ns.adobe.com/xdm/mixins/paid-media/core-metadata", + "https://ns.adobe.com/xdm/mixins/paid-media/asset-details" + ], + "allOf": [ + { + "$ref": "https://ns.adobe.com/xdm/data/record" + }, + { + "$ref": "https://ns.adobe.com/xdm/mixins/paid-media/core-identifiers" + }, + { + "$ref": "https://ns.adobe.com/xdm/mixins/paid-media/core-metadata" + }, + { + "$ref": "https://ns.adobe.com/xdm/mixins/paid-media/asset-details" + } + ], + "meta:status": "experimental" +} diff --git a/schemas/paid-media/paid-media-campaign-lookup.example.1.json b/schemas/paid-media/paid-media-campaign-lookup.example.1.json new file mode 100644 index 000000000..def899cf4 --- /dev/null +++ b/schemas/paid-media/paid-media-campaign-lookup.example.1.json @@ -0,0 +1,207 @@ +{ + "xdm:paidMedia": { + "xdm:adNetwork": "meta", + "xdm:entityType": "campaign", + "xdm:accountID": "act_123456789012345", + "xdm:accountGUID": "meta_act_123456789012345", + "xdm:campaignID": "23851234567890789", + "xdm:campaignGUID": "meta_act_123456789012345_23851234567890789", + "xdm:hierarchyPath": "act_123456789012345/23851234567890789", + "xdm:metadata": { + "xdm:name": "Fall 2025 Product Launch - Traffic Campaign", + "xdm:status": "active", + "xdm:servingStatus": "CAMPAIGN_STATUS_ENABLED", + "xdm:currency": "USD", + "xdm:timezone": "America/Los_Angeles", + "xdm:createdTime": "2025-10-15T10:00:00Z", + "xdm:updatedTime": "2025-11-09T15:30:00Z", + "xdm:startTime": "2025-11-01T00:00:00Z", + "xdm:endTime": "2025-11-30T23:59:59Z", + "xdm:objective": "traffic", + "xdm:budgetType": "daily", + "xdm:dailyBudget": 2000, + "xdm:lifetimeBudget": 0, + "xdm:biddingStrategy": "lowest_cost_without_cap", + "xdm:optimizationGoal": "link_clicks" + }, + "xdm:campaignDetails": { + "xdm:campaignType": "traffic", + "xdm:subType": "link_clicks", + "xdm:isAutomatedCampaign": false, + "xdm:promotedObject": { + "xdm:objectType": "page", + "xdm:objectID": "page_acmecorp_official", + "xdm:pageID": "123456789012345", + "xdm:pixelID": "pixel_123456789", + "xdm:customEventType": "LINK_CLICK", + "xdm:applicationID": "app_456789123", + "xdm:productCatalogID": "catalog_987654321", + "xdm:productSetID": "product_set_123456", + "xdm:offlineConversionDataSetID": "", + "xdm:destinationURL": "https://www.acmecorp.com/fall-launch" + }, + "xdm:budgetSettings": { + "xdm:budgetType": "daily", + "xdm:dailyBudget": 2000, + "xdm:lifetimeBudget": 0, + "xdm:totalBudget": 60000, + "xdm:budgetRemaining": 42500, + "xdm:budgetSpent": 17500, + "xdm:budgetUtilization": 0.292, + "xdm:pacing": "standard", + "xdm:pacingType": "standard", + "xdm:campaignBudgetOptimization": true, + "xdm:cboEnabled": true, + "xdm:budgetRebalancing": true, + "xdm:spendCap": 2500, + "xdm:bidCap": 0, + "xdm:costCap": 0 + }, + "xdm:targetingStrategy": { + "xdm:targetingExpansion": true, + "xdm:detailedTargetingExpansion": "expansion_all", + "xdm:advantagePlusAudience": false, + "xdm:advantagePlusCreative": false, + "xdm:advantagePlusCatalog": false, + "xdm:lookalikExpansion": true, + "xdm:automaticPlacements": true, + "xdm:dynamicCreative": false + }, + "xdm:schedulingSettings": { + "xdm:startDate": "2025-11-01T00:00:00Z", + "xdm:endDate": "2025-11-30T23:59:59Z", + "xdm:scheduleType": "continuous", + "xdm:runContinuously": false, + "xdm:dayParting": false, + "xdm:dayPartingSchedule": [], + "xdm:timezone": "America/Los_Angeles", + "xdm:flightDates": [ + { + "xdm:startDate": "2025-11-01T00:00:00Z", + "xdm:endDate": "2025-11-30T23:59:59Z" + } + ] + }, + "xdm:frequencyCapping": { + "xdm:enabled": true, + "xdm:impressionCap": 5, + "xdm:timePeriod": "week", + "xdm:timePeriodDays": 7, + "xdm:applyToAllAdSets": true, + "xdm:resetFrequency": "weekly" + }, + "xdm:conversionTracking": { + "xdm:pixelID": "pixel_123456789", + "xdm:conversionEvents": [ + "PageView", + "ViewContent", + "AddToCart", + "InitiateCheckout", + "Purchase" + ], + "xdm:customConversions": [ + { + "xdm:eventName": "ProductPageView", + "xdm:eventID": "custom_event_001", + "xdm:eventValue": 0 + }, + { + "xdm:eventName": "DemoRequest", + "xdm:eventID": "custom_event_002", + "xdm:eventValue": 50 + } + ], + "xdm:offlineConversions": false, + "xdm:serverSideTracking": true, + "xdm:conversionAPI": true, + "xdm:deduplication": true, + "xdm:attributionWindow": "7d_click_1d_view" + }, + "xdm:optimizationSettings": { + "xdm:objective": "OUTCOME_TRAFFIC", + "xdm:optimizationGoal": "LINK_CLICKS", + "xdm:billingEvent": "IMPRESSIONS", + "xdm:bidStrategy": "LOWEST_COST_WITHOUT_CAP", + "xdm:pacing": "standard", + "xdm:deliveryType": "standard", + "xdm:learningPhase": "learning", + "xdm:autoOptimization": true + }, + "xdm:ios14Settings": { + "xdm:campaignOptedIn": true, + "xdm:attOptimization": true, + "xdm:aggregatedEventMeasurement": true, + "xdm:prioritizedEvents": ["Purchase", "AddToCart", "ViewContent"], + "xdm:domainVerification": true, + "xdm:verifiedDomain": "acmecorp.com", + "xdm:skadnetworkEnabled": true, + "xdm:conversionValueSchema": "default" + }, + "xdm:brandSafety": { + "xdm:inventoryFilter": "standard", + "xdm:blockLists": ["block_list_sensitive_content"], + "xdm:contentCategories": [ + "news", + "entertainment", + "technology", + "business" + ], + "xdm:excludedCategories": ["mature_content", "political", "gambling"], + "xdm:publisherBlockLists": [], + "xdm:appBlockLists": [], + "xdm:brandSuitability": "standard" + }, + "xdm:creativeSettings": { + "xdm:dynamicCreative": false, + "xdm:multiAdvertiserAds": false, + "xdm:catalogAds": false, + "xdm:collectionAds": false, + "xdm:instantExperience": false, + "xdm:videoPolling": false, + "xdm:playableAds": false + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "meta_campaign_id", + "xdm:stringValue": "23851234567890789" + }, + { + "xdm:fieldName": "meta_campaign_name", + "xdm:stringValue": "Fall 2025 Product Launch - Traffic Campaign" + }, + { + "xdm:fieldName": "meta_objective", + "xdm:stringValue": "OUTCOME_TRAFFIC" + }, + { + "xdm:fieldName": "meta_buying_type", + "xdm:stringValue": "AUCTION" + }, + { + "xdm:fieldName": "meta_special_ad_categories", + "xdm:stringValue": "NONE" + }, + { + "xdm:fieldName": "meta_campaign_budget_optimization", + "xdm:stringValue": "true" + }, + { + "xdm:fieldName": "meta_bid_strategy", + "xdm:stringValue": "LOWEST_COST_WITHOUT_CAP" + }, + { + "xdm:fieldName": "meta_campaign_spending_limit", + "xdm:stringValue": "2500" + }, + { + "xdm:fieldName": "meta_campaign_status", + "xdm:stringValue": "ACTIVE" + }, + { + "xdm:fieldName": "meta_effective_status", + "xdm:stringValue": "ACTIVE" + } + ] + } + } +} diff --git a/schemas/paid-media/paid-media-campaign-lookup.example.2.json b/schemas/paid-media/paid-media-campaign-lookup.example.2.json new file mode 100644 index 000000000..1334440cd --- /dev/null +++ b/schemas/paid-media/paid-media-campaign-lookup.example.2.json @@ -0,0 +1,200 @@ +{ + "xdm:paidMedia": { + "xdm:adNetwork": "google_ads", + "xdm:entityType": "campaign", + "xdm:accountID": "1234567890", + "xdm:accountGUID": "google_ads_1234567890", + "xdm:campaignID": "9876543210", + "xdm:campaignGUID": "google_ads_1234567890_9876543210", + "xdm:hierarchyPath": "1234567890/9876543210", + "xdm:metadata": { + "xdm:name": "Brand Awareness - Display Network", + "xdm:status": "active", + "xdm:servingStatus": "CAMPAIGN_STATUS_ENABLED", + "xdm:currency": "USD", + "xdm:timezone": "America/New_York", + "xdm:createdTime": "2025-09-10T08:00:00Z", + "xdm:updatedTime": "2025-11-09T10:00:00Z", + "xdm:startTime": "2025-10-01T00:00:00Z", + "xdm:objective": "awareness", + "xdm:budgetType": "daily", + "xdm:dailyBudget": 1500, + "xdm:lifetimeBudget": 0, + "xdm:biddingStrategy": "target_cpm", + "xdm:optimizationGoal": "impressions" + }, + "xdm:campaignDetails": { + "xdm:campaignType": "display", + "xdm:subType": "display", + "xdm:isAutomatedCampaign": false, + "xdm:promotedObject": { + "xdm:objectType": "website", + "xdm:objectID": "", + "xdm:pageID": "", + "xdm:pixelID": "", + "xdm:customEventType": "", + "xdm:applicationID": "", + "xdm:productCatalogID": "", + "xdm:productSetID": "", + "xdm:offlineConversionDataSetID": "", + "xdm:destinationURL": "https://www.acmecorp.com" + }, + "xdm:budgetSettings": { + "xdm:budgetType": "daily", + "xdm:dailyBudget": 1500, + "xdm:lifetimeBudget": 0, + "xdm:totalBudget": 0, + "xdm:budgetRemaining": 0, + "xdm:budgetSpent": 52500, + "xdm:budgetUtilization": 0, + "xdm:pacing": "standard", + "xdm:pacingType": "standard", + "xdm:campaignBudgetOptimization": false, + "xdm:cboEnabled": false, + "xdm:budgetRebalancing": false, + "xdm:spendCap": 0, + "xdm:bidCap": 0, + "xdm:costCap": 0 + }, + "xdm:targetingStrategy": { + "xdm:targetingExpansion": true, + "xdm:detailedTargetingExpansion": "", + "xdm:advantagePlusAudience": false, + "xdm:advantagePlusCreative": false, + "xdm:advantagePlusCatalog": false, + "xdm:lookalikExpansion": false, + "xdm:automaticPlacements": true, + "xdm:dynamicCreative": false + }, + "xdm:schedulingSettings": { + "xdm:startDate": "2025-10-01T00:00:00Z", + "xdm:endDate": "", + "xdm:scheduleType": "continuous", + "xdm:runContinuously": true, + "xdm:dayParting": true, + "xdm:dayPartingSchedule": [ + { + "xdm:dayOfWeek": "monday", + "xdm:startHour": 9, + "xdm:endHour": 21 + }, + { + "xdm:dayOfWeek": "tuesday", + "xdm:startHour": 9, + "xdm:endHour": 21 + }, + { + "xdm:dayOfWeek": "wednesday", + "xdm:startHour": 9, + "xdm:endHour": 21 + }, + { + "xdm:dayOfWeek": "thursday", + "xdm:startHour": 9, + "xdm:endHour": 21 + }, + { + "xdm:dayOfWeek": "friday", + "xdm:startHour": 9, + "xdm:endHour": 21 + } + ], + "xdm:timezone": "America/New_York", + "xdm:flightDates": [] + }, + "xdm:frequencyCapping": { + "xdm:enabled": true, + "xdm:impressionCap": 3, + "xdm:timePeriod": "day", + "xdm:timePeriodDays": 1, + "xdm:applyToAllAdSets": true, + "xdm:resetFrequency": "daily" + }, + "xdm:conversionTracking": { + "xdm:pixelID": "", + "xdm:conversionEvents": [], + "xdm:customConversions": [], + "xdm:offlineConversions": false, + "xdm:serverSideTracking": false, + "xdm:conversionAPI": false, + "xdm:deduplication": false, + "xdm:attributionWindow": "30d_click" + }, + "xdm:optimizationSettings": { + "xdm:objective": "BRAND_AWARENESS", + "xdm:optimizationGoal": "IMPRESSIONS", + "xdm:billingEvent": "IMPRESSIONS", + "xdm:bidStrategy": "TARGET_CPM", + "xdm:pacing": "standard", + "xdm:deliveryType": "standard", + "xdm:learningPhase": "completed", + "xdm:autoOptimization": true + }, + "xdm:ios14Settings": { + "xdm:campaignOptedIn": false, + "xdm:attOptimization": false, + "xdm:aggregatedEventMeasurement": false, + "xdm:prioritizedEvents": [], + "xdm:domainVerification": false, + "xdm:verifiedDomain": "", + "xdm:skadnetworkEnabled": false, + "xdm:conversionValueSchema": "" + }, + "xdm:brandSafety": { + "xdm:inventoryFilter": "expanded", + "xdm:blockLists": [], + "xdm:contentCategories": [ + "news", + "entertainment", + "technology", + "business", + "sports", + "lifestyle" + ], + "xdm:excludedCategories": ["mature_content", "gambling"], + "xdm:publisherBlockLists": [], + "xdm:appBlockLists": [], + "xdm:brandSuitability": "expanded" + }, + "xdm:creativeSettings": { + "xdm:dynamicCreative": false, + "xdm:multiAdvertiserAds": false, + "xdm:catalogAds": false, + "xdm:collectionAds": false, + "xdm:instantExperience": false, + "xdm:videoPolling": false, + "xdm:playableAds": false + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "google_campaign_id", + "xdm:stringValue": "9876543210" + }, + { + "xdm:fieldName": "google_campaign_name", + "xdm:stringValue": "Brand Awareness - Display Network" + }, + { + "xdm:fieldName": "google_campaign_type", + "xdm:stringValue": "DISPLAY" + }, + { + "xdm:fieldName": "google_advertising_channel_type", + "xdm:stringValue": "DISPLAY" + }, + { + "xdm:fieldName": "google_bidding_strategy_type", + "xdm:stringValue": "TARGET_CPM" + }, + { + "xdm:fieldName": "google_campaign_status", + "xdm:stringValue": "ENABLED" + }, + { + "xdm:fieldName": "google_serving_status", + "xdm:stringValue": "SERVING" + } + ] + } + } +} diff --git a/schemas/paid-media/paid-media-campaign-lookup.schema.json b/schemas/paid-media/paid-media-campaign-lookup.schema.json new file mode 100644 index 000000000..c7c5599d0 --- /dev/null +++ b/schemas/paid-media/paid-media-campaign-lookup.schema.json @@ -0,0 +1,37 @@ +{ + "meta:license": [ + "Copyright 2025 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "https://ns.adobe.com/xdm/schemas/paid-media-campaign-lookup", + "title": "Paid Media Campaign Lookup", + "type": "object", + "description": "Schema for paid media campaign lookup dataset containing campaign metadata across all ad networks", + "meta:class": "https://ns.adobe.com/xdm/data/record", + "meta:extensible": false, + "meta:abstract": false, + "meta:extends": [ + "https://ns.adobe.com/xdm/data/record", + "https://ns.adobe.com/xdm/mixins/paid-media/core-identifiers", + "https://ns.adobe.com/xdm/mixins/paid-media/core-metadata", + "https://ns.adobe.com/xdm/mixins/paid-media/campaign-details" + ], + "allOf": [ + { + "$ref": "https://ns.adobe.com/xdm/data/record" + }, + { + "$ref": "https://ns.adobe.com/xdm/mixins/paid-media/core-identifiers" + }, + { + "$ref": "https://ns.adobe.com/xdm/mixins/paid-media/core-metadata" + }, + { + "$ref": "https://ns.adobe.com/xdm/mixins/paid-media/campaign-details" + } + ], + "meta:status": "experimental" +} diff --git a/schemas/paid-media/paid-media-experience-lookup.example.1.json b/schemas/paid-media/paid-media-experience-lookup.example.1.json new file mode 100644 index 000000000..072dc5228 --- /dev/null +++ b/schemas/paid-media/paid-media-experience-lookup.example.1.json @@ -0,0 +1,177 @@ +{ + "xdm:paidMedia": { + "xdm:adNetwork": "meta", + "xdm:entityType": "experience", + "xdm:accountID": "act_123456789012345", + "xdm:accountGUID": "meta_act_123456789012345", + "xdm:experienceID": "creative_vid_987654321", + "xdm:experienceGUID": "meta_act_123456789012345_creative_vid_987654321", + "xdm:metadata": { + "xdm:name": "Fall Product Launch - 30s Video Creative", + "xdm:status": "active", + "xdm:createdTime": "2025-10-28T15:00:00Z", + "xdm:updatedTime": "2025-11-05T11:00:00Z" + }, + "xdm:experienceDetails": { + "xdm:experienceType": "single_video", + "xdm:experienceFormat": "single_video", + "xdm:experienceTemplate": "video_standard", + "xdm:experienceVersion": "v2.1", + "xdm:isDynamic": false, + "xdm:isPersonalized": true, + "xdm:isLocalized": true, + "xdm:locale": "en_US", + "xdm:primaryAssetID": "987654321012345", + "xdm:primaryAssetGUID": "meta_act_123456789012345_asset_987654321012345", + "xdm:primaryAssetType": "video", + "xdm:assetIDs": ["987654321012345"], + "xdm:assetGUIDs": ["meta_act_123456789012345_asset_987654321012345"], + "xdm:assetCount": 1, + "xdm:assetTypes": ["video"], + "xdm:contentDetails": { + "xdm:primaryText": "Introducing our revolutionary new product that will transform the way you work. Experience innovation like never before.", + "xdm:headline": "Revolutionary Innovation", + "xdm:description": "Transform your workflow with cutting-edge features designed for modern professionals. Available now for a limited time.", + "xdm:callToActionType": "learn_more", + "xdm:callToActionText": "Learn More", + "xdm:destinationURL": "https://www.acmecorp.com/fall-launch?utm_source=facebook&utm_medium=video&utm_campaign=fall2025", + "xdm:displayURL": "acmecorp.com/fall-launch", + "xdm:linkDescription": "Discover the future of productivity", + "xdm:brandName": "Acme Corp", + "xdm:productName": "Acme Pro X", + "xdm:tagline": "Innovation Meets Excellence", + "xdm:additionalText": "Limited time offer - Learn more today" + }, + "xdm:visualElements": { + "xdm:primaryColor": "#0066CC", + "xdm:secondaryColor": "#FFFFFF", + "xdm:accentColor": "#FF6600", + "xdm:backgroundColor": "#F5F5F5", + "xdm:textColor": "#333333", + "xdm:fontFamily": "Helvetica Neue", + "xdm:logoIncluded": true, + "xdm:logoPosition": "top_left", + "xdm:brandingLevel": "prominent", + "xdm:visualStyle": "modern", + "xdm:mood": "professional", + "xdm:tone": "confident", + "xdm:overlayText": true, + "xdm:overlayPosition": "bottom_third", + "xdm:animationStyle": "smooth", + "xdm:transitionType": "fade" + }, + "xdm:targetingContext": { + "xdm:campaignTheme": "fall_2025_launch", + "xdm:audienceSegment": "tech_enthusiasts", + "xdm:ageRange": "25-54", + "xdm:genderTarget": "all", + "xdm:geographicFocus": "US_major_metros", + "xdm:deviceOptimization": "mobile_first", + "xdm:placementOptimization": "feed_optimized", + "xdm:seasonality": "fall", + "xdm:productCategory": "technology", + "xdm:customerJourneyStage": "awareness" + }, + "xdm:performanceAttributes": { + "xdm:creativeConcept": "product_demo", + "xdm:messageStrategy": "problem_solution", + "xdm:emotionalAppeal": "aspiration", + "xdm:valueProposition": "innovation", + "xdm:urgency": "limited_time", + "xdm:socialProof": false, + "xdm:testimonials": false, + "xdm:demonstration": true, + "xdm:comparison": false, + "xdm:educationalContent": true + }, + "xdm:technicalSpecs": { + "xdm:aspectRatios": ["16:9"], + "xdm:dimensions": ["1920x1080"], + "xdm:fileSizes": [45678912], + "xdm:durations": [30.5], + "xdm:formats": ["mp4"], + "xdm:codecs": ["h264"], + "xdm:bitrates": [5000], + "xdm:frameRates": [30], + "xdm:hasAudio": true, + "xdm:hasSubtitles": true, + "xdm:subtitleLanguages": ["en", "es", "fr"], + "xdm:closedCaptions": true, + "xdm:hdrEnabled": false, + "xdm:is360": false + }, + "xdm:usageMetrics": { + "xdm:timesUsed": 12, + "xdm:activeCampaigns": 3, + "xdm:activeAdGroups": 5, + "xdm:activeAds": 8, + "xdm:firstUsedDate": "2025-11-01T00:00:00Z", + "xdm:lastUsedDate": "2025-11-09T15:00:00Z", + "xdm:totalImpressions": 1250000, + "xdm:totalClicks": 45000, + "xdm:totalConversions": 2250, + "xdm:totalSpend": 12500, + "xdm:averageCTR": 0.036, + "xdm:averageCPC": 0.278, + "xdm:averageCPA": 5.56, + "xdm:averageROAS": 4.5 + }, + "xdm:qualityMetrics": { + "xdm:creativeScore": 8.5, + "xdm:qualityScore": 9.2, + "xdm:relevanceScore": 8.8, + "xdm:engagementScore": 8.3, + "xdm:adStrength": "excellent", + "xdm:creativeFatigue": 0.15, + "xdm:freshnessScore": 0.95, + "xdm:predictedPerformance": "high", + "xdm:benchmarkComparison": "above_average", + "xdm:policyCompliance": "compliant" + }, + "xdm:reviewStatus": { + "xdm:status": "approved", + "xdm:reviewDate": "2025-10-29T10:00:00Z", + "xdm:reviewerID": "meta_reviewer_456", + "xdm:reviewNotes": "Approved - high quality video creative", + "xdm:policyViolations": [], + "xdm:appealStatus": "not_applicable", + "xdm:autoApproved": false, + "xdm:requiresManualReview": true + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "meta_creative_id", + "xdm:stringValue": "creative_vid_987654321" + }, + { + "xdm:fieldName": "meta_creative_name", + "xdm:stringValue": "Fall Product Launch - 30s Video Creative" + }, + { + "xdm:fieldName": "meta_creative_type", + "xdm:stringValue": "video" + }, + { + "xdm:fieldName": "meta_video_id", + "xdm:stringValue": "987654321012345" + }, + { + "xdm:fieldName": "meta_creative_status", + "xdm:stringValue": "active" + }, + { + "xdm:fieldName": "meta_objective_type", + "xdm:stringValue": "OUTCOME_TRAFFIC" + }, + { + "xdm:fieldName": "meta_placement_optimization", + "xdm:stringValue": "automatic" + }, + { + "xdm:fieldName": "meta_dynamic_creative", + "xdm:stringValue": "false" + } + ] + } + } +} diff --git a/schemas/paid-media/paid-media-experience-lookup.example.2.json b/schemas/paid-media/paid-media-experience-lookup.example.2.json new file mode 100644 index 000000000..7985df676 --- /dev/null +++ b/schemas/paid-media/paid-media-experience-lookup.example.2.json @@ -0,0 +1,181 @@ +{ + "xdm:paidMedia": { + "xdm:adNetwork": "google_ads", + "xdm:entityType": "experience", + "xdm:accountID": "1234567890", + "xdm:accountGUID": "google_ads_1234567890", + "xdm:experienceID": "creative_rda_111222333", + "xdm:experienceGUID": "google_ads_1234567890_creative_rda_111222333", + "xdm:metadata": { + "xdm:name": "Responsive Display Ad - Tech Solutions Multi-Asset", + "xdm:status": "active", + "xdm:createdTime": "2025-09-20T13:00:00Z", + "xdm:updatedTime": "2025-11-05T09:00:00Z" + }, + "xdm:experienceDetails": { + "xdm:experienceType": "single_image", + "xdm:experienceFormat": "responsive_display_ad", + "xdm:experienceTemplate": "responsive_display_standard", + "xdm:experienceVersion": "v3.2", + "xdm:isDynamic": true, + "xdm:isPersonalized": true, + "xdm:isLocalized": true, + "xdm:locale": "en_US", + "xdm:primaryAssetID": "222333444555", + "xdm:primaryAssetGUID": "google_ads_1234567890_asset_222333444555", + "xdm:primaryAssetType": "image", + "xdm:assetIDs": ["222333444555", "333444555666", "444555666777"], + "xdm:assetGUIDs": [ + "google_ads_1234567890_asset_222333444555", + "google_ads_1234567890_asset_333444555666", + "google_ads_1234567890_asset_444555666777" + ], + "xdm:assetCount": 3, + "xdm:assetTypes": ["image", "image", "image"], + "xdm:contentDetails": { + "xdm:primaryText": "Transform your business with our cutting-edge software platform designed for modern enterprises. Streamline operations and boost productivity.", + "xdm:headline": "Professional Software Solution", + "xdm:description": "Discover how Acme Pro X can revolutionize your workflow with powerful features, seamless integration, and enterprise-grade security.", + "xdm:callToActionType": "learn_more", + "xdm:callToActionText": "Learn More", + "xdm:destinationURL": "https://www.acmecorp.com/solutions?utm_source=google&utm_medium=display&utm_campaign=tech_solutions", + "xdm:displayURL": "acmecorp.com/solutions", + "xdm:linkDescription": "Explore our enterprise solutions", + "xdm:brandName": "Acme Corp", + "xdm:productName": "Acme Pro X", + "xdm:tagline": "Built for Excellence", + "xdm:additionalText": "Trusted by leading enterprises worldwide" + }, + "xdm:visualElements": { + "xdm:primaryColor": "#0066CC", + "xdm:secondaryColor": "#FFFFFF", + "xdm:accentColor": "#00CC66", + "xdm:backgroundColor": "#F8F8F8", + "xdm:textColor": "#333333", + "xdm:fontFamily": "Roboto", + "xdm:logoIncluded": true, + "xdm:logoPosition": "top_left", + "xdm:brandingLevel": "moderate", + "xdm:visualStyle": "clean", + "xdm:mood": "professional", + "xdm:tone": "informative", + "xdm:overlayText": false, + "xdm:overlayPosition": "", + "xdm:animationStyle": "none", + "xdm:transitionType": "none" + }, + "xdm:targetingContext": { + "xdm:campaignTheme": "tech_solutions_2025", + "xdm:audienceSegment": "tech_professionals", + "xdm:ageRange": "25-65", + "xdm:genderTarget": "all", + "xdm:geographicFocus": "US_tech_hubs", + "xdm:deviceOptimization": "multi_device", + "xdm:placementOptimization": "display_network", + "xdm:seasonality": "evergreen", + "xdm:productCategory": "enterprise_software", + "xdm:customerJourneyStage": "consideration" + }, + "xdm:performanceAttributes": { + "xdm:creativeConcept": "product_showcase", + "xdm:messageStrategy": "value_proposition", + "xdm:emotionalAppeal": "trust", + "xdm:valueProposition": "efficiency", + "xdm:urgency": "none", + "xdm:socialProof": true, + "xdm:testimonials": false, + "xdm:demonstration": false, + "xdm:comparison": false, + "xdm:educationalContent": true + }, + "xdm:technicalSpecs": { + "xdm:aspectRatios": ["1:1", "1.91:1", "4:5"], + "xdm:dimensions": ["1200x1200", "1200x628", "1080x1350"], + "xdm:fileSizes": [3456789, 2987654, 3123456], + "xdm:durations": [], + "xdm:formats": ["png", "png", "png"], + "xdm:codecs": [], + "xdm:bitrates": [], + "xdm:frameRates": [], + "xdm:hasAudio": false, + "xdm:hasSubtitles": false, + "xdm:subtitleLanguages": [], + "xdm:closedCaptions": false, + "xdm:hdrEnabled": false, + "xdm:is360": false + }, + "xdm:usageMetrics": { + "xdm:timesUsed": 15, + "xdm:activeCampaigns": 3, + "xdm:activeAdGroups": 4, + "xdm:activeAds": 6, + "xdm:firstUsedDate": "2025-10-01T00:00:00Z", + "xdm:lastUsedDate": "2025-11-09T10:00:00Z", + "xdm:totalImpressions": 1850000, + "xdm:totalClicks": 52000, + "xdm:totalConversions": 1850, + "xdm:totalSpend": 18500, + "xdm:averageCTR": 0.028, + "xdm:averageCPC": 0.356, + "xdm:averageCPA": 10.0, + "xdm:averageROAS": 3.8 + }, + "xdm:qualityMetrics": { + "xdm:creativeScore": 8.2, + "xdm:qualityScore": 9.0, + "xdm:relevanceScore": 8.5, + "xdm:engagementScore": 7.8, + "xdm:adStrength": "excellent", + "xdm:creativeFatigue": 0.35, + "xdm:freshnessScore": 0.75, + "xdm:predictedPerformance": "medium_high", + "xdm:benchmarkComparison": "above_average", + "xdm:policyCompliance": "compliant" + }, + "xdm:reviewStatus": { + "xdm:status": "approved", + "xdm:reviewDate": "2025-09-21T09:00:00Z", + "xdm:reviewerID": "google_reviewer_123", + "xdm:reviewNotes": "Approved - complies with Google Ads policies", + "xdm:policyViolations": [], + "xdm:appealStatus": "not_applicable", + "xdm:autoApproved": false, + "xdm:requiresManualReview": true + }, + "xdm:additionalDetails": [ + { + "xdm:fieldName": "google_creative_id", + "xdm:stringValue": "creative_rda_111222333" + }, + { + "xdm:fieldName": "google_creative_name", + "xdm:stringValue": "Responsive Display Ad - Tech Solutions Multi-Asset" + }, + { + "xdm:fieldName": "google_creative_type", + "xdm:stringValue": "RESPONSIVE_DISPLAY_AD" + }, + { + "xdm:fieldName": "google_creative_status", + "xdm:stringValue": "ENABLED" + }, + { + "xdm:fieldName": "google_ad_strength", + "xdm:stringValue": "EXCELLENT" + }, + { + "xdm:fieldName": "google_policy_summary_approval_status", + "xdm:stringValue": "APPROVED" + }, + { + "xdm:fieldName": "google_asset_count", + "xdm:stringValue": "3" + }, + { + "xdm:fieldName": "google_dynamic_creative", + "xdm:stringValue": "true" + } + ] + } + } +} diff --git a/schemas/paid-media/paid-media-experience-lookup.schema.json b/schemas/paid-media/paid-media-experience-lookup.schema.json new file mode 100644 index 000000000..dcddad341 --- /dev/null +++ b/schemas/paid-media/paid-media-experience-lookup.schema.json @@ -0,0 +1,37 @@ +{ + "meta:license": [ + "Copyright 2025 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "https://ns.adobe.com/xdm/schemas/paid-media-experience-lookup", + "title": "Paid Media Experience Lookup", + "type": "object", + "description": "Schema for paid media experience lookup dataset containing creative experience metadata across all ad networks", + "meta:class": "https://ns.adobe.com/xdm/data/record", + "meta:extensible": false, + "meta:abstract": false, + "meta:extends": [ + "https://ns.adobe.com/xdm/data/record", + "https://ns.adobe.com/xdm/mixins/paid-media/core-identifiers", + "https://ns.adobe.com/xdm/mixins/paid-media/core-metadata", + "https://ns.adobe.com/xdm/mixins/paid-media/experience-details" + ], + "allOf": [ + { + "$ref": "https://ns.adobe.com/xdm/data/record" + }, + { + "$ref": "https://ns.adobe.com/xdm/mixins/paid-media/core-identifiers" + }, + { + "$ref": "https://ns.adobe.com/xdm/mixins/paid-media/core-metadata" + }, + { + "$ref": "https://ns.adobe.com/xdm/mixins/paid-media/experience-details" + } + ], + "meta:status": "experimental" +} diff --git a/schemas/paid-media/paid-media-summary-metrics.example.1.json b/schemas/paid-media/paid-media-summary-metrics.example.1.json new file mode 100644 index 000000000..4d8627ebd --- /dev/null +++ b/schemas/paid-media/paid-media-summary-metrics.example.1.json @@ -0,0 +1,225 @@ +{ + "xdm:timestamp": "2025-11-09T00:00:00Z", + "xdm:paidMedia": { + "xdm:adNetwork": "meta", + "xdm:entityType": "account", + "xdm:accountID": "act_123456789012345", + "xdm:accountGUID": "meta_act_123456789012345", + "xdm:timestamp": "2025-11-09T00:00:00Z", + "xdm:date": "2025-11-09", + "xdm:granularity": "daily", + "xdm:coreMetrics": { + "xdm:impressions": 125000, + "xdm:clicks": 4500, + "xdm:reach": 95000, + "xdm:frequency": 1.32, + "xdm:spend": 3250.0, + "xdm:conversions": 225, + "xdm:conversionValue": 11250.0, + "xdm:ctr": 0.036, + "xdm:cpc": 0.722, + "xdm:cpm": 26.0, + "xdm:cpa": 14.44, + "xdm:roas": 3.46, + "xdm:roi": 2.46 + }, + "xdm:dimensionalBreakdowns": { + "xdm:deviceBreakdown": { + "xdm:mobile": { + "xdm:impressions": 87500, + "xdm:clicks": 3375, + "xdm:spend": 2275.0, + "xdm:conversions": 169 + }, + "xdm:desktop": { + "xdm:impressions": 31250, + "xdm:clicks": 938, + "xdm:spend": 812.5, + "xdm:conversions": 47 + }, + "xdm:tablet": { + "xdm:impressions": 6250, + "xdm:clicks": 187, + "xdm:spend": 162.5, + "xdm:conversions": 9 + } + }, + "xdm:platformBreakdown": { + "xdm:facebook": { + "xdm:impressions": 75000, + "xdm:clicks": 2700, + "xdm:spend": 1950.0, + "xdm:conversions": 135 + }, + "xdm:instagram": { + "xdm:impressions": 37500, + "xdm:clicks": 1350, + "xdm:spend": 975.0, + "xdm:conversions": 68 + }, + "xdm:messenger": { + "xdm:impressions": 7500, + "xdm:clicks": 270, + "xdm:spend": 195.0, + "xdm:conversions": 14 + }, + "xdm:audience_network": { + "xdm:impressions": 5000, + "xdm:clicks": 180, + "xdm:spend": 130.0, + "xdm:conversions": 8 + } + }, + "xdm:placementBreakdown": { + "xdm:feed": { + "xdm:impressions": 62500, + "xdm:clicks": 2250, + "xdm:spend": 1625.0, + "xdm:conversions": 113 + }, + "xdm:stories": { + "xdm:impressions": 31250, + "xdm:clicks": 1125, + "xdm:spend": 812.5, + "xdm:conversions": 56 + }, + "xdm:reels": { + "xdm:impressions": 18750, + "xdm:clicks": 675, + "xdm:spend": 487.5, + "xdm:conversions": 34 + }, + "xdm:other": { + "xdm:impressions": 12500, + "xdm:clicks": 450, + "xdm:spend": 325.0, + "xdm:conversions": 22 + } + }, + "xdm:ageBreakdown": { + "xdm:age_18_24": { + "xdm:impressions": 18750, + "xdm:clicks": 675, + "xdm:spend": 487.5, + "xdm:conversions": 34 + }, + "xdm:age_25_34": { + "xdm:impressions": 43750, + "xdm:clicks": 1575, + "xdm:spend": 1137.5, + "xdm:conversions": 79 + }, + "xdm:age_35_44": { + "xdm:impressions": 37500, + "xdm:clicks": 1350, + "xdm:spend": 975.0, + "xdm:conversions": 68 + }, + "xdm:age_45_54": { + "xdm:impressions": 18750, + "xdm:clicks": 675, + "xdm:spend": 487.5, + "xdm:conversions": 34 + }, + "xdm:age_55_64": { + "xdm:impressions": 6250, + "xdm:clicks": 225, + "xdm:spend": 162.5, + "xdm:conversions": 10 + } + }, + "xdm:genderBreakdown": { + "xdm:male": { + "xdm:impressions": 68750, + "xdm:clicks": 2475, + "xdm:spend": 1787.5, + "xdm:conversions": 124 + }, + "xdm:female": { + "xdm:impressions": 56250, + "xdm:clicks": 2025, + "xdm:spend": 1462.5, + "xdm:conversions": 101 + } + } + }, + "xdm:extendedMetrics": { + "xdm:videoViews": 0, + "xdm:videoViewsP25": 0, + "xdm:videoViewsP50": 0, + "xdm:videoViewsP75": 0, + "xdm:videoViewsP95": 0, + "xdm:videoViewsP100": 0, + "xdm:videoAvgWatchTime": 0, + "xdm:videoAvgWatchPercentage": 0, + "xdm:engagements": 6750, + "xdm:engagementRate": 0.054, + "xdm:likes": 3375, + "xdm:comments": 675, + "xdm:shares": 1125, + "xdm:saves": 1575, + "xdm:linkClicks": 4500, + "xdm:landingPageViews": 4050, + "xdm:outboundClicks": 4275, + "xdm:uniqueClicks": 4050, + "xdm:uniqueLinkClicks": 4050, + "xdm:costPerEngagement": 0.481, + "xdm:costPerLike": 0.963, + "xdm:costPerComment": 4.815, + "xdm:costPerShare": 2.889 + }, + "xdm:conversionMetrics": { + "xdm:viewThroughConversions": 45, + "xdm:clickThroughConversions": 180, + "xdm:totalConversions": 225, + "xdm:conversionRate": 0.05, + "xdm:costPerConversion": 14.44, + "xdm:conversionValue": 11250.0, + "xdm:valuePerConversion": 50.0, + "xdm:purchases": 180, + "xdm:purchaseValue": 9000.0, + "xdm:addToCart": 450, + "xdm:initiateCheckout": 270, + "xdm:leads": 45, + "xdm:signups": 90, + "xdm:downloads": 135, + "xdm:costPerPurchase": 18.06, + "xdm:costPerLead": 72.22, + "xdm:costPerSignup": 36.11 + }, + "xdm:costMetrics": { + "xdm:totalSpend": 3250.0, + "xdm:averageCPC": 0.722, + "xdm:averageCPM": 26.0, + "xdm:averageCPA": 14.44, + "xdm:averageCPE": 0.481, + "xdm:budgetUtilization": { + "xdm:budgetAllocated": 5000.0, + "xdm:budgetSpent": 3250.0, + "xdm:budgetRemaining": 1750.0, + "xdm:budgetUtilization": 0.65, + "xdm:dailyBudget": 5000.0 + } + }, + "xdm:attributionMetrics": { + "xdm:attributionModel": "LAST_CLICK", + "xdm:attributionWindow": "7d_click_1d_view", + "xdm:assistedConversions": 67, + "xdm:lastClickConversions": 158, + "xdm:firstClickConversions": 90, + "xdm:linearConversions": 112, + "xdm:timeDecayConversions": 135, + "xdm:positionBasedConversions": 124 + }, + "xdm:qualityMetrics": { + "xdm:qualityScore": 8.5, + "xdm:relevanceScore": 8.8, + "xdm:engagementRateRanking": "above_average", + "xdm:conversionRateRanking": "above_average", + "xdm:qualityRanking": "above_average", + "xdm:adRelevanceDiagnostics": "above_average", + "xdm:engagementRateDiagnostics": "above_average", + "xdm:conversionRateDiagnostics": "above_average" + } + } +} diff --git a/schemas/paid-media/paid-media-summary-metrics.example.2.json b/schemas/paid-media/paid-media-summary-metrics.example.2.json new file mode 100644 index 000000000..2b07349b0 --- /dev/null +++ b/schemas/paid-media/paid-media-summary-metrics.example.2.json @@ -0,0 +1,227 @@ +{ + "xdm:timestamp": "2025-11-09T00:00:00Z", + "xdm:paidMedia": { + "xdm:adNetwork": "meta", + "xdm:entityType": "campaign", + "xdm:accountID": "act_123456789012345", + "xdm:accountGUID": "meta_act_123456789012345", + "xdm:campaignID": "23851234567890789", + "xdm:campaignGUID": "meta_act_123456789012345_23851234567890789", + "xdm:timestamp": "2025-11-09T00:00:00Z", + "xdm:date": "2025-11-09", + "xdm:granularity": "daily", + "xdm:coreMetrics": { + "xdm:impressions": 85000, + "xdm:clicks": 3060, + "xdm:reach": 64500, + "xdm:frequency": 1.32, + "xdm:spend": 2210.0, + "xdm:conversions": 153, + "xdm:conversionValue": 7650.0, + "xdm:ctr": 0.036, + "xdm:cpc": 0.722, + "xdm:cpm": 26.0, + "xdm:cpa": 14.44, + "xdm:roas": 3.46, + "xdm:roi": 2.46 + }, + "xdm:dimensionalBreakdowns": { + "xdm:deviceBreakdown": { + "xdm:mobile": { + "xdm:impressions": 59500, + "xdm:clicks": 2295, + "xdm:spend": 1547.0, + "xdm:conversions": 115 + }, + "xdm:desktop": { + "xdm:impressions": 21250, + "xdm:clicks": 638, + "xdm:spend": 552.5, + "xdm:conversions": 32 + }, + "xdm:tablet": { + "xdm:impressions": 4250, + "xdm:clicks": 127, + "xdm:spend": 110.5, + "xdm:conversions": 6 + } + }, + "xdm:platformBreakdown": { + "xdm:facebook": { + "xdm:impressions": 51000, + "xdm:clicks": 1836, + "xdm:spend": 1326.0, + "xdm:conversions": 92 + }, + "xdm:instagram": { + "xdm:impressions": 25500, + "xdm:clicks": 918, + "xdm:spend": 663.0, + "xdm:conversions": 46 + }, + "xdm:messenger": { + "xdm:impressions": 5100, + "xdm:clicks": 184, + "xdm:spend": 132.6, + "xdm:conversions": 9 + }, + "xdm:audience_network": { + "xdm:impressions": 3400, + "xdm:clicks": 122, + "xdm:spend": 88.4, + "xdm:conversions": 6 + } + }, + "xdm:placementBreakdown": { + "xdm:feed": { + "xdm:impressions": 42500, + "xdm:clicks": 1530, + "xdm:spend": 1105.0, + "xdm:conversions": 77 + }, + "xdm:stories": { + "xdm:impressions": 21250, + "xdm:clicks": 765, + "xdm:spend": 552.5, + "xdm:conversions": 38 + }, + "xdm:reels": { + "xdm:impressions": 12750, + "xdm:clicks": 459, + "xdm:spend": 331.5, + "xdm:conversions": 23 + }, + "xdm:other": { + "xdm:impressions": 8500, + "xdm:clicks": 306, + "xdm:spend": 221.0, + "xdm:conversions": 15 + } + }, + "xdm:ageBreakdown": { + "xdm:age_18_24": { + "xdm:impressions": 12750, + "xdm:clicks": 459, + "xdm:spend": 331.5, + "xdm:conversions": 23 + }, + "xdm:age_25_34": { + "xdm:impressions": 29750, + "xdm:clicks": 1071, + "xdm:spend": 773.5, + "xdm:conversions": 54 + }, + "xdm:age_35_44": { + "xdm:impressions": 25500, + "xdm:clicks": 918, + "xdm:spend": 663.0, + "xdm:conversions": 46 + }, + "xdm:age_45_54": { + "xdm:impressions": 12750, + "xdm:clicks": 459, + "xdm:spend": 331.5, + "xdm:conversions": 23 + }, + "xdm:age_55_64": { + "xdm:impressions": 4250, + "xdm:clicks": 153, + "xdm:spend": 110.5, + "xdm:conversions": 7 + } + }, + "xdm:genderBreakdown": { + "xdm:male": { + "xdm:impressions": 46750, + "xdm:clicks": 1683, + "xdm:spend": 1215.5, + "xdm:conversions": 84 + }, + "xdm:female": { + "xdm:impressions": 38250, + "xdm:clicks": 1377, + "xdm:spend": 994.5, + "xdm:conversions": 69 + } + } + }, + "xdm:extendedMetrics": { + "xdm:videoViews": 0, + "xdm:videoViewsP25": 0, + "xdm:videoViewsP50": 0, + "xdm:videoViewsP75": 0, + "xdm:videoViewsP95": 0, + "xdm:videoViewsP100": 0, + "xdm:videoAvgWatchTime": 0, + "xdm:videoAvgWatchPercentage": 0, + "xdm:engagements": 4590, + "xdm:engagementRate": 0.054, + "xdm:likes": 2295, + "xdm:comments": 459, + "xdm:shares": 765, + "xdm:saves": 1071, + "xdm:linkClicks": 3060, + "xdm:landingPageViews": 2754, + "xdm:outboundClicks": 2907, + "xdm:uniqueClicks": 2754, + "xdm:uniqueLinkClicks": 2754, + "xdm:costPerEngagement": 0.481, + "xdm:costPerLike": 0.963, + "xdm:costPerComment": 4.815, + "xdm:costPerShare": 2.889 + }, + "xdm:conversionMetrics": { + "xdm:viewThroughConversions": 31, + "xdm:clickThroughConversions": 122, + "xdm:totalConversions": 153, + "xdm:conversionRate": 0.05, + "xdm:costPerConversion": 14.44, + "xdm:conversionValue": 7650.0, + "xdm:valuePerConversion": 50.0, + "xdm:purchases": 122, + "xdm:purchaseValue": 6100.0, + "xdm:addToCart": 306, + "xdm:initiateCheckout": 184, + "xdm:leads": 31, + "xdm:signups": 61, + "xdm:downloads": 92, + "xdm:costPerPurchase": 18.11, + "xdm:costPerLead": 71.29, + "xdm:costPerSignup": 36.23 + }, + "xdm:costMetrics": { + "xdm:totalSpend": 2210.0, + "xdm:averageCPC": 0.722, + "xdm:averageCPM": 26.0, + "xdm:averageCPA": 14.44, + "xdm:averageCPE": 0.481, + "xdm:budgetUtilization": { + "xdm:budgetAllocated": 5000.0, + "xdm:budgetSpent": 2210.0, + "xdm:budgetRemaining": 2790.0, + "xdm:budgetUtilization": 0.442, + "xdm:dailyBudget": 5000.0 + } + }, + "xdm:attributionMetrics": { + "xdm:attributionModel": "LAST_CLICK", + "xdm:attributionWindow": "7d_click_1d_view", + "xdm:assistedConversions": 46, + "xdm:lastClickConversions": 107, + "xdm:firstClickConversions": 61, + "xdm:linearConversions": 76, + "xdm:timeDecayConversions": 92, + "xdm:positionBasedConversions": 84 + }, + "xdm:qualityMetrics": { + "xdm:qualityScore": 8.5, + "xdm:relevanceScore": 8.8, + "xdm:engagementRateRanking": "above_average", + "xdm:conversionRateRanking": "above_average", + "xdm:qualityRanking": "above_average", + "xdm:adRelevanceDiagnostics": "above_average", + "xdm:engagementRateDiagnostics": "above_average", + "xdm:conversionRateDiagnostics": "above_average" + } + } +} diff --git a/schemas/paid-media/paid-media-summary-metrics.example.3.json b/schemas/paid-media/paid-media-summary-metrics.example.3.json new file mode 100644 index 000000000..b4ea8876b --- /dev/null +++ b/schemas/paid-media/paid-media-summary-metrics.example.3.json @@ -0,0 +1,229 @@ +{ + "xdm:timestamp": "2025-11-09T00:00:00Z", + "xdm:paidMedia": { + "xdm:adNetwork": "meta", + "xdm:entityType": "adGroup", + "xdm:accountID": "act_123456789012345", + "xdm:accountGUID": "meta_act_123456789012345", + "xdm:campaignID": "23851234567890789", + "xdm:campaignGUID": "meta_act_123456789012345_23851234567890789", + "xdm:adGroupID": "23851234567890456", + "xdm:adGroupGUID": "meta_act_123456789012345_23851234567890456", + "xdm:timestamp": "2025-11-09T00:00:00Z", + "xdm:date": "2025-11-09", + "xdm:granularity": "daily", + "xdm:coreMetrics": { + "xdm:impressions": 42500, + "xdm:clicks": 1530, + "xdm:reach": 32250, + "xdm:frequency": 1.32, + "xdm:spend": 1105.0, + "xdm:conversions": 77, + "xdm:conversionValue": 3825.0, + "xdm:ctr": 0.036, + "xdm:cpc": 0.722, + "xdm:cpm": 26.0, + "xdm:cpa": 14.35, + "xdm:roas": 3.46, + "xdm:roi": 2.46 + }, + "xdm:dimensionalBreakdowns": { + "xdm:deviceBreakdown": { + "xdm:mobile": { + "xdm:impressions": 29750, + "xdm:clicks": 1148, + "xdm:spend": 773.5, + "xdm:conversions": 58 + }, + "xdm:desktop": { + "xdm:impressions": 10625, + "xdm:clicks": 319, + "xdm:spend": 276.25, + "xdm:conversions": 16 + }, + "xdm:tablet": { + "xdm:impressions": 2125, + "xdm:clicks": 63, + "xdm:spend": 55.25, + "xdm:conversions": 3 + } + }, + "xdm:platformBreakdown": { + "xdm:facebook": { + "xdm:impressions": 25500, + "xdm:clicks": 918, + "xdm:spend": 663.0, + "xdm:conversions": 46 + }, + "xdm:instagram": { + "xdm:impressions": 12750, + "xdm:clicks": 459, + "xdm:spend": 331.5, + "xdm:conversions": 23 + }, + "xdm:messenger": { + "xdm:impressions": 2550, + "xdm:clicks": 92, + "xdm:spend": 66.3, + "xdm:conversions": 5 + }, + "xdm:audience_network": { + "xdm:impressions": 1700, + "xdm:clicks": 61, + "xdm:spend": 44.2, + "xdm:conversions": 3 + } + }, + "xdm:placementBreakdown": { + "xdm:feed": { + "xdm:impressions": 21250, + "xdm:clicks": 765, + "xdm:spend": 552.5, + "xdm:conversions": 38 + }, + "xdm:stories": { + "xdm:impressions": 10625, + "xdm:clicks": 383, + "xdm:spend": 276.25, + "xdm:conversions": 19 + }, + "xdm:reels": { + "xdm:impressions": 6375, + "xdm:clicks": 230, + "xdm:spend": 165.75, + "xdm:conversions": 12 + }, + "xdm:other": { + "xdm:impressions": 4250, + "xdm:clicks": 152, + "xdm:spend": 110.5, + "xdm:conversions": 8 + } + }, + "xdm:ageBreakdown": { + "xdm:age_18_24": { + "xdm:impressions": 6375, + "xdm:clicks": 230, + "xdm:spend": 165.75, + "xdm:conversions": 12 + }, + "xdm:age_25_34": { + "xdm:impressions": 14875, + "xdm:clicks": 536, + "xdm:spend": 386.75, + "xdm:conversions": 27 + }, + "xdm:age_35_44": { + "xdm:impressions": 12750, + "xdm:clicks": 459, + "xdm:spend": 331.5, + "xdm:conversions": 23 + }, + "xdm:age_45_54": { + "xdm:impressions": 6375, + "xdm:clicks": 230, + "xdm:spend": 165.75, + "xdm:conversions": 12 + }, + "xdm:age_55_64": { + "xdm:impressions": 2125, + "xdm:clicks": 75, + "xdm:spend": 55.25, + "xdm:conversions": 3 + } + }, + "xdm:genderBreakdown": { + "xdm:male": { + "xdm:impressions": 23375, + "xdm:clicks": 842, + "xdm:spend": 607.75, + "xdm:conversions": 42 + }, + "xdm:female": { + "xdm:impressions": 19125, + "xdm:clicks": 688, + "xdm:spend": 497.25, + "xdm:conversions": 35 + } + } + }, + "xdm:extendedMetrics": { + "xdm:videoViews": 0, + "xdm:videoViewsP25": 0, + "xdm:videoViewsP50": 0, + "xdm:videoViewsP75": 0, + "xdm:videoViewsP95": 0, + "xdm:videoViewsP100": 0, + "xdm:videoAvgWatchTime": 0, + "xdm:videoAvgWatchPercentage": 0, + "xdm:engagements": 2295, + "xdm:engagementRate": 0.054, + "xdm:likes": 1148, + "xdm:comments": 230, + "xdm:shares": 383, + "xdm:saves": 534, + "xdm:linkClicks": 1530, + "xdm:landingPageViews": 1377, + "xdm:outboundClicks": 1454, + "xdm:uniqueClicks": 1377, + "xdm:uniqueLinkClicks": 1377, + "xdm:costPerEngagement": 0.481, + "xdm:costPerLike": 0.963, + "xdm:costPerComment": 4.804, + "xdm:costPerShare": 2.885 + }, + "xdm:conversionMetrics": { + "xdm:viewThroughConversions": 15, + "xdm:clickThroughConversions": 62, + "xdm:totalConversions": 77, + "xdm:conversionRate": 0.056, + "xdm:costPerConversion": 14.35, + "xdm:conversionValue": 3825.0, + "xdm:valuePerConversion": 49.68, + "xdm:purchases": 62, + "xdm:purchaseValue": 3050.0, + "xdm:addToCart": 153, + "xdm:initiateCheckout": 92, + "xdm:leads": 15, + "xdm:signups": 31, + "xdm:downloads": 46, + "xdm:costPerPurchase": 17.82, + "xdm:costPerLead": 73.67, + "xdm:costPerSignup": 35.65 + }, + "xdm:costMetrics": { + "xdm:totalSpend": 1105.0, + "xdm:averageCPC": 0.722, + "xdm:averageCPM": 26.0, + "xdm:averageCPA": 14.35, + "xdm:averageCPE": 0.481, + "xdm:budgetUtilization": { + "xdm:budgetAllocated": 5000.0, + "xdm:budgetSpent": 1105.0, + "xdm:budgetRemaining": 3895.0, + "xdm:budgetUtilization": 0.221, + "xdm:dailyBudget": 5000.0 + } + }, + "xdm:attributionMetrics": { + "xdm:attributionModel": "LAST_CLICK", + "xdm:attributionWindow": "7d_click_1d_view", + "xdm:assistedConversions": 23, + "xdm:lastClickConversions": 54, + "xdm:firstClickConversions": 31, + "xdm:linearConversions": 38, + "xdm:timeDecayConversions": 46, + "xdm:positionBasedConversions": 42 + }, + "xdm:qualityMetrics": { + "xdm:qualityScore": 8.5, + "xdm:relevanceScore": 8.8, + "xdm:engagementRateRanking": "above_average", + "xdm:conversionRateRanking": "above_average", + "xdm:qualityRanking": "above_average", + "xdm:adRelevanceDiagnostics": "above_average", + "xdm:engagementRateDiagnostics": "above_average", + "xdm:conversionRateDiagnostics": "above_average" + } + } +} diff --git a/schemas/paid-media/paid-media-summary-metrics.example.4.json b/schemas/paid-media/paid-media-summary-metrics.example.4.json new file mode 100644 index 000000000..4e2244f15 --- /dev/null +++ b/schemas/paid-media/paid-media-summary-metrics.example.4.json @@ -0,0 +1,257 @@ +{ + "xdm:timestamp": "2025-11-09T00:00:00Z", + "xdm:paidMedia": { + "xdm:adNetwork": "meta", + "xdm:entityType": "ad", + "xdm:accountID": "act_123456789012345", + "xdm:accountGUID": "meta_act_123456789012345", + "xdm:campaignID": "23851234567890789", + "xdm:campaignGUID": "meta_act_123456789012345_23851234567890789", + "xdm:adGroupID": "23851234567890456", + "xdm:adGroupGUID": "meta_act_123456789012345_23851234567890456", + "xdm:adID": "23851234567890123", + "xdm:adGUID": "meta_act_123456789012345_23851234567890123", + "xdm:timestamp": "2025-11-09T00:00:00Z", + "xdm:date": "2025-11-09", + "xdm:granularity": "daily", + "xdm:coreMetrics": { + "xdm:impressions": 21250, + "xdm:clicks": 765, + "xdm:reach": 16125, + "xdm:frequency": 1.32, + "xdm:spend": 552.5, + "xdm:conversions": 38, + "xdm:conversionValue": 1912.5, + "xdm:ctr": 0.036, + "xdm:cpc": 0.722, + "xdm:cpm": 26.0, + "xdm:cpa": 14.54, + "xdm:roas": 3.46, + "xdm:roi": 2.46 + }, + "xdm:dimensionalBreakdowns": { + "xdm:deviceBreakdown": { + "xdm:mobile": { + "xdm:impressions": 14875, + "xdm:clicks": 574, + "xdm:spend": 386.75, + "xdm:conversions": 29 + }, + "xdm:desktop": { + "xdm:impressions": 5313, + "xdm:clicks": 160, + "xdm:spend": 138.13, + "xdm:conversions": 8 + }, + "xdm:tablet": { + "xdm:impressions": 1062, + "xdm:clicks": 31, + "xdm:spend": 27.62, + "xdm:conversions": 1 + } + }, + "xdm:platformBreakdown": { + "xdm:facebook": { + "xdm:impressions": 12750, + "xdm:clicks": 459, + "xdm:spend": 331.5, + "xdm:conversions": 23 + }, + "xdm:instagram": { + "xdm:impressions": 6375, + "xdm:clicks": 230, + "xdm:spend": 165.75, + "xdm:conversions": 12 + }, + "xdm:messenger": { + "xdm:impressions": 1275, + "xdm:clicks": 46, + "xdm:spend": 33.15, + "xdm:conversions": 2 + }, + "xdm:audience_network": { + "xdm:impressions": 850, + "xdm:clicks": 30, + "xdm:spend": 22.1, + "xdm:conversions": 1 + } + }, + "xdm:placementBreakdown": { + "xdm:feed": { + "xdm:impressions": 10625, + "xdm:clicks": 383, + "xdm:spend": 276.25, + "xdm:conversions": 19 + }, + "xdm:stories": { + "xdm:impressions": 5313, + "xdm:clicks": 191, + "xdm:spend": 138.13, + "xdm:conversions": 10 + }, + "xdm:reels": { + "xdm:impressions": 3188, + "xdm:clicks": 115, + "xdm:spend": 82.88, + "xdm:conversions": 6 + }, + "xdm:other": { + "xdm:impressions": 2124, + "xdm:clicks": 76, + "xdm:spend": 55.24, + "xdm:conversions": 3 + } + }, + "xdm:ageBreakdown": { + "xdm:age_18_24": { + "xdm:impressions": 3188, + "xdm:clicks": 115, + "xdm:spend": 82.88, + "xdm:conversions": 6 + }, + "xdm:age_25_34": { + "xdm:impressions": 7438, + "xdm:clicks": 268, + "xdm:spend": 193.38, + "xdm:conversions": 13 + }, + "xdm:age_35_44": { + "xdm:impressions": 6375, + "xdm:clicks": 230, + "xdm:spend": 165.75, + "xdm:conversions": 12 + }, + "xdm:age_45_54": { + "xdm:impressions": 3188, + "xdm:clicks": 115, + "xdm:spend": 82.88, + "xdm:conversions": 6 + }, + "xdm:age_55_64": { + "xdm:impressions": 1061, + "xdm:clicks": 37, + "xdm:spend": 27.61, + "xdm:conversions": 1 + } + }, + "xdm:genderBreakdown": { + "xdm:male": { + "xdm:impressions": 11688, + "xdm:clicks": 421, + "xdm:spend": 303.88, + "xdm:conversions": 21 + }, + "xdm:female": { + "xdm:impressions": 9562, + "xdm:clicks": 344, + "xdm:spend": 248.62, + "xdm:conversions": 17 + } + } + }, + "xdm:extendedMetrics": { + "xdm:videoViews": 17000, + "xdm:videoViewsP25": 14875, + "xdm:videoViewsP50": 12750, + "xdm:videoViewsP75": 10625, + "xdm:videoViewsP95": 8500, + "xdm:videoViewsP100": 6375, + "xdm:videoAvgWatchTime": 18.5, + "xdm:videoAvgWatchPercentage": 0.607, + "xdm:engagements": 1148, + "xdm:engagementRate": 0.054, + "xdm:likes": 574, + "xdm:comments": 115, + "xdm:shares": 191, + "xdm:saves": 268, + "xdm:linkClicks": 765, + "xdm:landingPageViews": 689, + "xdm:outboundClicks": 727, + "xdm:uniqueClicks": 689, + "xdm:uniqueLinkClicks": 689, + "xdm:costPerEngagement": 0.481, + "xdm:costPerLike": 0.963, + "xdm:costPerComment": 4.804, + "xdm:costPerShare": 2.892 + }, + "xdm:videoMetrics": { + "xdm:videoViews": 17000, + "xdm:videoViewsP25": 14875, + "xdm:videoViewsP50": 12750, + "xdm:videoViewsP75": 10625, + "xdm:videoViewsP95": 8500, + "xdm:videoViewsP100": 6375, + "xdm:videoAvgWatchTime": 18.5, + "xdm:videoAvgWatchPercentage": 0.607, + "xdm:videoCompletionRate": 0.375, + "xdm:videoViewRate": 0.8, + "xdm:costPerVideoView": 0.0325, + "xdm:costPerCompletedView": 0.0867, + "xdm:videoEngagements": 1148, + "xdm:videoEngagementRate": 0.0675, + "xdm:videoPlays": 21250, + "xdm:videoStarts": 21250, + "xdm:videoReplays": 850, + "xdm:videoPauses": 2125, + "xdm:videoResumes": 1700, + "xdm:videoSkips": 4250, + "xdm:videoMutes": 1063, + "xdm:videoUnmutes": 425, + "xdm:videoFullscreenEnters": 638, + "xdm:videoFullscreenExits": 638 + }, + "xdm:conversionMetrics": { + "xdm:viewThroughConversions": 8, + "xdm:clickThroughConversions": 30, + "xdm:totalConversions": 38, + "xdm:conversionRate": 0.055, + "xdm:costPerConversion": 14.54, + "xdm:conversionValue": 1912.5, + "xdm:valuePerConversion": 50.33, + "xdm:purchases": 30, + "xdm:purchaseValue": 1525.0, + "xdm:addToCart": 77, + "xdm:initiateCheckout": 46, + "xdm:leads": 8, + "xdm:signups": 15, + "xdm:downloads": 23, + "xdm:costPerPurchase": 18.42, + "xdm:costPerLead": 69.06, + "xdm:costPerSignup": 36.83 + }, + "xdm:costMetrics": { + "xdm:totalSpend": 552.5, + "xdm:averageCPC": 0.722, + "xdm:averageCPM": 26.0, + "xdm:averageCPA": 14.54, + "xdm:averageCPE": 0.481, + "xdm:budgetUtilization": { + "xdm:budgetAllocated": 5000.0, + "xdm:budgetSpent": 552.5, + "xdm:budgetRemaining": 4447.5, + "xdm:budgetUtilization": 0.111, + "xdm:dailyBudget": 5000.0 + } + }, + "xdm:attributionMetrics": { + "xdm:attributionModel": "LAST_CLICK", + "xdm:attributionWindow": "7d_click_1d_view", + "xdm:assistedConversions": 11, + "xdm:lastClickConversions": 27, + "xdm:firstClickConversions": 15, + "xdm:linearConversions": 19, + "xdm:timeDecayConversions": 23, + "xdm:positionBasedConversions": 21 + }, + "xdm:qualityMetrics": { + "xdm:qualityScore": 8.5, + "xdm:relevanceScore": 8.8, + "xdm:engagementRateRanking": "above_average", + "xdm:conversionRateRanking": "above_average", + "xdm:qualityRanking": "above_average", + "xdm:adRelevanceDiagnostics": "above_average", + "xdm:engagementRateDiagnostics": "above_average", + "xdm:conversionRateDiagnostics": "above_average" + } + } +} diff --git a/schemas/paid-media/paid-media-summary-metrics.example.5.json b/schemas/paid-media/paid-media-summary-metrics.example.5.json new file mode 100644 index 000000000..436cba469 --- /dev/null +++ b/schemas/paid-media/paid-media-summary-metrics.example.5.json @@ -0,0 +1,253 @@ +{ + "xdm:timestamp": "2025-11-09T00:00:00Z", + "xdm:paidMedia": { + "xdm:adNetwork": "meta", + "xdm:entityType": "asset", + "xdm:accountID": "act_123456789012345", + "xdm:accountGUID": "meta_act_123456789012345", + "xdm:assetID": "987654321012345", + "xdm:assetGUID": "meta_act_123456789012345_asset_987654321012345", + "xdm:timestamp": "2025-11-09T00:00:00Z", + "xdm:date": "2025-11-09", + "xdm:granularity": "daily", + "xdm:coreMetrics": { + "xdm:impressions": 21250, + "xdm:clicks": 765, + "xdm:reach": 16125, + "xdm:frequency": 1.32, + "xdm:spend": 552.5, + "xdm:conversions": 38, + "xdm:conversionValue": 1912.5, + "xdm:ctr": 0.036, + "xdm:cpc": 0.722, + "xdm:cpm": 26.0, + "xdm:cpa": 14.54, + "xdm:roas": 3.46, + "xdm:roi": 2.46 + }, + "xdm:dimensionalBreakdowns": { + "xdm:deviceBreakdown": { + "xdm:mobile": { + "xdm:impressions": 14875, + "xdm:clicks": 574, + "xdm:spend": 386.75, + "xdm:conversions": 29 + }, + "xdm:desktop": { + "xdm:impressions": 5313, + "xdm:clicks": 160, + "xdm:spend": 138.13, + "xdm:conversions": 8 + }, + "xdm:tablet": { + "xdm:impressions": 1062, + "xdm:clicks": 31, + "xdm:spend": 27.62, + "xdm:conversions": 1 + } + }, + "xdm:platformBreakdown": { + "xdm:facebook": { + "xdm:impressions": 12750, + "xdm:clicks": 459, + "xdm:spend": 331.5, + "xdm:conversions": 23 + }, + "xdm:instagram": { + "xdm:impressions": 6375, + "xdm:clicks": 230, + "xdm:spend": 165.75, + "xdm:conversions": 12 + }, + "xdm:messenger": { + "xdm:impressions": 1275, + "xdm:clicks": 46, + "xdm:spend": 33.15, + "xdm:conversions": 2 + }, + "xdm:audience_network": { + "xdm:impressions": 850, + "xdm:clicks": 30, + "xdm:spend": 22.1, + "xdm:conversions": 1 + } + }, + "xdm:placementBreakdown": { + "xdm:feed": { + "xdm:impressions": 10625, + "xdm:clicks": 383, + "xdm:spend": 276.25, + "xdm:conversions": 19 + }, + "xdm:stories": { + "xdm:impressions": 5313, + "xdm:clicks": 191, + "xdm:spend": 138.13, + "xdm:conversions": 10 + }, + "xdm:reels": { + "xdm:impressions": 3188, + "xdm:clicks": 115, + "xdm:spend": 82.88, + "xdm:conversions": 6 + }, + "xdm:other": { + "xdm:impressions": 2124, + "xdm:clicks": 76, + "xdm:spend": 55.24, + "xdm:conversions": 3 + } + }, + "xdm:ageBreakdown": { + "xdm:age_18_24": { + "xdm:impressions": 3188, + "xdm:clicks": 115, + "xdm:spend": 82.88, + "xdm:conversions": 6 + }, + "xdm:age_25_34": { + "xdm:impressions": 7438, + "xdm:clicks": 268, + "xdm:spend": 193.38, + "xdm:conversions": 13 + }, + "xdm:age_35_44": { + "xdm:impressions": 6375, + "xdm:clicks": 230, + "xdm:spend": 165.75, + "xdm:conversions": 12 + }, + "xdm:age_45_54": { + "xdm:impressions": 3188, + "xdm:clicks": 115, + "xdm:spend": 82.88, + "xdm:conversions": 6 + }, + "xdm:age_55_64": { + "xdm:impressions": 1061, + "xdm:clicks": 37, + "xdm:spend": 27.61, + "xdm:conversions": 1 + } + }, + "xdm:genderBreakdown": { + "xdm:male": { + "xdm:impressions": 11688, + "xdm:clicks": 421, + "xdm:spend": 303.88, + "xdm:conversions": 21 + }, + "xdm:female": { + "xdm:impressions": 9562, + "xdm:clicks": 344, + "xdm:spend": 248.62, + "xdm:conversions": 17 + } + } + }, + "xdm:extendedMetrics": { + "xdm:videoViews": 17000, + "xdm:videoViewsP25": 14875, + "xdm:videoViewsP50": 12750, + "xdm:videoViewsP75": 10625, + "xdm:videoViewsP95": 8500, + "xdm:videoViewsP100": 6375, + "xdm:videoAvgWatchTime": 18.5, + "xdm:videoAvgWatchPercentage": 0.607, + "xdm:engagements": 1148, + "xdm:engagementRate": 0.054, + "xdm:likes": 574, + "xdm:comments": 115, + "xdm:shares": 191, + "xdm:saves": 268, + "xdm:linkClicks": 765, + "xdm:landingPageViews": 689, + "xdm:outboundClicks": 727, + "xdm:uniqueClicks": 689, + "xdm:uniqueLinkClicks": 689, + "xdm:costPerEngagement": 0.481, + "xdm:costPerLike": 0.963, + "xdm:costPerComment": 4.804, + "xdm:costPerShare": 2.892 + }, + "xdm:videoMetrics": { + "xdm:videoViews": 17000, + "xdm:videoViewsP25": 14875, + "xdm:videoViewsP50": 12750, + "xdm:videoViewsP75": 10625, + "xdm:videoViewsP95": 8500, + "xdm:videoViewsP100": 6375, + "xdm:videoAvgWatchTime": 18.5, + "xdm:videoAvgWatchPercentage": 0.607, + "xdm:videoCompletionRate": 0.375, + "xdm:videoViewRate": 0.8, + "xdm:costPerVideoView": 0.0325, + "xdm:costPerCompletedView": 0.0867, + "xdm:videoEngagements": 1148, + "xdm:videoEngagementRate": 0.0675, + "xdm:videoPlays": 21250, + "xdm:videoStarts": 21250, + "xdm:videoReplays": 850, + "xdm:videoPauses": 2125, + "xdm:videoResumes": 1700, + "xdm:videoSkips": 4250, + "xdm:videoMutes": 1063, + "xdm:videoUnmutes": 425, + "xdm:videoFullscreenEnters": 638, + "xdm:videoFullscreenExits": 638 + }, + "xdm:conversionMetrics": { + "xdm:viewThroughConversions": 8, + "xdm:clickThroughConversions": 30, + "xdm:totalConversions": 38, + "xdm:conversionRate": 0.055, + "xdm:costPerConversion": 14.54, + "xdm:conversionValue": 1912.5, + "xdm:valuePerConversion": 50.33, + "xdm:purchases": 30, + "xdm:purchaseValue": 1525.0, + "xdm:addToCart": 77, + "xdm:initiateCheckout": 46, + "xdm:leads": 8, + "xdm:signups": 15, + "xdm:downloads": 23, + "xdm:costPerPurchase": 18.42, + "xdm:costPerLead": 69.06, + "xdm:costPerSignup": 36.83 + }, + "xdm:costMetrics": { + "xdm:totalSpend": 552.5, + "xdm:averageCPC": 0.722, + "xdm:averageCPM": 26.0, + "xdm:averageCPA": 14.54, + "xdm:averageCPE": 0.481, + "xdm:budgetUtilization": { + "xdm:budgetAllocated": 0, + "xdm:budgetSpent": 552.5, + "xdm:budgetRemaining": 0, + "xdm:budgetUtilization": 0, + "xdm:dailyBudget": 0 + } + }, + "xdm:attributionMetrics": { + "xdm:attributionModel": "LAST_CLICK", + "xdm:attributionWindow": "7d_click_1d_view", + "xdm:assistedConversions": 11, + "xdm:lastClickConversions": 27, + "xdm:firstClickConversions": 15, + "xdm:linearConversions": 19, + "xdm:timeDecayConversions": 23, + "xdm:positionBasedConversions": 21 + }, + "xdm:qualityMetrics": { + "xdm:qualityScore": 8.5, + "xdm:relevanceScore": 8.8, + "xdm:engagementRateRanking": "above_average", + "xdm:conversionRateRanking": "above_average", + "xdm:qualityRanking": "above_average", + "xdm:adRelevanceDiagnostics": "above_average", + "xdm:engagementRateDiagnostics": "above_average", + "xdm:conversionRateDiagnostics": "above_average" + } + } +} diff --git a/schemas/paid-media/paid-media-summary-metrics.example.6.json b/schemas/paid-media/paid-media-summary-metrics.example.6.json new file mode 100644 index 000000000..fb53b700c --- /dev/null +++ b/schemas/paid-media/paid-media-summary-metrics.example.6.json @@ -0,0 +1,227 @@ +{ + "xdm:timestamp": "2025-11-09T00:00:00Z", + "xdm:paidMedia": { + "xdm:adNetwork": "meta", + "xdm:entityType": "asset", + "xdm:accountID": "act_123456789012345", + "xdm:accountGUID": "meta_act_123456789012345", + "xdm:assetID": "456789123456789", + "xdm:assetGUID": "meta_act_123456789012345_asset_456789123456789", + "xdm:timestamp": "2025-11-09T00:00:00Z", + "xdm:date": "2025-11-09", + "xdm:granularity": "daily", + "xdm:coreMetrics": { + "xdm:impressions": 14875, + "xdm:clicks": 535, + "xdm:reach": 11288, + "xdm:frequency": 1.32, + "xdm:spend": 386.25, + "xdm:conversions": 27, + "xdm:conversionValue": 1337.5, + "xdm:ctr": 0.036, + "xdm:cpc": 0.722, + "xdm:cpm": 26.0, + "xdm:cpa": 14.31, + "xdm:roas": 3.46, + "xdm:roi": 2.46 + }, + "xdm:dimensionalBreakdowns": { + "xdm:deviceBreakdown": { + "xdm:mobile": { + "xdm:impressions": 10413, + "xdm:clicks": 401, + "xdm:spend": 270.38, + "xdm:conversions": 20 + }, + "xdm:desktop": { + "xdm:impressions": 3719, + "xdm:clicks": 112, + "xdm:spend": 96.69, + "xdm:conversions": 6 + }, + "xdm:tablet": { + "xdm:impressions": 743, + "xdm:clicks": 22, + "xdm:spend": 19.18, + "xdm:conversions": 1 + } + }, + "xdm:platformBreakdown": { + "xdm:facebook": { + "xdm:impressions": 8925, + "xdm:clicks": 321, + "xdm:spend": 231.75, + "xdm:conversions": 16 + }, + "xdm:instagram": { + "xdm:impressions": 4463, + "xdm:clicks": 161, + "xdm:spend": 115.88, + "xdm:conversions": 8 + }, + "xdm:messenger": { + "xdm:impressions": 893, + "xdm:clicks": 32, + "xdm:spend": 23.18, + "xdm:conversions": 2 + }, + "xdm:audience_network": { + "xdm:impressions": 594, + "xdm:clicks": 21, + "xdm:spend": 15.44, + "xdm:conversions": 1 + } + }, + "xdm:placementBreakdown": { + "xdm:feed": { + "xdm:impressions": 7438, + "xdm:clicks": 268, + "xdm:spend": 193.13, + "xdm:conversions": 13 + }, + "xdm:stories": { + "xdm:impressions": 3719, + "xdm:clicks": 134, + "xdm:spend": 96.56, + "xdm:conversions": 7 + }, + "xdm:reels": { + "xdm:impressions": 2231, + "xdm:clicks": 80, + "xdm:spend": 57.94, + "xdm:conversions": 4 + }, + "xdm:other": { + "xdm:impressions": 1487, + "xdm:clicks": 53, + "xdm:spend": 38.62, + "xdm:conversions": 3 + } + }, + "xdm:ageBreakdown": { + "xdm:age_18_24": { + "xdm:impressions": 2231, + "xdm:clicks": 80, + "xdm:spend": 57.94, + "xdm:conversions": 4 + }, + "xdm:age_25_34": { + "xdm:impressions": 5206, + "xdm:clicks": 187, + "xdm:spend": 135.19, + "xdm:conversions": 9 + }, + "xdm:age_35_44": { + "xdm:impressions": 4463, + "xdm:clicks": 161, + "xdm:spend": 115.88, + "xdm:conversions": 8 + }, + "xdm:age_45_54": { + "xdm:impressions": 2231, + "xdm:clicks": 80, + "xdm:spend": 57.94, + "xdm:conversions": 4 + }, + "xdm:age_55_64": { + "xdm:impressions": 744, + "xdm:clicks": 27, + "xdm:spend": 19.3, + "xdm:conversions": 2 + } + }, + "xdm:genderBreakdown": { + "xdm:male": { + "xdm:impressions": 8181, + "xdm:clicks": 294, + "xdm:spend": 212.44, + "xdm:conversions": 15 + }, + "xdm:female": { + "xdm:impressions": 6694, + "xdm:clicks": 241, + "xdm:spend": 173.81, + "xdm:conversions": 12 + } + } + }, + "xdm:extendedMetrics": { + "xdm:videoViews": 0, + "xdm:videoViewsP25": 0, + "xdm:videoViewsP50": 0, + "xdm:videoViewsP75": 0, + "xdm:videoViewsP95": 0, + "xdm:videoViewsP100": 0, + "xdm:videoAvgWatchTime": 0, + "xdm:videoAvgWatchPercentage": 0, + "xdm:engagements": 803, + "xdm:engagementRate": 0.054, + "xdm:likes": 401, + "xdm:comments": 80, + "xdm:shares": 134, + "xdm:saves": 188, + "xdm:linkClicks": 535, + "xdm:landingPageViews": 482, + "xdm:outboundClicks": 509, + "xdm:uniqueClicks": 482, + "xdm:uniqueLinkClicks": 482, + "xdm:costPerEngagement": 0.481, + "xdm:costPerLike": 0.963, + "xdm:costPerComment": 4.828, + "xdm:costPerShare": 2.883 + }, + "xdm:conversionMetrics": { + "xdm:viewThroughConversions": 5, + "xdm:clickThroughConversions": 22, + "xdm:totalConversions": 27, + "xdm:conversionRate": 0.056, + "xdm:costPerConversion": 14.31, + "xdm:conversionValue": 1337.5, + "xdm:valuePerConversion": 49.54, + "xdm:purchases": 22, + "xdm:purchaseValue": 1067.5, + "xdm:addToCart": 54, + "xdm:initiateCheckout": 32, + "xdm:leads": 5, + "xdm:signups": 11, + "xdm:downloads": 16, + "xdm:costPerPurchase": 17.56, + "xdm:costPerLead": 77.25, + "xdm:costPerSignup": 35.11 + }, + "xdm:costMetrics": { + "xdm:totalSpend": 386.25, + "xdm:averageCPC": 0.722, + "xdm:averageCPM": 26.0, + "xdm:averageCPA": 14.31, + "xdm:averageCPE": 0.481, + "xdm:budgetUtilization": { + "xdm:budgetAllocated": 0, + "xdm:budgetSpent": 552.5, + "xdm:budgetRemaining": 0, + "xdm:budgetUtilization": 0, + "xdm:dailyBudget": 0 + } + }, + "xdm:attributionMetrics": { + "xdm:attributionModel": "LAST_CLICK", + "xdm:attributionWindow": "7d_click_1d_view", + "xdm:assistedConversions": 8, + "xdm:lastClickConversions": 19, + "xdm:firstClickConversions": 11, + "xdm:linearConversions": 13, + "xdm:timeDecayConversions": 16, + "xdm:positionBasedConversions": 15 + }, + "xdm:qualityMetrics": { + "xdm:qualityScore": 7.8, + "xdm:relevanceScore": 8.2, + "xdm:engagementRateRanking": "average", + "xdm:conversionRateRanking": "above_average", + "xdm:qualityRanking": "average", + "xdm:adRelevanceDiagnostics": "average", + "xdm:engagementRateDiagnostics": "average", + "xdm:conversionRateDiagnostics": "above_average" + } + } +} diff --git a/schemas/paid-media/paid-media-summary-metrics.schema.json b/schemas/paid-media/paid-media-summary-metrics.schema.json new file mode 100644 index 000000000..083078000 --- /dev/null +++ b/schemas/paid-media/paid-media-summary-metrics.schema.json @@ -0,0 +1,61 @@ +{ + "meta:license": [ + "Copyright 2025 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "https://ns.adobe.com/xdm/schemas/paid-media-summary-metrics", + "title": "Paid Media Summary Metrics", + "type": "object", + "description": "Schema for paid media summary metrics dataset containing time-series performance data across all ad networks", + "meta:class": "https://ns.adobe.com/xdm/classes/summarymetrics", + "meta:extensible": false, + "meta:abstract": false, + "meta:extends": [ + "https://ns.adobe.com/xdm/classes/summarymetrics", + "https://ns.adobe.com/xdm/mixins/paid-media/core-identifiers", + "https://ns.adobe.com/xdm/mixins/paid-media/core-metrics", + "https://ns.adobe.com/xdm/mixins/paid-media/dimensional-breakdowns", + "https://ns.adobe.com/xdm/mixins/paid-media/extended-metrics", + "https://ns.adobe.com/xdm/mixins/paid-media/video-metrics", + "https://ns.adobe.com/xdm/mixins/paid-media/conversion-metrics", + "https://ns.adobe.com/xdm/mixins/paid-media/cost-metrics", + "https://ns.adobe.com/xdm/mixins/paid-media/attribution-metrics", + "https://ns.adobe.com/xdm/mixins/paid-media/quality-metrics" + ], + "allOf": [ + { + "$ref": "https://ns.adobe.com/xdm/classes/summarymetrics" + }, + { + "$ref": "https://ns.adobe.com/xdm/mixins/paid-media/core-identifiers" + }, + { + "$ref": "https://ns.adobe.com/xdm/mixins/paid-media/core-metrics" + }, + { + "$ref": "https://ns.adobe.com/xdm/mixins/paid-media/dimensional-breakdowns" + }, + { + "$ref": "https://ns.adobe.com/xdm/mixins/paid-media/extended-metrics" + }, + { + "$ref": "https://ns.adobe.com/xdm/mixins/paid-media/video-metrics" + }, + { + "$ref": "https://ns.adobe.com/xdm/mixins/paid-media/conversion-metrics" + }, + { + "$ref": "https://ns.adobe.com/xdm/mixins/paid-media/cost-metrics" + }, + { + "$ref": "https://ns.adobe.com/xdm/mixins/paid-media/attribution-metrics" + }, + { + "$ref": "https://ns.adobe.com/xdm/mixins/paid-media/quality-metrics" + } + ], + "meta:status": "experimental" +} From 25751642ff021e31f4045e63a1e63ea763f329c3 Mon Sep 17 00:00:00 2001 From: Ray Yang Date: Wed, 12 Nov 2025 11:23:40 -0700 Subject: [PATCH 13/22] whitespace test --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 74ca321ee..6650be65d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -411,7 +411,7 @@ Run `npm run validate` to validate that all example files match their correspond - Caches fetched remote schemas to avoid duplicate requests - Reports validation results including count of remote schemas fetched -The command validates `components`, `extensions`, and `schemas` directories by default, or you can specify specific directories: `npm run validate components/datatypes/paid-media`. +The command validates `components`, `extensions`, and `schemas` directories by default, or you can specify specific directories: `npm run validate components/datatypes/paid-media`. ### Re-Use and Modularity From e4da20296fb56a60252f4ab079c99f4a5be107b7 Mon Sep 17 00:00:00 2001 From: Dan Bunker Date: Tue, 18 Nov 2025 09:35:29 -0800 Subject: [PATCH 14/22] Fix lint issues with contributing doc --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6650be65d..74ca321ee 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -411,7 +411,7 @@ Run `npm run validate` to validate that all example files match their correspond - Caches fetched remote schemas to avoid duplicate requests - Reports validation results including count of remote schemas fetched -The command validates `components`, `extensions`, and `schemas` directories by default, or you can specify specific directories: `npm run validate components/datatypes/paid-media`. +The command validates `components`, `extensions`, and `schemas` directories by default, or you can specify specific directories: `npm run validate components/datatypes/paid-media`. ### Re-Use and Modularity From 7c025051938878610c79522bf8468c5648292aeb Mon Sep 17 00:00:00 2001 From: Dan Bunker Date: Wed, 19 Nov 2025 13:55:58 -0800 Subject: [PATCH 15/22] Remove example fields that are not in the schema and switch number types to /xdm/data/measure refs --- .../paid-media-summary-metrics.example.1.json | 147 +++++++------ .../paid-media-summary-metrics.example.2.json | 147 +++++++------ .../paid-media-summary-metrics.example.3.json | 147 +++++++------ .../paid-media-summary-metrics.example.4.json | 195 ++++++++++-------- .../paid-media-summary-metrics.example.5.json | 195 ++++++++++-------- .../paid-media-summary-metrics.example.6.json | 147 +++++++------ 6 files changed, 582 insertions(+), 396 deletions(-) diff --git a/schemas/paid-media/paid-media-summary-metrics.example.1.json b/schemas/paid-media/paid-media-summary-metrics.example.1.json index 4d8627ebd..708ddc9ed 100644 --- a/schemas/paid-media/paid-media-summary-metrics.example.1.json +++ b/schemas/paid-media/paid-media-summary-metrics.example.1.json @@ -144,76 +144,107 @@ } }, "xdm:extendedMetrics": { - "xdm:videoViews": 0, - "xdm:videoViewsP25": 0, - "xdm:videoViewsP50": 0, - "xdm:videoViewsP75": 0, - "xdm:videoViewsP95": 0, - "xdm:videoViewsP100": 0, - "xdm:videoAvgWatchTime": 0, - "xdm:videoAvgWatchPercentage": 0, - "xdm:engagements": 6750, - "xdm:engagementRate": 0.054, - "xdm:likes": 3375, - "xdm:comments": 675, - "xdm:shares": 1125, - "xdm:saves": 1575, - "xdm:linkClicks": 4500, - "xdm:landingPageViews": 4050, - "xdm:outboundClicks": 4275, - "xdm:uniqueClicks": 4050, - "xdm:uniqueLinkClicks": 4050, - "xdm:costPerEngagement": 0.481, - "xdm:costPerLike": 0.963, - "xdm:costPerComment": 4.815, - "xdm:costPerShare": 2.889 + "xdm:likes": { + "xdm:value": 3375 + }, + "xdm:comments": { + "xdm:value": 675 + }, + "xdm:shares": { + "xdm:value": 1125 + }, + "xdm:saves": { + "xdm:value": 1575 + }, + "xdm:linkClicks": { + "xdm:value": 4500 + }, + "xdm:outboundClicks": { + "xdm:value": 4275 + }, + "xdm:uniqueClicks": { + "xdm:value": 4050 + } }, "xdm:conversionMetrics": { - "xdm:viewThroughConversions": 45, - "xdm:clickThroughConversions": 180, - "xdm:totalConversions": 225, - "xdm:conversionRate": 0.05, - "xdm:costPerConversion": 14.44, - "xdm:conversionValue": 11250.0, - "xdm:valuePerConversion": 50.0, - "xdm:purchases": 180, - "xdm:purchaseValue": 9000.0, - "xdm:addToCart": 450, - "xdm:initiateCheckout": 270, - "xdm:leads": 45, - "xdm:signups": 90, - "xdm:downloads": 135, - "xdm:costPerPurchase": 18.06, - "xdm:costPerLead": 72.22, - "xdm:costPerSignup": 36.11 + "xdm:postViewConversions": { + "xdm:value": 45 + }, + "xdm:postClickConversions": { + "xdm:value": 180 + }, + "xdm:conversionRate": { + "xdm:value": 0.05 + }, + "xdm:costPerAction": { + "xdm:value": 14.44 + }, + "xdm:actionValue": 11250.0, + "xdm:conversionsByType": { + "xdm:purchases": { + "xdm:value": 180 + }, + "xdm:addToCart": { + "xdm:value": 450 + }, + "xdm:initiateCheckout": { + "xdm:value": 270 + }, + "xdm:leads": { + "xdm:value": 45 + }, + "xdm:downloads": { + "xdm:value": 135 + } + }, + "xdm:leads": { + "xdm:value": 45 + }, + "xdm:costPerLead": { + "xdm:value": 72.22 + } }, "xdm:costMetrics": { - "xdm:totalSpend": 3250.0, - "xdm:averageCPC": 0.722, - "xdm:averageCPM": 26.0, - "xdm:averageCPA": 14.44, - "xdm:averageCPE": 0.481, + "xdm:averageCpc": { + "xdm:value": 0.722 + }, + "xdm:averageCpm": { + "xdm:value": 26.0 + }, + "xdm:averageCpa": { + "xdm:value": 14.44 + }, + "xdm:averageCpe": { + "xdm:value": 0.481 + }, "xdm:budgetUtilization": { - "xdm:budgetAllocated": 5000.0, - "xdm:budgetSpent": 3250.0, - "xdm:budgetRemaining": 1750.0, - "xdm:budgetUtilization": 0.65, - "xdm:dailyBudget": 5000.0 + "xdm:budgetAllocated": { + "xdm:value": 5000.0 + }, + "xdm:budgetSpent": { + "xdm:value": 3250.0 + }, + "xdm:budgetRemaining": { + "xdm:value": 1750.0 + }, + "xdm:budgetUtilization": { + "xdm:value": 0.65 + }, + "xdm:dailyBudget": { + "xdm:value": 5000.0 + } } }, "xdm:attributionMetrics": { "xdm:attributionModel": "LAST_CLICK", - "xdm:attributionWindow": "7d_click_1d_view", - "xdm:assistedConversions": 67, - "xdm:lastClickConversions": 158, - "xdm:firstClickConversions": 90, - "xdm:linearConversions": 112, - "xdm:timeDecayConversions": 135, - "xdm:positionBasedConversions": 124 + "xdm:clickAttributionWindow": "7_DAY", + "xdm:viewAttributionWindow": "1_DAY" }, "xdm:qualityMetrics": { "xdm:qualityScore": 8.5, - "xdm:relevanceScore": 8.8, + "xdm:relevanceScore": { + "xdm:value": 8.8 + }, "xdm:engagementRateRanking": "above_average", "xdm:conversionRateRanking": "above_average", "xdm:qualityRanking": "above_average", diff --git a/schemas/paid-media/paid-media-summary-metrics.example.2.json b/schemas/paid-media/paid-media-summary-metrics.example.2.json index 2b07349b0..24d62887a 100644 --- a/schemas/paid-media/paid-media-summary-metrics.example.2.json +++ b/schemas/paid-media/paid-media-summary-metrics.example.2.json @@ -146,76 +146,107 @@ } }, "xdm:extendedMetrics": { - "xdm:videoViews": 0, - "xdm:videoViewsP25": 0, - "xdm:videoViewsP50": 0, - "xdm:videoViewsP75": 0, - "xdm:videoViewsP95": 0, - "xdm:videoViewsP100": 0, - "xdm:videoAvgWatchTime": 0, - "xdm:videoAvgWatchPercentage": 0, - "xdm:engagements": 4590, - "xdm:engagementRate": 0.054, - "xdm:likes": 2295, - "xdm:comments": 459, - "xdm:shares": 765, - "xdm:saves": 1071, - "xdm:linkClicks": 3060, - "xdm:landingPageViews": 2754, - "xdm:outboundClicks": 2907, - "xdm:uniqueClicks": 2754, - "xdm:uniqueLinkClicks": 2754, - "xdm:costPerEngagement": 0.481, - "xdm:costPerLike": 0.963, - "xdm:costPerComment": 4.815, - "xdm:costPerShare": 2.889 + "xdm:likes": { + "xdm:value": 2295 + }, + "xdm:comments": { + "xdm:value": 459 + }, + "xdm:shares": { + "xdm:value": 765 + }, + "xdm:saves": { + "xdm:value": 1071 + }, + "xdm:linkClicks": { + "xdm:value": 3060 + }, + "xdm:outboundClicks": { + "xdm:value": 2907 + }, + "xdm:uniqueClicks": { + "xdm:value": 2754 + } }, "xdm:conversionMetrics": { - "xdm:viewThroughConversions": 31, - "xdm:clickThroughConversions": 122, - "xdm:totalConversions": 153, - "xdm:conversionRate": 0.05, - "xdm:costPerConversion": 14.44, - "xdm:conversionValue": 7650.0, - "xdm:valuePerConversion": 50.0, - "xdm:purchases": 122, - "xdm:purchaseValue": 6100.0, - "xdm:addToCart": 306, - "xdm:initiateCheckout": 184, - "xdm:leads": 31, - "xdm:signups": 61, - "xdm:downloads": 92, - "xdm:costPerPurchase": 18.11, - "xdm:costPerLead": 71.29, - "xdm:costPerSignup": 36.23 + "xdm:postViewConversions": { + "xdm:value": 31 + }, + "xdm:postClickConversions": { + "xdm:value": 122 + }, + "xdm:conversionRate": { + "xdm:value": 0.05 + }, + "xdm:costPerAction": { + "xdm:value": 14.44 + }, + "xdm:actionValue": 7650.0, + "xdm:conversionsByType": { + "xdm:purchases": { + "xdm:value": 122 + }, + "xdm:addToCart": { + "xdm:value": 306 + }, + "xdm:initiateCheckout": { + "xdm:value": 184 + }, + "xdm:leads": { + "xdm:value": 31 + }, + "xdm:downloads": { + "xdm:value": 92 + } + }, + "xdm:leads": { + "xdm:value": 31 + }, + "xdm:costPerLead": { + "xdm:value": 71.29 + } }, "xdm:costMetrics": { - "xdm:totalSpend": 2210.0, - "xdm:averageCPC": 0.722, - "xdm:averageCPM": 26.0, - "xdm:averageCPA": 14.44, - "xdm:averageCPE": 0.481, + "xdm:averageCpc": { + "xdm:value": 0.722 + }, + "xdm:averageCpm": { + "xdm:value": 26.0 + }, + "xdm:averageCpa": { + "xdm:value": 14.44 + }, + "xdm:averageCpe": { + "xdm:value": 0.481 + }, "xdm:budgetUtilization": { - "xdm:budgetAllocated": 5000.0, - "xdm:budgetSpent": 2210.0, - "xdm:budgetRemaining": 2790.0, - "xdm:budgetUtilization": 0.442, - "xdm:dailyBudget": 5000.0 + "xdm:budgetAllocated": { + "xdm:value": 5000.0 + }, + "xdm:budgetSpent": { + "xdm:value": 2210.0 + }, + "xdm:budgetRemaining": { + "xdm:value": 2790.0 + }, + "xdm:budgetUtilization": { + "xdm:value": 0.442 + }, + "xdm:dailyBudget": { + "xdm:value": 5000.0 + } } }, "xdm:attributionMetrics": { "xdm:attributionModel": "LAST_CLICK", - "xdm:attributionWindow": "7d_click_1d_view", - "xdm:assistedConversions": 46, - "xdm:lastClickConversions": 107, - "xdm:firstClickConversions": 61, - "xdm:linearConversions": 76, - "xdm:timeDecayConversions": 92, - "xdm:positionBasedConversions": 84 + "xdm:clickAttributionWindow": "7_DAY", + "xdm:viewAttributionWindow": "1_DAY" }, "xdm:qualityMetrics": { "xdm:qualityScore": 8.5, - "xdm:relevanceScore": 8.8, + "xdm:relevanceScore": { + "xdm:value": 8.8 + }, "xdm:engagementRateRanking": "above_average", "xdm:conversionRateRanking": "above_average", "xdm:qualityRanking": "above_average", diff --git a/schemas/paid-media/paid-media-summary-metrics.example.3.json b/schemas/paid-media/paid-media-summary-metrics.example.3.json index b4ea8876b..d35733f63 100644 --- a/schemas/paid-media/paid-media-summary-metrics.example.3.json +++ b/schemas/paid-media/paid-media-summary-metrics.example.3.json @@ -148,76 +148,107 @@ } }, "xdm:extendedMetrics": { - "xdm:videoViews": 0, - "xdm:videoViewsP25": 0, - "xdm:videoViewsP50": 0, - "xdm:videoViewsP75": 0, - "xdm:videoViewsP95": 0, - "xdm:videoViewsP100": 0, - "xdm:videoAvgWatchTime": 0, - "xdm:videoAvgWatchPercentage": 0, - "xdm:engagements": 2295, - "xdm:engagementRate": 0.054, - "xdm:likes": 1148, - "xdm:comments": 230, - "xdm:shares": 383, - "xdm:saves": 534, - "xdm:linkClicks": 1530, - "xdm:landingPageViews": 1377, - "xdm:outboundClicks": 1454, - "xdm:uniqueClicks": 1377, - "xdm:uniqueLinkClicks": 1377, - "xdm:costPerEngagement": 0.481, - "xdm:costPerLike": 0.963, - "xdm:costPerComment": 4.804, - "xdm:costPerShare": 2.885 + "xdm:likes": { + "xdm:value": 1148 + }, + "xdm:comments": { + "xdm:value": 230 + }, + "xdm:shares": { + "xdm:value": 383 + }, + "xdm:saves": { + "xdm:value": 534 + }, + "xdm:linkClicks": { + "xdm:value": 1530 + }, + "xdm:outboundClicks": { + "xdm:value": 1454 + }, + "xdm:uniqueClicks": { + "xdm:value": 1377 + } }, "xdm:conversionMetrics": { - "xdm:viewThroughConversions": 15, - "xdm:clickThroughConversions": 62, - "xdm:totalConversions": 77, - "xdm:conversionRate": 0.056, - "xdm:costPerConversion": 14.35, - "xdm:conversionValue": 3825.0, - "xdm:valuePerConversion": 49.68, - "xdm:purchases": 62, - "xdm:purchaseValue": 3050.0, - "xdm:addToCart": 153, - "xdm:initiateCheckout": 92, - "xdm:leads": 15, - "xdm:signups": 31, - "xdm:downloads": 46, - "xdm:costPerPurchase": 17.82, - "xdm:costPerLead": 73.67, - "xdm:costPerSignup": 35.65 + "xdm:postViewConversions": { + "xdm:value": 15 + }, + "xdm:postClickConversions": { + "xdm:value": 62 + }, + "xdm:conversionRate": { + "xdm:value": 0.056 + }, + "xdm:costPerAction": { + "xdm:value": 14.35 + }, + "xdm:actionValue": 3825.0, + "xdm:conversionsByType": { + "xdm:purchases": { + "xdm:value": 62 + }, + "xdm:addToCart": { + "xdm:value": 153 + }, + "xdm:initiateCheckout": { + "xdm:value": 92 + }, + "xdm:leads": { + "xdm:value": 15 + }, + "xdm:downloads": { + "xdm:value": 46 + } + }, + "xdm:leads": { + "xdm:value": 15 + }, + "xdm:costPerLead": { + "xdm:value": 73.67 + } }, "xdm:costMetrics": { - "xdm:totalSpend": 1105.0, - "xdm:averageCPC": 0.722, - "xdm:averageCPM": 26.0, - "xdm:averageCPA": 14.35, - "xdm:averageCPE": 0.481, + "xdm:averageCpc": { + "xdm:value": 0.722 + }, + "xdm:averageCpm": { + "xdm:value": 26.0 + }, + "xdm:averageCpa": { + "xdm:value": 14.35 + }, + "xdm:averageCpe": { + "xdm:value": 0.481 + }, "xdm:budgetUtilization": { - "xdm:budgetAllocated": 5000.0, - "xdm:budgetSpent": 1105.0, - "xdm:budgetRemaining": 3895.0, - "xdm:budgetUtilization": 0.221, - "xdm:dailyBudget": 5000.0 + "xdm:budgetAllocated": { + "xdm:value": 5000.0 + }, + "xdm:budgetSpent": { + "xdm:value": 1105.0 + }, + "xdm:budgetRemaining": { + "xdm:value": 3895.0 + }, + "xdm:budgetUtilization": { + "xdm:value": 0.221 + }, + "xdm:dailyBudget": { + "xdm:value": 5000.0 + } } }, "xdm:attributionMetrics": { "xdm:attributionModel": "LAST_CLICK", - "xdm:attributionWindow": "7d_click_1d_view", - "xdm:assistedConversions": 23, - "xdm:lastClickConversions": 54, - "xdm:firstClickConversions": 31, - "xdm:linearConversions": 38, - "xdm:timeDecayConversions": 46, - "xdm:positionBasedConversions": 42 + "xdm:clickAttributionWindow": "7_DAY", + "xdm:viewAttributionWindow": "1_DAY" }, "xdm:qualityMetrics": { "xdm:qualityScore": 8.5, - "xdm:relevanceScore": 8.8, + "xdm:relevanceScore": { + "xdm:value": 8.8 + }, "xdm:engagementRateRanking": "above_average", "xdm:conversionRateRanking": "above_average", "xdm:qualityRanking": "above_average", diff --git a/schemas/paid-media/paid-media-summary-metrics.example.4.json b/schemas/paid-media/paid-media-summary-metrics.example.4.json index 4e2244f15..df8074572 100644 --- a/schemas/paid-media/paid-media-summary-metrics.example.4.json +++ b/schemas/paid-media/paid-media-summary-metrics.example.4.json @@ -150,102 +150,133 @@ } }, "xdm:extendedMetrics": { - "xdm:videoViews": 17000, - "xdm:videoViewsP25": 14875, - "xdm:videoViewsP50": 12750, - "xdm:videoViewsP75": 10625, - "xdm:videoViewsP95": 8500, - "xdm:videoViewsP100": 6375, - "xdm:videoAvgWatchTime": 18.5, - "xdm:videoAvgWatchPercentage": 0.607, - "xdm:engagements": 1148, - "xdm:engagementRate": 0.054, - "xdm:likes": 574, - "xdm:comments": 115, - "xdm:shares": 191, - "xdm:saves": 268, - "xdm:linkClicks": 765, - "xdm:landingPageViews": 689, - "xdm:outboundClicks": 727, - "xdm:uniqueClicks": 689, - "xdm:uniqueLinkClicks": 689, - "xdm:costPerEngagement": 0.481, - "xdm:costPerLike": 0.963, - "xdm:costPerComment": 4.804, - "xdm:costPerShare": 2.892 + "xdm:likes": { + "xdm:value": 574 + }, + "xdm:comments": { + "xdm:value": 115 + }, + "xdm:shares": { + "xdm:value": 191 + }, + "xdm:saves": { + "xdm:value": 268 + }, + "xdm:linkClicks": { + "xdm:value": 765 + }, + "xdm:outboundClicks": { + "xdm:value": 727 + }, + "xdm:uniqueClicks": { + "xdm:value": 689 + } }, "xdm:videoMetrics": { - "xdm:videoViews": 17000, - "xdm:videoViewsP25": 14875, - "xdm:videoViewsP50": 12750, - "xdm:videoViewsP75": 10625, - "xdm:videoViewsP95": 8500, - "xdm:videoViewsP100": 6375, - "xdm:videoAvgWatchTime": 18.5, - "xdm:videoAvgWatchPercentage": 0.607, - "xdm:videoCompletionRate": 0.375, - "xdm:videoViewRate": 0.8, - "xdm:costPerVideoView": 0.0325, - "xdm:costPerCompletedView": 0.0867, - "xdm:videoEngagements": 1148, - "xdm:videoEngagementRate": 0.0675, - "xdm:videoPlays": 21250, - "xdm:videoStarts": 21250, - "xdm:videoReplays": 850, - "xdm:videoPauses": 2125, - "xdm:videoResumes": 1700, - "xdm:videoSkips": 4250, - "xdm:videoMutes": 1063, - "xdm:videoUnmutes": 425, - "xdm:videoFullscreenEnters": 638, - "xdm:videoFullscreenExits": 638 + "xdm:videoPlays": { + "xdm:value": 21250 + }, + "xdm:videoCompletionRate": { + "xdm:value": 0.375 + }, + "xdm:videoReplays": { + "xdm:value": 850 + }, + "xdm:videoPauses": { + "xdm:value": 2125 + }, + "xdm:videoResumes": { + "xdm:value": 1700 + }, + "xdm:videoSkips": { + "xdm:value": 4250 + }, + "xdm:videoMutes": { + "xdm:value": 1063 + }, + "xdm:videoUnmutes": { + "xdm:value": 425 + } }, "xdm:conversionMetrics": { - "xdm:viewThroughConversions": 8, - "xdm:clickThroughConversions": 30, - "xdm:totalConversions": 38, - "xdm:conversionRate": 0.055, - "xdm:costPerConversion": 14.54, - "xdm:conversionValue": 1912.5, - "xdm:valuePerConversion": 50.33, - "xdm:purchases": 30, - "xdm:purchaseValue": 1525.0, - "xdm:addToCart": 77, - "xdm:initiateCheckout": 46, - "xdm:leads": 8, - "xdm:signups": 15, - "xdm:downloads": 23, - "xdm:costPerPurchase": 18.42, - "xdm:costPerLead": 69.06, - "xdm:costPerSignup": 36.83 + "xdm:postViewConversions": { + "xdm:value": 8 + }, + "xdm:postClickConversions": { + "xdm:value": 30 + }, + "xdm:conversionRate": { + "xdm:value": 0.055 + }, + "xdm:costPerAction": { + "xdm:value": 14.54 + }, + "xdm:actionValue": 1912.5, + "xdm:conversionsByType": { + "xdm:purchases": { + "xdm:value": 30 + }, + "xdm:addToCart": { + "xdm:value": 77 + }, + "xdm:initiateCheckout": { + "xdm:value": 46 + }, + "xdm:leads": { + "xdm:value": 8 + }, + "xdm:downloads": { + "xdm:value": 23 + } + }, + "xdm:leads": { + "xdm:value": 8 + }, + "xdm:costPerLead": { + "xdm:value": 69.06 + } }, "xdm:costMetrics": { - "xdm:totalSpend": 552.5, - "xdm:averageCPC": 0.722, - "xdm:averageCPM": 26.0, - "xdm:averageCPA": 14.54, - "xdm:averageCPE": 0.481, + "xdm:averageCpc": { + "xdm:value": 0.722 + }, + "xdm:averageCpm": { + "xdm:value": 26.0 + }, + "xdm:averageCpa": { + "xdm:value": 14.54 + }, + "xdm:averageCpe": { + "xdm:value": 0.481 + }, "xdm:budgetUtilization": { - "xdm:budgetAllocated": 5000.0, - "xdm:budgetSpent": 552.5, - "xdm:budgetRemaining": 4447.5, - "xdm:budgetUtilization": 0.111, - "xdm:dailyBudget": 5000.0 + "xdm:budgetAllocated": { + "xdm:value": 5000.0 + }, + "xdm:budgetSpent": { + "xdm:value": 552.5 + }, + "xdm:budgetRemaining": { + "xdm:value": 4447.5 + }, + "xdm:budgetUtilization": { + "xdm:value": 0.111 + }, + "xdm:dailyBudget": { + "xdm:value": 5000.0 + } } }, "xdm:attributionMetrics": { "xdm:attributionModel": "LAST_CLICK", - "xdm:attributionWindow": "7d_click_1d_view", - "xdm:assistedConversions": 11, - "xdm:lastClickConversions": 27, - "xdm:firstClickConversions": 15, - "xdm:linearConversions": 19, - "xdm:timeDecayConversions": 23, - "xdm:positionBasedConversions": 21 + "xdm:clickAttributionWindow": "7_DAY", + "xdm:viewAttributionWindow": "1_DAY" }, "xdm:qualityMetrics": { "xdm:qualityScore": 8.5, - "xdm:relevanceScore": 8.8, + "xdm:relevanceScore": { + "xdm:value": 8.8 + }, "xdm:engagementRateRanking": "above_average", "xdm:conversionRateRanking": "above_average", "xdm:qualityRanking": "above_average", diff --git a/schemas/paid-media/paid-media-summary-metrics.example.5.json b/schemas/paid-media/paid-media-summary-metrics.example.5.json index 436cba469..75f6999c3 100644 --- a/schemas/paid-media/paid-media-summary-metrics.example.5.json +++ b/schemas/paid-media/paid-media-summary-metrics.example.5.json @@ -146,102 +146,133 @@ } }, "xdm:extendedMetrics": { - "xdm:videoViews": 17000, - "xdm:videoViewsP25": 14875, - "xdm:videoViewsP50": 12750, - "xdm:videoViewsP75": 10625, - "xdm:videoViewsP95": 8500, - "xdm:videoViewsP100": 6375, - "xdm:videoAvgWatchTime": 18.5, - "xdm:videoAvgWatchPercentage": 0.607, - "xdm:engagements": 1148, - "xdm:engagementRate": 0.054, - "xdm:likes": 574, - "xdm:comments": 115, - "xdm:shares": 191, - "xdm:saves": 268, - "xdm:linkClicks": 765, - "xdm:landingPageViews": 689, - "xdm:outboundClicks": 727, - "xdm:uniqueClicks": 689, - "xdm:uniqueLinkClicks": 689, - "xdm:costPerEngagement": 0.481, - "xdm:costPerLike": 0.963, - "xdm:costPerComment": 4.804, - "xdm:costPerShare": 2.892 + "xdm:likes": { + "xdm:value": 574 + }, + "xdm:comments": { + "xdm:value": 115 + }, + "xdm:shares": { + "xdm:value": 191 + }, + "xdm:saves": { + "xdm:value": 268 + }, + "xdm:linkClicks": { + "xdm:value": 765 + }, + "xdm:outboundClicks": { + "xdm:value": 727 + }, + "xdm:uniqueClicks": { + "xdm:value": 689 + } }, "xdm:videoMetrics": { - "xdm:videoViews": 17000, - "xdm:videoViewsP25": 14875, - "xdm:videoViewsP50": 12750, - "xdm:videoViewsP75": 10625, - "xdm:videoViewsP95": 8500, - "xdm:videoViewsP100": 6375, - "xdm:videoAvgWatchTime": 18.5, - "xdm:videoAvgWatchPercentage": 0.607, - "xdm:videoCompletionRate": 0.375, - "xdm:videoViewRate": 0.8, - "xdm:costPerVideoView": 0.0325, - "xdm:costPerCompletedView": 0.0867, - "xdm:videoEngagements": 1148, - "xdm:videoEngagementRate": 0.0675, - "xdm:videoPlays": 21250, - "xdm:videoStarts": 21250, - "xdm:videoReplays": 850, - "xdm:videoPauses": 2125, - "xdm:videoResumes": 1700, - "xdm:videoSkips": 4250, - "xdm:videoMutes": 1063, - "xdm:videoUnmutes": 425, - "xdm:videoFullscreenEnters": 638, - "xdm:videoFullscreenExits": 638 + "xdm:videoPlays": { + "xdm:value": 21250 + }, + "xdm:videoCompletionRate": { + "xdm:value": 0.375 + }, + "xdm:videoReplays": { + "xdm:value": 850 + }, + "xdm:videoPauses": { + "xdm:value": 2125 + }, + "xdm:videoResumes": { + "xdm:value": 1700 + }, + "xdm:videoSkips": { + "xdm:value": 4250 + }, + "xdm:videoMutes": { + "xdm:value": 1063 + }, + "xdm:videoUnmutes": { + "xdm:value": 425 + } }, "xdm:conversionMetrics": { - "xdm:viewThroughConversions": 8, - "xdm:clickThroughConversions": 30, - "xdm:totalConversions": 38, - "xdm:conversionRate": 0.055, - "xdm:costPerConversion": 14.54, - "xdm:conversionValue": 1912.5, - "xdm:valuePerConversion": 50.33, - "xdm:purchases": 30, - "xdm:purchaseValue": 1525.0, - "xdm:addToCart": 77, - "xdm:initiateCheckout": 46, - "xdm:leads": 8, - "xdm:signups": 15, - "xdm:downloads": 23, - "xdm:costPerPurchase": 18.42, - "xdm:costPerLead": 69.06, - "xdm:costPerSignup": 36.83 + "xdm:postViewConversions": { + "xdm:value": 8 + }, + "xdm:postClickConversions": { + "xdm:value": 30 + }, + "xdm:conversionRate": { + "xdm:value": 0.055 + }, + "xdm:costPerAction": { + "xdm:value": 14.54 + }, + "xdm:actionValue": 1912.5, + "xdm:conversionsByType": { + "xdm:purchases": { + "xdm:value": 30 + }, + "xdm:addToCart": { + "xdm:value": 77 + }, + "xdm:initiateCheckout": { + "xdm:value": 46 + }, + "xdm:leads": { + "xdm:value": 8 + }, + "xdm:downloads": { + "xdm:value": 23 + } + }, + "xdm:leads": { + "xdm:value": 8 + }, + "xdm:costPerLead": { + "xdm:value": 69.06 + } }, "xdm:costMetrics": { - "xdm:totalSpend": 552.5, - "xdm:averageCPC": 0.722, - "xdm:averageCPM": 26.0, - "xdm:averageCPA": 14.54, - "xdm:averageCPE": 0.481, + "xdm:averageCpc": { + "xdm:value": 0.722 + }, + "xdm:averageCpm": { + "xdm:value": 26.0 + }, + "xdm:averageCpa": { + "xdm:value": 14.54 + }, + "xdm:averageCpe": { + "xdm:value": 0.481 + }, "xdm:budgetUtilization": { - "xdm:budgetAllocated": 0, - "xdm:budgetSpent": 552.5, - "xdm:budgetRemaining": 0, - "xdm:budgetUtilization": 0, - "xdm:dailyBudget": 0 + "xdm:budgetAllocated": { + "xdm:value": 0 + }, + "xdm:budgetSpent": { + "xdm:value": 552.5 + }, + "xdm:budgetRemaining": { + "xdm:value": 0 + }, + "xdm:budgetUtilization": { + "xdm:value": 0 + }, + "xdm:dailyBudget": { + "xdm:value": 0 + } } }, "xdm:attributionMetrics": { "xdm:attributionModel": "LAST_CLICK", - "xdm:attributionWindow": "7d_click_1d_view", - "xdm:assistedConversions": 11, - "xdm:lastClickConversions": 27, - "xdm:firstClickConversions": 15, - "xdm:linearConversions": 19, - "xdm:timeDecayConversions": 23, - "xdm:positionBasedConversions": 21 + "xdm:clickAttributionWindow": "7_DAY", + "xdm:viewAttributionWindow": "1_DAY" }, "xdm:qualityMetrics": { "xdm:qualityScore": 8.5, - "xdm:relevanceScore": 8.8, + "xdm:relevanceScore": { + "xdm:value": 8.8 + }, "xdm:engagementRateRanking": "above_average", "xdm:conversionRateRanking": "above_average", "xdm:qualityRanking": "above_average", diff --git a/schemas/paid-media/paid-media-summary-metrics.example.6.json b/schemas/paid-media/paid-media-summary-metrics.example.6.json index fb53b700c..fb85b668f 100644 --- a/schemas/paid-media/paid-media-summary-metrics.example.6.json +++ b/schemas/paid-media/paid-media-summary-metrics.example.6.json @@ -146,76 +146,107 @@ } }, "xdm:extendedMetrics": { - "xdm:videoViews": 0, - "xdm:videoViewsP25": 0, - "xdm:videoViewsP50": 0, - "xdm:videoViewsP75": 0, - "xdm:videoViewsP95": 0, - "xdm:videoViewsP100": 0, - "xdm:videoAvgWatchTime": 0, - "xdm:videoAvgWatchPercentage": 0, - "xdm:engagements": 803, - "xdm:engagementRate": 0.054, - "xdm:likes": 401, - "xdm:comments": 80, - "xdm:shares": 134, - "xdm:saves": 188, - "xdm:linkClicks": 535, - "xdm:landingPageViews": 482, - "xdm:outboundClicks": 509, - "xdm:uniqueClicks": 482, - "xdm:uniqueLinkClicks": 482, - "xdm:costPerEngagement": 0.481, - "xdm:costPerLike": 0.963, - "xdm:costPerComment": 4.828, - "xdm:costPerShare": 2.883 + "xdm:likes": { + "xdm:value": 401 + }, + "xdm:comments": { + "xdm:value": 80 + }, + "xdm:shares": { + "xdm:value": 134 + }, + "xdm:saves": { + "xdm:value": 188 + }, + "xdm:linkClicks": { + "xdm:value": 535 + }, + "xdm:outboundClicks": { + "xdm:value": 509 + }, + "xdm:uniqueClicks": { + "xdm:value": 482 + } }, "xdm:conversionMetrics": { - "xdm:viewThroughConversions": 5, - "xdm:clickThroughConversions": 22, - "xdm:totalConversions": 27, - "xdm:conversionRate": 0.056, - "xdm:costPerConversion": 14.31, - "xdm:conversionValue": 1337.5, - "xdm:valuePerConversion": 49.54, - "xdm:purchases": 22, - "xdm:purchaseValue": 1067.5, - "xdm:addToCart": 54, - "xdm:initiateCheckout": 32, - "xdm:leads": 5, - "xdm:signups": 11, - "xdm:downloads": 16, - "xdm:costPerPurchase": 17.56, - "xdm:costPerLead": 77.25, - "xdm:costPerSignup": 35.11 + "xdm:postViewConversions": { + "xdm:value": 5 + }, + "xdm:postClickConversions": { + "xdm:value": 22 + }, + "xdm:conversionRate": { + "xdm:value": 0.056 + }, + "xdm:costPerAction": { + "xdm:value": 14.31 + }, + "xdm:actionValue": 1337.5, + "xdm:conversionsByType": { + "xdm:purchases": { + "xdm:value": 22 + }, + "xdm:addToCart": { + "xdm:value": 54 + }, + "xdm:initiateCheckout": { + "xdm:value": 32 + }, + "xdm:leads": { + "xdm:value": 5 + }, + "xdm:downloads": { + "xdm:value": 16 + } + }, + "xdm:leads": { + "xdm:value": 5 + }, + "xdm:costPerLead": { + "xdm:value": 77.25 + } }, "xdm:costMetrics": { - "xdm:totalSpend": 386.25, - "xdm:averageCPC": 0.722, - "xdm:averageCPM": 26.0, - "xdm:averageCPA": 14.31, - "xdm:averageCPE": 0.481, + "xdm:averageCpc": { + "xdm:value": 0.722 + }, + "xdm:averageCpm": { + "xdm:value": 26.0 + }, + "xdm:averageCpa": { + "xdm:value": 14.31 + }, + "xdm:averageCpe": { + "xdm:value": 0.481 + }, "xdm:budgetUtilization": { - "xdm:budgetAllocated": 0, - "xdm:budgetSpent": 552.5, - "xdm:budgetRemaining": 0, - "xdm:budgetUtilization": 0, - "xdm:dailyBudget": 0 + "xdm:budgetAllocated": { + "xdm:value": 0 + }, + "xdm:budgetSpent": { + "xdm:value": 386.25 + }, + "xdm:budgetRemaining": { + "xdm:value": 0 + }, + "xdm:budgetUtilization": { + "xdm:value": 0 + }, + "xdm:dailyBudget": { + "xdm:value": 0 + } } }, "xdm:attributionMetrics": { "xdm:attributionModel": "LAST_CLICK", - "xdm:attributionWindow": "7d_click_1d_view", - "xdm:assistedConversions": 8, - "xdm:lastClickConversions": 19, - "xdm:firstClickConversions": 11, - "xdm:linearConversions": 13, - "xdm:timeDecayConversions": 16, - "xdm:positionBasedConversions": 15 + "xdm:clickAttributionWindow": "7_DAY", + "xdm:viewAttributionWindow": "1_DAY" }, "xdm:qualityMetrics": { "xdm:qualityScore": 7.8, - "xdm:relevanceScore": 8.2, + "xdm:relevanceScore": { + "xdm:value": 8.2 + }, "xdm:engagementRateRanking": "average", "xdm:conversionRateRanking": "above_average", "xdm:qualityRanking": "average", From 213bff8b507a2a9b7cea15cc9f636b64d0ee8500 Mon Sep 17 00:00:00 2001 From: Dan Bunker Date: Wed, 19 Nov 2025 15:18:19 -0800 Subject: [PATCH 16/22] Remove example fields that are not in the schema and switch number types to /xdm/data/measure refs --- .../paid-media-account-lookup.example.1.json | 439 ++++++++++++------ .../paid-media-account-lookup.example.2.json | 432 +++++++++++------ 2 files changed, 589 insertions(+), 282 deletions(-) diff --git a/schemas/paid-media/paid-media-account-lookup.example.1.json b/schemas/paid-media/paid-media-account-lookup.example.1.json index 154e76b7c..0d9307d13 100644 --- a/schemas/paid-media/paid-media-account-lookup.example.1.json +++ b/schemas/paid-media/paid-media-account-lookup.example.1.json @@ -19,173 +19,322 @@ "xdm:industry": "Technology", "xdm:country": "US", "xdm:isTestAccount": false, - "xdm:businessInfo": { - "xdm:businessID": "123456789012345", - "xdm:businessManagerID": "987654321098765", - "xdm:legalEntityName": "Acme Corporation Inc.", - "xdm:taxID": "12-3456789", - "xdm:businessAddress": { - "xdm:street1": "123 Innovation Drive", - "xdm:street2": "Suite 500", - "xdm:city": "San Francisco", - "xdm:region": "CA", - "xdm:postalCode": "94105", - "xdm:country": "US" - }, - "xdm:businessPhone": "+1-415-555-0100", - "xdm:businessEmail": "advertising@acmecorp.com", - "xdm:businessWebsite": "https://www.acmecorp.com", - "xdm:businessCategory": "Technology Company", - "xdm:businessVertical": "Software as a Service", - "xdm:employeeCount": "1001-5000", - "xdm:annualRevenue": "50000000-100000000", - "xdm:yearEstablished": 2010, - "xdm:publiclyTraded": true, - "xdm:stockSymbol": "ACME", - "xdm:parentCompany": "Acme Holdings LLC" + "xdm:parentAccountID": "987654321098765", + "xdm:permissions": ["admin", "campaign_manager", "finance_manager"], + "xdm:spendingLimits": { + "xdm:dailyLimit": 5000, + "xdm:monthlyLimit": 150000, + "xdm:totalLimit": 1000000 }, "xdm:billingInfo": { "xdm:billingType": "credit_card", - "xdm:paymentMethodID": "pm_1234567890abcdef", - "xdm:billingCurrency": "USD", - "xdm:billingAddress": { + "xdm:paymentMethod": "credit_card", + "xdm:creditLimit": 500000, + "xdm:currentBalance": 125000 + }, + "xdm:contactInfo": { + "xdm:primaryEmail": "john.doe@acmecorp.com", + "xdm:phone": "+1-415-555-0120", + "xdm:website": "https://www.acmecorp.com", + "xdm:address": { "xdm:street1": "123 Innovation Drive", - "xdm:street2": "Finance Department", + "xdm:street2": "Suite 500", "xdm:city": "San Francisco", "xdm:region": "CA", "xdm:postalCode": "94105", "xdm:country": "US" - }, - "xdm:billingEmail": "billing@acmecorp.com", - "xdm:billingContact": "Jane Smith", - "xdm:billingPhone": "+1-415-555-0150", - "xdm:invoiceDelivery": "email", - "xdm:paymentTerms": "immediate", - "xdm:creditLimit": 500000, - "xdm:currentBalance": 125000, - "xdm:availableCredit": 375000, - "xdm:lastPaymentDate": "2025-11-03T10:30:00Z", - "xdm:lastPaymentAmount": 45000, - "xdm:nextBillingDate": "2025-12-01T00:00:00Z", - "xdm:autoPayEnabled": true, - "xdm:billingThreshold": 10000, - "xdm:taxExempt": false - }, - "xdm:contactInfo": { - "xdm:primaryContact": { - "xdm:name": "John Doe", - "xdm:email": "john.doe@acmecorp.com", - "xdm:phone": "+1-415-555-0120", - "xdm:title": "Director of Digital Marketing", - "xdm:userID": "user_abc123xyz" - }, - "xdm:technicalContact": { - "xdm:name": "Sarah Johnson", - "xdm:email": "sarah.johnson@acmecorp.com", - "xdm:phone": "+1-415-555-0130", - "xdm:title": "Marketing Technology Manager", - "xdm:userID": "user_def456uvw" - }, - "xdm:billingContact": { - "xdm:name": "Jane Smith", - "xdm:email": "jane.smith@acmecorp.com", - "xdm:phone": "+1-415-555-0150", - "xdm:title": "Finance Manager", - "xdm:userID": "user_ghi789rst" - }, - "xdm:notificationEmails": [ - "marketing-alerts@acmecorp.com", - "performance-reports@acmecorp.com", - "billing-notifications@acmecorp.com" - ] - }, - "xdm:spendingLimits": { - "xdm:dailySpendLimit": 5000, - "xdm:monthlySpendLimit": 150000, - "xdm:lifetimeSpendLimit": 1000000, - "xdm:currentDailySpend": 3250, - "xdm:currentMonthlySpend": 87500, - "xdm:lifetimeSpend": 425000, - "xdm:spendLimitResetDay": 1, - "xdm:alertThreshold": 0.8, - "xdm:alertsEnabled": true, - "xdm:pauseOnLimitReached": false - }, - "xdm:accountPermissions": { - "xdm:canCreateCampaigns": true, - "xdm:canEditCampaigns": true, - "xdm:canDeleteCampaigns": true, - "xdm:canViewReports": true, - "xdm:canManageBilling": true, - "xdm:canManageUsers": true, - "xdm:canAccessAPI": true, - "xdm:canUseAdvancedFeatures": true, - "xdm:restrictedPlacements": [], - "xdm:allowedCountries": ["US", "CA", "GB", "AU", "DE", "FR"], - "xdm:blockedCategories": ["gambling", "alcohol"], - "xdm:requiresApproval": false - }, - "xdm:accountSettings": { - "xdm:timezone": "America/Los_Angeles", - "xdm:language": "en_US", - "xdm:currency": "USD", - "xdm:attributionWindow": "28d_click_1d_view", - "xdm:conversionTracking": true, - "xdm:pixelID": "pixel_123456789", - "xdm:catalogID": "catalog_987654321", - "xdm:appID": "app_456789123", - "xdm:domainVerification": true, - "xdm:verifiedDomains": ["acmecorp.com", "shop.acmecorp.com"], - "xdm:brandSafetyEnabled": true, - "xdm:adReviewEnabled": true, - "xdm:autoOptimizationEnabled": true - }, - "xdm:accountStatus": { - "xdm:status": "active", - "xdm:accountHealth": "good", - "xdm:complianceStatus": "compliant", - "xdm:verificationStatus": "verified", - "xdm:riskLevel": "low", - "xdm:restrictions": [], - "xdm:warnings": [], - "xdm:lastReviewDate": "2025-10-15T14:30:00Z", - "xdm:nextReviewDate": "2026-01-15T00:00:00Z" - }, - "xdm:partnerIntegrations": { - "xdm:crmIntegration": true, - "xdm:crmProvider": "Salesforce", - "xdm:analyticsIntegration": true, - "xdm:analyticsProvider": "Adobe Analytics", - "xdm:cdpIntegration": true, - "xdm:cdpProvider": "Adobe Real-Time CDP", - "xdm:attributionProvider": "Adobe Attribution AI", - "xdm:dataWarehouseIntegration": true, - "xdm:dataWarehouseProvider": "Snowflake" + } }, "xdm:additionalDetails": [ { - "xdm:fieldName": "meta_business_verification_status", + "xdm:fieldName": "meta_business_id", + "xdm:stringValue": "123456789012345" + }, + { + "xdm:fieldName": "meta_business_manager_id", + "xdm:stringValue": "987654321098765" + }, + { + "xdm:fieldName": "meta_legal_entity_name", + "xdm:stringValue": "Acme Corporation Inc." + }, + { + "xdm:fieldName": "meta_tax_id", + "xdm:stringValue": "12-3456789" + }, + { + "xdm:fieldName": "meta_business_email", + "xdm:stringValue": "advertising@acmecorp.com" + }, + { + "xdm:fieldName": "meta_business_category", + "xdm:stringValue": "Technology Company" + }, + { + "xdm:fieldName": "meta_business_vertical", + "xdm:stringValue": "Software as a Service" + }, + { + "xdm:fieldName": "meta_employee_count", + "xdm:stringValue": "1001-5000" + }, + { + "xdm:fieldName": "meta_annual_revenue", + "xdm:stringValue": "50000000-100000000" + }, + { + "xdm:fieldName": "meta_year_established", + "xdm:numberValue": { + "xdm:value": 2010 + } + }, + { + "xdm:fieldName": "meta_publicly_traded", + "xdm:booleanValue": true + }, + { + "xdm:fieldName": "meta_stock_symbol", + "xdm:stringValue": "ACME" + }, + { + "xdm:fieldName": "meta_parent_company", + "xdm:stringValue": "Acme Holdings LLC" + }, + { + "xdm:fieldName": "meta_payment_method_id", + "xdm:stringValue": "pm_1234567890abcdef" + }, + { + "xdm:fieldName": "meta_billing_currency", + "xdm:stringValue": "USD" + }, + { + "xdm:fieldName": "meta_billing_email", + "xdm:stringValue": "billing@acmecorp.com" + }, + { + "xdm:fieldName": "meta_billing_contact", + "xdm:stringValue": "Jane Smith" + }, + { + "xdm:fieldName": "meta_billing_phone", + "xdm:stringValue": "+1-415-555-0150" + }, + { + "xdm:fieldName": "meta_invoice_delivery", + "xdm:stringValue": "email" + }, + { + "xdm:fieldName": "meta_payment_terms", + "xdm:stringValue": "immediate" + }, + { + "xdm:fieldName": "meta_available_credit", + "xdm:numberValue": { + "xdm:value": 375000 + } + }, + { + "xdm:fieldName": "meta_last_payment_date", + "xdm:stringValue": "2025-11-03T10:30:00Z" + }, + { + "xdm:fieldName": "meta_last_payment_amount", + "xdm:numberValue": { + "xdm:value": 45000 + } + }, + { + "xdm:fieldName": "meta_next_billing_date", + "xdm:stringValue": "2025-12-01T00:00:00Z" + }, + { + "xdm:fieldName": "meta_auto_pay_enabled", + "xdm:booleanValue": true + }, + { + "xdm:fieldName": "meta_billing_threshold", + "xdm:numberValue": { + "xdm:value": 10000 + } + }, + { + "xdm:fieldName": "meta_tax_exempt", + "xdm:booleanValue": false + }, + { + "xdm:fieldName": "meta_primary_contact_name", + "xdm:stringValue": "John Doe" + }, + { + "xdm:fieldName": "meta_primary_contact_title", + "xdm:stringValue": "Director of Digital Marketing" + }, + { + "xdm:fieldName": "meta_primary_contact_user_id", + "xdm:stringValue": "user_abc123xyz" + }, + { + "xdm:fieldName": "meta_technical_contact_name", + "xdm:stringValue": "Sarah Johnson" + }, + { + "xdm:fieldName": "meta_technical_contact_email", + "xdm:stringValue": "sarah.johnson@acmecorp.com" + }, + { + "xdm:fieldName": "meta_technical_contact_phone", + "xdm:stringValue": "+1-415-555-0130" + }, + { + "xdm:fieldName": "meta_technical_contact_title", + "xdm:stringValue": "Marketing Technology Manager" + }, + { + "xdm:fieldName": "meta_current_daily_spend", + "xdm:numberValue": { + "xdm:value": 3250 + } + }, + { + "xdm:fieldName": "meta_current_monthly_spend", + "xdm:numberValue": { + "xdm:value": 87500 + } + }, + { + "xdm:fieldName": "meta_lifetime_spend", + "xdm:numberValue": { + "xdm:value": 425000 + } + }, + { + "xdm:fieldName": "meta_spend_limit_reset_day", + "xdm:numberValue": { + "xdm:value": 1 + } + }, + { + "xdm:fieldName": "meta_alert_threshold", + "xdm:numberValue": { + "xdm:value": 0.8 + } + }, + { + "xdm:fieldName": "meta_alerts_enabled", + "xdm:booleanValue": true + }, + { + "xdm:fieldName": "meta_pause_on_limit_reached", + "xdm:booleanValue": false + }, + { + "xdm:fieldName": "meta_timezone", + "xdm:stringValue": "America/Los_Angeles" + }, + { + "xdm:fieldName": "meta_language", + "xdm:stringValue": "en_US" + }, + { + "xdm:fieldName": "meta_attribution_window", + "xdm:stringValue": "28d_click_1d_view" + }, + { + "xdm:fieldName": "meta_conversion_tracking", + "xdm:booleanValue": true + }, + { + "xdm:fieldName": "meta_pixel_id", + "xdm:stringValue": "pixel_123456789" + }, + { + "xdm:fieldName": "meta_catalog_id", + "xdm:stringValue": "catalog_987654321" + }, + { + "xdm:fieldName": "meta_app_id", + "xdm:stringValue": "app_456789123" + }, + { + "xdm:fieldName": "meta_domain_verification", + "xdm:booleanValue": true + }, + { + "xdm:fieldName": "meta_verified_domains", + "xdm:stringValue": "acmecorp.com,shop.acmecorp.com" + }, + { + "xdm:fieldName": "meta_brand_safety_enabled", + "xdm:booleanValue": true + }, + { + "xdm:fieldName": "meta_ad_review_enabled", + "xdm:booleanValue": true + }, + { + "xdm:fieldName": "meta_auto_optimization_enabled", + "xdm:booleanValue": true + }, + { + "xdm:fieldName": "meta_account_health", + "xdm:stringValue": "good" + }, + { + "xdm:fieldName": "meta_compliance_status", + "xdm:stringValue": "compliant" + }, + { + "xdm:fieldName": "meta_verification_status", "xdm:stringValue": "verified" }, { - "xdm:fieldName": "meta_ad_account_id", - "xdm:stringValue": "act_123456789012345" + "xdm:fieldName": "meta_risk_level", + "xdm:stringValue": "low" + }, + { + "xdm:fieldName": "meta_last_review_date", + "xdm:stringValue": "2025-10-15T14:30:00Z" + }, + { + "xdm:fieldName": "meta_next_review_date", + "xdm:stringValue": "2026-01-15T00:00:00Z" + }, + { + "xdm:fieldName": "meta_crm_integration", + "xdm:booleanValue": true + }, + { + "xdm:fieldName": "meta_crm_provider", + "xdm:stringValue": "Salesforce" + }, + { + "xdm:fieldName": "meta_analytics_integration", + "xdm:booleanValue": true + }, + { + "xdm:fieldName": "meta_analytics_provider", + "xdm:stringValue": "Adobe Analytics" + }, + { + "xdm:fieldName": "meta_cdp_integration", + "xdm:booleanValue": true }, { - "xdm:fieldName": "meta_business_manager_name", - "xdm:stringValue": "Acme Corp Business Manager" + "xdm:fieldName": "meta_cdp_provider", + "xdm:stringValue": "Adobe Real-Time CDP" }, { - "xdm:fieldName": "meta_account_creation_date", - "xdm:stringValue": "2020-03-15T08:00:00Z" + "xdm:fieldName": "meta_attribution_provider", + "xdm:stringValue": "Adobe Attribution AI" }, { - "xdm:fieldName": "meta_two_factor_enabled", - "xdm:stringValue": "true" + "xdm:fieldName": "meta_data_warehouse_integration", + "xdm:booleanValue": true }, { - "xdm:fieldName": "meta_agency_relationship", - "xdm:stringValue": "direct" + "xdm:fieldName": "meta_data_warehouse_provider", + "xdm:stringValue": "Snowflake" } ] } diff --git a/schemas/paid-media/paid-media-account-lookup.example.2.json b/schemas/paid-media/paid-media-account-lookup.example.2.json index 8adc18f3b..4d169adaa 100644 --- a/schemas/paid-media/paid-media-account-lookup.example.2.json +++ b/schemas/paid-media/paid-media-account-lookup.example.2.json @@ -19,153 +19,311 @@ "xdm:industry": "Technology", "xdm:country": "US", "xdm:isTestAccount": false, - "xdm:businessInfo": { - "xdm:businessID": "google_business_987654321", - "xdm:businessManagerID": "mcc_111222333444", - "xdm:legalEntityName": "Acme Corporation Inc.", - "xdm:taxID": "12-3456789", - "xdm:businessAddress": { - "xdm:street1": "456 Commerce Boulevard", - "xdm:street2": "Floor 12", - "xdm:city": "New York", - "xdm:region": "NY", - "xdm:postalCode": "10001", - "xdm:country": "US" - }, - "xdm:businessPhone": "+1-212-555-0200", - "xdm:businessEmail": "google-ads@acmecorp.com", - "xdm:businessWebsite": "https://www.acmecorp.com", - "xdm:businessCategory": "Technology Company", - "xdm:businessVertical": "Software as a Service", - "xdm:employeeCount": "1001-5000", - "xdm:annualRevenue": "50000000-100000000", - "xdm:yearEstablished": 2010, - "xdm:publiclyTraded": true, - "xdm:stockSymbol": "ACME", - "xdm:parentCompany": "Acme Holdings LLC" + "xdm:parentAccountID": "mcc_111222333444", + "xdm:permissions": ["owner", "admin"], + "xdm:spendingLimits": { + "xdm:dailyLimit": 8000, + "xdm:monthlyLimit": 240000, + "xdm:totalLimit": 0 }, "xdm:billingInfo": { "xdm:billingType": "postpaid", - "xdm:paymentMethodID": "billing_profile_567890", - "xdm:billingCurrency": "USD", - "xdm:billingAddress": { + "xdm:paymentMethod": "invoice", + "xdm:creditLimit": 750000, + "xdm:currentBalance": 85000 + }, + "xdm:contactInfo": { + "xdm:primaryEmail": "emily.marketing@acmecorp.com", + "xdm:phone": "+1-212-555-0220", + "xdm:website": "https://www.acmecorp.com", + "xdm:address": { "xdm:street1": "456 Commerce Boulevard", - "xdm:street2": "Accounts Payable", + "xdm:street2": "Floor 12", "xdm:city": "New York", "xdm:region": "NY", "xdm:postalCode": "10001", "xdm:country": "US" - }, - "xdm:billingEmail": "ap@acmecorp.com", - "xdm:billingContact": "Robert Finance", - "xdm:billingPhone": "+1-212-555-0250", - "xdm:invoiceDelivery": "email", - "xdm:paymentTerms": "net_30", - "xdm:creditLimit": 750000, - "xdm:currentBalance": 85000, - "xdm:availableCredit": 665000, - "xdm:lastPaymentDate": "2025-11-01T09:00:00Z", - "xdm:lastPaymentAmount": 62000, - "xdm:nextBillingDate": "2025-12-01T00:00:00Z", - "xdm:autoPayEnabled": false, - "xdm:billingThreshold": 50000, - "xdm:taxExempt": false - }, - "xdm:contactInfo": { - "xdm:primaryContact": { - "xdm:name": "Emily Marketing", - "xdm:email": "emily.marketing@acmecorp.com", - "xdm:phone": "+1-212-555-0220", - "xdm:title": "VP of Digital Marketing", - "xdm:userID": "user_google_xyz789" - }, - "xdm:technicalContact": { - "xdm:name": "Michael Tech", - "xdm:email": "michael.tech@acmecorp.com", - "xdm:phone": "+1-212-555-0230", - "xdm:title": "Senior Marketing Analyst", - "xdm:userID": "user_google_abc456" - }, - "xdm:billingContact": { - "xdm:name": "Robert Finance", - "xdm:email": "robert.finance@acmecorp.com", - "xdm:phone": "+1-212-555-0250", - "xdm:title": "Controller", - "xdm:userID": "user_google_def123" - }, - "xdm:notificationEmails": [ - "google-ads-alerts@acmecorp.com", - "sem-reports@acmecorp.com" - ] - }, - "xdm:spendingLimits": { - "xdm:dailySpendLimit": 8000, - "xdm:monthlySpendLimit": 240000, - "xdm:lifetimeSpendLimit": 0, - "xdm:currentDailySpend": 6500, - "xdm:currentMonthlySpend": 145000, - "xdm:lifetimeSpend": 2850000, - "xdm:spendLimitResetDay": 1, - "xdm:alertThreshold": 0.9, - "xdm:alertsEnabled": true, - "xdm:pauseOnLimitReached": true - }, - "xdm:accountPermissions": { - "xdm:canCreateCampaigns": true, - "xdm:canEditCampaigns": true, - "xdm:canDeleteCampaigns": true, - "xdm:canViewReports": true, - "xdm:canManageBilling": true, - "xdm:canManageUsers": true, - "xdm:canAccessAPI": true, - "xdm:canUseAdvancedFeatures": true, - "xdm:restrictedPlacements": [], - "xdm:allowedCountries": ["US", "CA", "GB", "AU", "DE", "FR", "JP"], - "xdm:blockedCategories": [], - "xdm:requiresApproval": false - }, - "xdm:accountSettings": { - "xdm:timezone": "America/New_York", - "xdm:language": "en_US", - "xdm:currency": "USD", - "xdm:attributionWindow": "30d_click", - "xdm:conversionTracking": true, - "xdm:pixelID": "", - "xdm:catalogID": "", - "xdm:appID": "", - "xdm:domainVerification": true, - "xdm:verifiedDomains": [ - "acmecorp.com", - "shop.acmecorp.com", - "www.acmecorp.com" - ], - "xdm:brandSafetyEnabled": true, - "xdm:adReviewEnabled": true, - "xdm:autoOptimizationEnabled": true - }, - "xdm:accountStatus": { - "xdm:status": "active", - "xdm:accountHealth": "excellent", - "xdm:complianceStatus": "compliant", - "xdm:verificationStatus": "verified", - "xdm:riskLevel": "low", - "xdm:restrictions": [], - "xdm:warnings": [], - "xdm:lastReviewDate": "2025-09-20T10:00:00Z", - "xdm:nextReviewDate": "2025-12-20T00:00:00Z" - }, - "xdm:partnerIntegrations": { - "xdm:crmIntegration": true, - "xdm:crmProvider": "Salesforce", - "xdm:analyticsIntegration": true, - "xdm:analyticsProvider": "Google Analytics 4", - "xdm:cdpIntegration": true, - "xdm:cdpProvider": "Adobe Real-Time CDP", - "xdm:attributionProvider": "Google Ads Attribution", - "xdm:dataWarehouseIntegration": true, - "xdm:dataWarehouseProvider": "BigQuery" + } }, "xdm:additionalDetails": [ + { + "xdm:fieldName": "google_business_id", + "xdm:stringValue": "google_business_987654321" + }, + { + "xdm:fieldName": "google_legal_entity_name", + "xdm:stringValue": "Acme Corporation Inc." + }, + { + "xdm:fieldName": "google_tax_id", + "xdm:stringValue": "12-3456789" + }, + { + "xdm:fieldName": "google_business_phone", + "xdm:stringValue": "+1-212-555-0200" + }, + { + "xdm:fieldName": "google_business_email", + "xdm:stringValue": "google-ads@acmecorp.com" + }, + { + "xdm:fieldName": "google_business_category", + "xdm:stringValue": "Technology Company" + }, + { + "xdm:fieldName": "google_business_vertical", + "xdm:stringValue": "Software as a Service" + }, + { + "xdm:fieldName": "google_employee_count", + "xdm:stringValue": "1001-5000" + }, + { + "xdm:fieldName": "google_annual_revenue", + "xdm:stringValue": "50000000-100000000" + }, + { + "xdm:fieldName": "google_year_established", + "xdm:numberValue": { + "xdm:value": 2010 + } + }, + { + "xdm:fieldName": "google_publicly_traded", + "xdm:booleanValue": true + }, + { + "xdm:fieldName": "google_stock_symbol", + "xdm:stringValue": "ACME" + }, + { + "xdm:fieldName": "google_parent_company", + "xdm:stringValue": "Acme Holdings LLC" + }, + { + "xdm:fieldName": "google_payment_method_id", + "xdm:stringValue": "billing_profile_567890" + }, + { + "xdm:fieldName": "google_billing_currency", + "xdm:stringValue": "USD" + }, + { + "xdm:fieldName": "google_billing_email", + "xdm:stringValue": "ap@acmecorp.com" + }, + { + "xdm:fieldName": "google_billing_contact", + "xdm:stringValue": "Robert Finance" + }, + { + "xdm:fieldName": "google_billing_phone", + "xdm:stringValue": "+1-212-555-0250" + }, + { + "xdm:fieldName": "google_invoice_delivery", + "xdm:stringValue": "email" + }, + { + "xdm:fieldName": "google_payment_terms", + "xdm:stringValue": "net_30" + }, + { + "xdm:fieldName": "google_available_credit", + "xdm:numberValue": { + "xdm:value": 665000 + } + }, + { + "xdm:fieldName": "google_last_payment_date", + "xdm:stringValue": "2025-11-01T09:00:00Z" + }, + { + "xdm:fieldName": "google_last_payment_amount", + "xdm:numberValue": { + "xdm:value": 62000 + } + }, + { + "xdm:fieldName": "google_next_billing_date", + "xdm:stringValue": "2025-12-01T00:00:00Z" + }, + { + "xdm:fieldName": "google_auto_pay_enabled", + "xdm:booleanValue": false + }, + { + "xdm:fieldName": "google_billing_threshold", + "xdm:numberValue": { + "xdm:value": 50000 + } + }, + { + "xdm:fieldName": "google_tax_exempt", + "xdm:booleanValue": false + }, + { + "xdm:fieldName": "google_primary_contact_name", + "xdm:stringValue": "Emily Marketing" + }, + { + "xdm:fieldName": "google_primary_contact_title", + "xdm:stringValue": "VP of Digital Marketing" + }, + { + "xdm:fieldName": "google_primary_contact_user_id", + "xdm:stringValue": "user_google_xyz789" + }, + { + "xdm:fieldName": "google_technical_contact_name", + "xdm:stringValue": "Michael Tech" + }, + { + "xdm:fieldName": "google_technical_contact_email", + "xdm:stringValue": "michael.tech@acmecorp.com" + }, + { + "xdm:fieldName": "google_technical_contact_phone", + "xdm:stringValue": "+1-212-555-0230" + }, + { + "xdm:fieldName": "google_technical_contact_title", + "xdm:stringValue": "Senior Marketing Analyst" + }, + { + "xdm:fieldName": "google_current_daily_spend", + "xdm:numberValue": { + "xdm:value": 6500 + } + }, + { + "xdm:fieldName": "google_current_monthly_spend", + "xdm:numberValue": { + "xdm:value": 145000 + } + }, + { + "xdm:fieldName": "google_lifetime_spend", + "xdm:numberValue": { + "xdm:value": 2850000 + } + }, + { + "xdm:fieldName": "google_spend_limit_reset_day", + "xdm:numberValue": { + "xdm:value": 1 + } + }, + { + "xdm:fieldName": "google_alert_threshold", + "xdm:numberValue": { + "xdm:value": 0.9 + } + }, + { + "xdm:fieldName": "google_alerts_enabled", + "xdm:booleanValue": true + }, + { + "xdm:fieldName": "google_pause_on_limit_reached", + "xdm:booleanValue": true + }, + { + "xdm:fieldName": "google_timezone", + "xdm:stringValue": "America/New_York" + }, + { + "xdm:fieldName": "google_language", + "xdm:stringValue": "en_US" + }, + { + "xdm:fieldName": "google_attribution_window", + "xdm:stringValue": "30d_click" + }, + { + "xdm:fieldName": "google_conversion_tracking", + "xdm:booleanValue": true + }, + { + "xdm:fieldName": "google_domain_verification", + "xdm:booleanValue": true + }, + { + "xdm:fieldName": "google_verified_domains", + "xdm:stringValue": "acmecorp.com,shop.acmecorp.com,www.acmecorp.com" + }, + { + "xdm:fieldName": "google_brand_safety_enabled", + "xdm:booleanValue": true + }, + { + "xdm:fieldName": "google_ad_review_enabled", + "xdm:booleanValue": true + }, + { + "xdm:fieldName": "google_auto_optimization_enabled", + "xdm:booleanValue": true + }, + { + "xdm:fieldName": "google_account_health", + "xdm:stringValue": "excellent" + }, + { + "xdm:fieldName": "google_compliance_status", + "xdm:stringValue": "compliant" + }, + { + "xdm:fieldName": "google_verification_status", + "xdm:stringValue": "verified" + }, + { + "xdm:fieldName": "google_risk_level", + "xdm:stringValue": "low" + }, + { + "xdm:fieldName": "google_last_review_date", + "xdm:stringValue": "2025-09-20T10:00:00Z" + }, + { + "xdm:fieldName": "google_next_review_date", + "xdm:stringValue": "2025-12-20T00:00:00Z" + }, + { + "xdm:fieldName": "google_crm_integration", + "xdm:booleanValue": true + }, + { + "xdm:fieldName": "google_crm_provider", + "xdm:stringValue": "Salesforce" + }, + { + "xdm:fieldName": "google_analytics_integration", + "xdm:booleanValue": true + }, + { + "xdm:fieldName": "google_analytics_provider", + "xdm:stringValue": "Google Analytics 4" + }, + { + "xdm:fieldName": "google_cdp_integration", + "xdm:booleanValue": true + }, + { + "xdm:fieldName": "google_cdp_provider", + "xdm:stringValue": "Adobe Real-Time CDP" + }, + { + "xdm:fieldName": "google_attribution_provider", + "xdm:stringValue": "Google Ads Attribution" + }, + { + "xdm:fieldName": "google_data_warehouse_integration", + "xdm:booleanValue": true + }, + { + "xdm:fieldName": "google_data_warehouse_provider", + "xdm:stringValue": "BigQuery" + }, { "xdm:fieldName": "google_customer_id", "xdm:stringValue": "1234567890" From c2218a26d898d8ebba18c0fb11fa8f092518d6a5 Mon Sep 17 00:00:00 2001 From: Dan Bunker Date: Tue, 18 Nov 2025 13:54:20 -0800 Subject: [PATCH 17/22] Add missing fields for metrics and metadata fieldgroups --- ...-paid-media-conversion-metrics.schema.json | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/components/fieldgroups/paid-media/core-paid-media-conversion-metrics.schema.json b/components/fieldgroups/paid-media/core-paid-media-conversion-metrics.schema.json index a630a84f4..611d4ed2b 100644 --- a/components/fieldgroups/paid-media/core-paid-media-conversion-metrics.schema.json +++ b/components/fieldgroups/paid-media/core-paid-media-conversion-metrics.schema.json @@ -91,6 +91,58 @@ "description": "Number of conversions attributed to clicks within 7-day attribution window", "minimum": 0 }, + "xdm:actionValue": { + "type": "number", + "title": "Action Value", + "description": "Total value of all conversion actions", + "minimum": 0 + }, + "xdm:actionType": { + "type": "string", + "title": "Action Type", + "description": "Type of conversion action being measured (e.g., 'purchase', 'lead', 'app_install')" + }, + "xdm:actionSource": { + "type": "string", + "title": "Action Source", + "description": "Source of the conversion action (e.g., 'website', 'app', 'offline')" + }, + "xdm:oneDayClickActionValue": { + "type": "number", + "title": "1-Day Click Action Value", + "description": "Action value attributed to clicks within 1-day attribution window", + "minimum": 0 + }, + "xdm:oneDayViewActionValue": { + "type": "number", + "title": "1-Day View Action Value", + "description": "Action value attributed to views within 1-day attribution window", + "minimum": 0 + }, + "xdm:sevenDayClickActionValue": { + "type": "number", + "title": "7-Day Click Action Value", + "description": "Action value attributed to clicks within 7-day attribution window", + "minimum": 0 + }, + "xdm:oneDayClickConversions": { + "type": "number", + "title": "1-Day Click Conversions", + "description": "Number of conversions attributed to clicks within 1-day attribution window", + "minimum": 0 + }, + "xdm:oneDayViewConversions": { + "type": "number", + "title": "1-Day View Conversions", + "description": "Number of conversions attributed to views within 1-day attribution window", + "minimum": 0 + }, + "xdm:sevenDayClickConversions": { + "type": "number", + "title": "7-Day Click Conversions", + "description": "Number of conversions attributed to clicks within 7-day attribution window", + "minimum": 0 + }, "xdm:conversionsByType": { "type": "object", "title": "Conversions by Type", From 414cb884eb07bcd745f55103203774167792b006 Mon Sep 17 00:00:00 2001 From: Dan Bunker Date: Wed, 12 Nov 2025 13:39:27 -0800 Subject: [PATCH 18/22] Add global schema to tenant schema conversion and upload scripts --- convert-xdm-to-tenant.sh | 254 +++++++++++++++++++++++++++++ upload-tenant-schemas.sh | 339 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 593 insertions(+) create mode 100755 convert-xdm-to-tenant.sh create mode 100755 upload-tenant-schemas.sh diff --git a/convert-xdm-to-tenant.sh b/convert-xdm-to-tenant.sh new file mode 100755 index 000000000..dda4334ee --- /dev/null +++ b/convert-xdm-to-tenant.sh @@ -0,0 +1,254 @@ +#!/bin/bash + +# Script to convert XDM paid media schemas to tenant-specific schemas +# Usage: ./convert-xdm-to-tenant.sh [output_dir] +# +# This script: +# - Takes all *.schema.json files from paid-media directories +# - Replaces /xdm/ with /${TENANT_ID}/ in top-level $id +# - Replaces /xdm/datatypes/paid-media with /${TENANT_ID}/datatypes/paid-media in $ref +# - Replaces /xdm/mixins/paid-media with /${TENANT_ID}/mixins/paid-media in $ref +# - Outputs modified files to a new directory structure + +set -e # Exit on error + +# Color codes for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Check if TENANT_ID is provided +if [ -z "$1" ]; then + echo -e "${RED}Error: TENANT_ID is required${NC}" + echo "Usage: $0 [output_dir]" + echo "Example: $0 _mycompany123" + exit 1 +fi + +TENANT_ID="$1" +OUTPUT_DIR="${2:-tenant-schemas}" + +# Source directories +DATATYPES_DIR="components/datatypes/paid-media" +FIELDGROUPS_DIR="components/fieldgroups/paid-media" +SCHEMAS_DIR="schemas/paid-media" + +# Output directories +OUTPUT_DATATYPES_DIR="${OUTPUT_DIR}/components/datatypes/paid-media" +OUTPUT_FIELDGROUPS_DIR="${OUTPUT_DIR}/components/fieldgroups/paid-media" +OUTPUT_SCHEMAS_DIR="${OUTPUT_DIR}/schemas/paid-media" + +echo -e "${GREEN}Converting XDM schemas to tenant-specific schemas${NC}" +echo -e "Tenant ID: ${YELLOW}${TENANT_ID}${NC}" +echo -e "Output directory: ${YELLOW}${OUTPUT_DIR}${NC}" +echo "" + +# Create output directories +mkdir -p "${OUTPUT_DIR}/components/classes" +mkdir -p "${OUTPUT_DATATYPES_DIR}" +mkdir -p "${OUTPUT_FIELDGROUPS_DIR}" +mkdir -p "${OUTPUT_SCHEMAS_DIR}" + +# Create the paid-media-lookup class (needed for tenant schemas) +echo -e "${GREEN}Creating paid-media-lookup class...${NC}" +cat > "${OUTPUT_DIR}/components/classes/paid-media-lookup.schema.json" << EOF +{ + "meta:license": [ + "Copyright 2025 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "\$id": "https://ns.adobe.com/${TENANT_ID}/classes/paid-media-lookup", + "\$schema": "http://json-schema.org/draft-06/schema#", + "title": "Paid Media Lookup", + "type": "object", + "meta:extensible": true, + "meta:abstract": true, + "description": "Base class for paid media lookup records containing metadata about accounts, campaigns, ad groups, ads, creatives, and other paid media entities.", + "definitions": { + "paid-media-lookup": { + "properties": {} + } + }, + "allOf": [ + { + "\$ref": "https://ns.adobe.com/xdm/data/record" + }, + { + "\$ref": "#/definitions/paid-media-lookup" + } + ], + "meta:status": "experimental" +} +EOF +echo -e " ${GREEN}✓${NC} Created: ${OUTPUT_DIR}/components/classes/paid-media-lookup.schema.json" +echo "" + +# Function to process a schema file +process_schema_file() { + local input_file="$1" + local output_file="$2" + local file_type="$3" # datatype, fieldgroup, or schema + + echo -e " Processing: ${YELLOW}$(basename "$input_file")${NC}" + + # Use jq to process the JSON file + # 1. Replace /xdm/ with /${TENANT_ID}/ in top-level $id + # 2. Replace /xdm/datatypes/paid-media with /${TENANT_ID}/datatypes/paid-media in all $ref + # 3. Replace /xdm/mixins/paid-media with /${TENANT_ID}/mixins/paid-media in all $ref + # 4. Strip "xdm:" namespace from property keys + # 5. Remove meta:intendedToExtend from fieldgroups (not needed for tenant schemas) + + jq --arg tenant_id "$TENANT_ID" ' + # Function to recursively update all $ref values and replace xdm: with tenant: in property keys + def update_refs_and_keys: + if type == "object" then + # First handle $ref if present + (if has("$ref") then + .["$ref"] |= ( + gsub("https://ns\\.adobe\\.com/xdm/datatypes/paid-media"; "https://ns.adobe.com/\($tenant_id)/datatypes/paid-media") | + gsub("https://ns\\.adobe\\.com/xdm/mixins/paid-media"; "https://ns.adobe.com/\($tenant_id)/mixins/paid-media") + ) + else . end) | + # Then recursively process all values and rename keys + to_entries | + map( + # Replace "xdm:" prefix with tenant ID prefix for custom fields + if .key | startswith("xdm:") then + .key |= gsub("^xdm:"; "\($tenant_id):") + else . end | + # Recursively process the value + .value |= update_refs_and_keys + ) | + from_entries + elif type == "array" then + # For arrays, check if they contain strings that need replacement (like in "required" arrays) + map( + if type == "string" and startswith("xdm:") then + gsub("^xdm:"; "\($tenant_id):") + elif type == "object" or type == "array" then + update_refs_and_keys + else + . + end + ) + else + . + end; + + # Update top-level $id + if has("$id") then + .["$id"] |= gsub("https://ns\\.adobe\\.com/xdm/"; "https://ns.adobe.com/\($tenant_id)/") + else . end | + + # Update meta:intendedToExtend to support both record and time-series classes + # Replace record behavior with tenant class, and add summarymetrics class for time-series support + if has("meta:intendedToExtend") then + .["meta:intendedToExtend"] = ( + (.["meta:intendedToExtend"] | map( + gsub("https://ns\\.adobe\\.com/xdm/data/record"; "https://ns.adobe.com/\($tenant_id)/classes/paid-media-lookup") + )) + ["https://ns.adobe.com/xdm/classes/summarymetrics"] + ) + else . end | + + # Update meta:class to use the tenant-specific paid-media-lookup class instead of record behavior + if has("meta:class") then + .["meta:class"] |= gsub("https://ns\\.adobe\\.com/xdm/data/record"; "https://ns.adobe.com/\($tenant_id)/classes/paid-media-lookup") + else . end | + + # Update meta:extends array if it exists + if has("meta:extends") then + .["meta:extends"] |= map( + gsub("https://ns\\.adobe\\.com/xdm/data/record"; "https://ns.adobe.com/\($tenant_id)/classes/paid-media-lookup") | + gsub("https://ns\\.adobe\\.com/xdm/datatypes/paid-media"; "https://ns.adobe.com/\($tenant_id)/datatypes/paid-media") | + gsub("https://ns\\.adobe\\.com/xdm/mixins/paid-media"; "https://ns.adobe.com/\($tenant_id)/mixins/paid-media") + ) + else . end | + + # Update allOf array if it exists (for schemas) + if has("allOf") then + .["allOf"] |= map( + if has("$ref") then + .["$ref"] |= ( + gsub("https://ns\\.adobe\\.com/xdm/data/record"; "https://ns.adobe.com/\($tenant_id)/classes/paid-media-lookup") | + gsub("https://ns\\.adobe\\.com/xdm/datatypes/paid-media"; "https://ns.adobe.com/\($tenant_id)/datatypes/paid-media") | + gsub("https://ns\\.adobe\\.com/xdm/mixins/paid-media"; "https://ns.adobe.com/\($tenant_id)/mixins/paid-media") + ) + else . end + ) + else . end | + + # Recursively update all $ref values and strip xdm: from property keys throughout the document + update_refs_and_keys + ' "$input_file" > "$output_file" + + if [ $? -eq 0 ]; then + echo -e " ${GREEN}✓${NC} Created: $output_file" + else + echo -e " ${RED}✗${NC} Failed to process: $input_file" + return 1 + fi +} + +# Process datatypes +if [ -d "$DATATYPES_DIR" ]; then + echo -e "${GREEN}Processing datatypes...${NC}" + file_count=0 + for file in "$DATATYPES_DIR"/*.schema.json; do + if [ -f "$file" ]; then + output_file="${OUTPUT_DATATYPES_DIR}/$(basename "$file")" + process_schema_file "$file" "$output_file" "datatype" + ((file_count++)) + fi + done + echo -e " Processed ${GREEN}${file_count}${NC} datatype files" + echo "" +else + echo -e "${YELLOW}Warning: Datatypes directory not found: $DATATYPES_DIR${NC}" + echo "" +fi + +# Process fieldgroups +if [ -d "$FIELDGROUPS_DIR" ]; then + echo -e "${GREEN}Processing fieldgroups...${NC}" + file_count=0 + for file in "$FIELDGROUPS_DIR"/*.schema.json; do + if [ -f "$file" ]; then + output_file="${OUTPUT_FIELDGROUPS_DIR}/$(basename "$file")" + process_schema_file "$file" "$output_file" "fieldgroup" + ((file_count++)) + fi + done + echo -e " Processed ${GREEN}${file_count}${NC} fieldgroup files" + echo "" +else + echo -e "${YELLOW}Warning: Fieldgroups directory not found: $FIELDGROUPS_DIR${NC}" + echo "" +fi + +# Process schemas +if [ -d "$SCHEMAS_DIR" ]; then + echo -e "${GREEN}Processing schemas...${NC}" + file_count=0 + for file in "$SCHEMAS_DIR"/*.schema.json; do + if [ -f "$file" ]; then + output_file="${OUTPUT_SCHEMAS_DIR}/$(basename "$file")" + process_schema_file "$file" "$output_file" "schema" + ((file_count++)) + fi + done + echo -e " Processed ${GREEN}${file_count}${NC} schema files" + echo "" +else + echo -e "${YELLOW}Warning: Schemas directory not found: $SCHEMAS_DIR${NC}" + echo "" +fi + +echo -e "${GREEN}✓ Conversion complete!${NC}" +echo -e "Tenant-specific schemas have been written to: ${YELLOW}${OUTPUT_DIR}${NC}" +echo "" +echo -e "${YELLOW}Note:${NC} The original XDM schemas remain unchanged." +echo -e "You can now use the tenant-specific schemas from the ${YELLOW}${OUTPUT_DIR}${NC} directory." + diff --git a/upload-tenant-schemas.sh b/upload-tenant-schemas.sh new file mode 100755 index 000000000..e0f7dfca7 --- /dev/null +++ b/upload-tenant-schemas.sh @@ -0,0 +1,339 @@ +#!/bin/bash + +# Script to upload tenant-specific schemas to Adobe Schema Registry API +# Usage: cd into the tenant-schemas directory and run ./upload-tenant-schemas.sh [OPTIONS] +# +# Options: +# --skip-existing Skip schemas that already exist instead of trying to update them +# --delete-existing Delete and recreate schemas that already exist +# +# Required environment variables: +# - CLIENT_ID: Adobe API client ID (used in x-api-key header) +# - ACCESS_TOKEN: Adobe access token +# - ORG_ID: Adobe organization ID +# +# Optional environment variables: +# - SANDBOX_NAME: Sandbox name (default: prod) +# - PLATFORM_URL: Platform URL (default: https://platform-stage.adobe.io) + +set -e # Exit on error + +# Parse command line arguments +SKIP_EXISTING=false +DELETE_EXISTING=false +while [[ $# -gt 0 ]]; do + case $1 in + --skip-existing) + SKIP_EXISTING=true + shift + ;; + --delete-existing) + DELETE_EXISTING=true + shift + ;; + *) + echo "Unknown option: $1" + echo "Usage: $0 [--skip-existing|--delete-existing]" + exit 1 + ;; + esac +done + +# Validate that both flags are not set +if [ "$SKIP_EXISTING" = true ] && [ "$DELETE_EXISTING" = true ]; then + echo -e "${RED}Error: Cannot use both --skip-existing and --delete-existing${NC}" + exit 1 +fi + +# Color codes for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Check required environment variables +echo -e "${BLUE}Checking required environment variables...${NC}" +MISSING_VARS=() + +if [ -z "$CLIENT_ID" ]; then + MISSING_VARS+=("CLIENT_ID") +fi + +if [ -z "$ACCESS_TOKEN" ]; then + MISSING_VARS+=("ACCESS_TOKEN") +fi + +if [ -z "$ORG_ID" ]; then + MISSING_VARS+=("ORG_ID") +fi + +if [ ${#MISSING_VARS[@]} -gt 0 ]; then + echo -e "${RED}Error: Missing required environment variables:${NC}" + for var in "${MISSING_VARS[@]}"; do + echo -e " ${RED}✗${NC} $var" + done + echo "" + echo "Please set the following environment variables:" + echo " export CLIENT_ID=" + echo " export ACCESS_TOKEN=" + echo " export ORG_ID=" + echo "" + echo "Optional:" + echo " export SANDBOX_NAME= (default: prod)" + echo " export PLATFORM_URL= (default: https://platform-stage.adobe.io)" + exit 1 +fi + +echo -e " ${GREEN}✓${NC} CLIENT_ID is set" +echo -e " ${GREEN}✓${NC} ACCESS_TOKEN is set" +echo -e " ${GREEN}✓${NC} ORG_ID is set" +echo "" + +# Set optional variables with defaults +SANDBOX_NAME="${SANDBOX_NAME:-prod}" +PLATFORM_URL="${PLATFORM_URL:-https://platform-stage.adobe.io}" + +echo -e "${BLUE}Configuration:${NC}" +echo -e " Platform URL: ${YELLOW}${PLATFORM_URL}${NC}" +echo -e " Sandbox: ${YELLOW}${SANDBOX_NAME}${NC}" +echo "" + +# Check if we're in the right directory structure +if [ ! -d "components/datatypes/paid-media" ] && [ ! -d "components/fieldgroups/paid-media" ] && [ ! -d "schemas/paid-media" ]; then + echo -e "${RED}Error: Expected directory structure not found${NC}" + echo "Please run this script from the tenant-schemas directory that contains:" + echo " - components/datatypes/paid-media/" + echo " - components/fieldgroups/paid-media/" + echo " - schemas/paid-media/" + exit 1 +fi + +# Function to upload a schema file +upload_schema() { + local file_path="$1" + local endpoint="$2" + local file_name=$(basename "$file_path") + + echo -e " Uploading: ${YELLOW}${file_name}${NC}" + + # Extract the $id from the schema file to use for PUT if needed + local schema_id=$(jq -r '.["$id"]' "$file_path") + + # Make the initial POST API call + response=$(curl -s -w "\n%{http_code}" -X POST \ + "${PLATFORM_URL}/data/foundation/schemaregistry/tenant/${endpoint}" \ + -H 'Content-Type: application/json' \ + -H "Authorization: Bearer ${ACCESS_TOKEN}" \ + -H "x-api-key: ${CLIENT_ID}" \ + -H "x-gw-ims-org-id: ${ORG_ID}" \ + -H "x-sandbox-name: ${SANDBOX_NAME}" \ + -d @"${file_path}") + + # Extract HTTP status code (last line) + http_code=$(echo "$response" | tail -n1) + # Extract response body (everything except last line) + response_body=$(echo "$response" | sed '$d') + + # Check if the request was successful (2xx status code) + if [[ "$http_code" =~ ^2[0-9][0-9]$ ]]; then + echo -e " ${GREEN}✓${NC} Created (HTTP ${http_code})" + # Extract and display the $id if present + schema_id=$(echo "$response_body" | grep -o '"$id":"[^"]*"' | cut -d'"' -f4) + if [ -n "$schema_id" ]; then + echo -e " ${BLUE}ID:${NC} ${schema_id}" + fi + return 0 + # Check if it's a 400 error indicating the resource already exists or has merge conflicts + elif [ "$http_code" = "400" ] && echo "$response_body" | grep -q -E "(already exists|duplicate|conflict|Merge Schema Error|Cannot merge)"; then + if [ "$SKIP_EXISTING" = true ]; then + echo -e " ${YELLOW}⚠${NC} Already exists, skipping (--skip-existing flag set)" + return 0 + fi + + if [ "$DELETE_EXISTING" = true ]; then + echo -e " ${YELLOW}⚠${NC} Already exists, deleting and recreating (--delete-existing flag set)..." + + # URL-encode the schema $id for use in the DELETE endpoint + local encoded_id=$(printf '%s' "$schema_id" | jq -sRr @uri) + + # Delete the existing resource + delete_response=$(curl -s -w "\n%{http_code}" -X DELETE \ + "${PLATFORM_URL}/data/foundation/schemaregistry/tenant/${endpoint}/${encoded_id}" \ + -H "Authorization: Bearer ${ACCESS_TOKEN}" \ + -H "x-api-key: ${CLIENT_ID}" \ + -H "x-gw-ims-org-id: ${ORG_ID}" \ + -H "x-sandbox-name: ${SANDBOX_NAME}") + + delete_http_code=$(echo "$delete_response" | tail -n1) + delete_response_body=$(echo "$delete_response" | sed '$d') + + if [[ "$delete_http_code" =~ ^2[0-9][0-9]$ ]]; then + echo -e " ${GREEN}✓${NC} Deleted (HTTP ${delete_http_code})" + elif [ "$delete_http_code" = "404" ]; then + echo -e " ${YELLOW}⚠${NC} Not found for deletion (HTTP 404), will try to create anyway" + else + echo -e " ${RED}✗${NC} Delete failed (HTTP ${delete_http_code})" + echo -e "${RED}Response:${NC}" + echo "$delete_response_body" | jq '.' 2>/dev/null || echo "$delete_response_body" + return 1 + fi + + # Now try to create it (again) with POST + response=$(curl -s -w "\n%{http_code}" -X POST \ + "${PLATFORM_URL}/data/foundation/schemaregistry/tenant/${endpoint}" \ + -H 'Content-Type: application/json' \ + -H "Authorization: Bearer ${ACCESS_TOKEN}" \ + -H "x-api-key: ${CLIENT_ID}" \ + -H "x-gw-ims-org-id: ${ORG_ID}" \ + -H "x-sandbox-name: ${SANDBOX_NAME}" \ + -d @"${file_path}") + + http_code=$(echo "$response" | tail -n1) + response_body=$(echo "$response" | sed '$d') + + if [[ "$http_code" =~ ^2[0-9][0-9]$ ]]; then + echo -e " ${GREEN}✓${NC} Recreated (HTTP ${http_code})" + schema_id=$(echo "$response_body" | grep -o '"$id":"[^"]*"' | cut -d'"' -f4) + if [ -n "$schema_id" ]; then + echo -e " ${BLUE}ID:${NC} ${schema_id}" + fi + return 0 + else + echo -e " ${RED}✗${NC} Recreate failed (HTTP ${http_code})" + echo -e "${RED}Response:${NC}" + echo "$response_body" | jq '.' 2>/dev/null || echo "$response_body" + return 1 + fi + fi + + echo -e " ${YELLOW}⚠${NC} Already exists, attempting to update with PUT..." + + # URL-encode the schema $id for use in the PUT endpoint + # The $id is already extracted from the file at the beginning of the function + local encoded_id=$(printf '%s' "$schema_id" | jq -sRr @uri) + + # Try PUT to update the existing resource using the URL-encoded $id + response=$(curl -s -w "\n%{http_code}" -X PUT \ + "${PLATFORM_URL}/data/foundation/schemaregistry/tenant/${endpoint}/${encoded_id}" \ + -H 'Content-Type: application/json' \ + -H "Authorization: Bearer ${ACCESS_TOKEN}" \ + -H "x-api-key: ${CLIENT_ID}" \ + -H "x-gw-ims-org-id: ${ORG_ID}" \ + -H "x-sandbox-name: ${SANDBOX_NAME}" \ + -d @"${file_path}") + + # Extract HTTP status code (last line) + http_code=$(echo "$response" | tail -n1) + # Extract response body (everything except last line) + response_body=$(echo "$response" | sed '$d') + + # Check if PUT was successful + if [[ "$http_code" =~ ^2[0-9][0-9]$ ]]; then + echo -e " ${GREEN}✓${NC} Updated (HTTP ${http_code})" + # Extract and display the $id if present + updated_id=$(echo "$response_body" | grep -o '"$id":"[^"]*"' | cut -d'"' -f4) + if [ -n "$updated_id" ]; then + echo -e " ${BLUE}ID:${NC} ${updated_id}" + fi + return 0 + else + echo -e " ${RED}✗${NC} Update failed (HTTP ${http_code})" + echo -e "${RED}Response:${NC}" + echo "$response_body" | jq '.' 2>/dev/null || echo "$response_body" + return 1 + fi + else + echo -e " ${RED}✗${NC} Failed (HTTP ${http_code})" + echo -e "${RED}Response:${NC}" + echo "$response_body" | jq '.' 2>/dev/null || echo "$response_body" + return 1 + fi +} + +# Upload classes first (needed by fieldgroups and schemas) +if [ -d "components/classes" ]; then + echo -e "${GREEN}Uploading classes...${NC}" + class_count=0 + for file in components/classes/*.schema.json; do + if [ -f "$file" ]; then + if ! upload_schema "$file" "classes"; then + echo -e "${RED}Upload failed. Exiting.${NC}" + exit 1 + fi + ((class_count++)) + echo "" + fi + done + echo -e " Uploaded ${GREEN}${class_count}${NC} class files" + echo "" +else + echo -e "${YELLOW}Warning: Classes directory not found${NC}" + echo "" +fi + +# Upload datatypes +if [ -d "components/datatypes/paid-media" ]; then + echo -e "${GREEN}Uploading datatypes...${NC}" + file_count=0 + for file in components/datatypes/paid-media/*.schema.json; do + if [ -f "$file" ]; then + if ! upload_schema "$file" "datatypes"; then + echo -e "${RED}Upload failed. Exiting.${NC}" + exit 1 + fi + ((file_count++)) + echo "" + fi + done + echo -e " Uploaded ${GREEN}${file_count}${NC} datatype files" + echo "" +else + echo -e "${YELLOW}Warning: Datatypes directory not found${NC}" + echo "" +fi + +# Upload fieldgroups +if [ -d "components/fieldgroups/paid-media" ]; then + echo -e "${GREEN}Uploading fieldgroups...${NC}" + file_count=0 + for file in components/fieldgroups/paid-media/*.schema.json; do + if [ -f "$file" ]; then + if ! upload_schema "$file" "fieldgroups"; then + echo -e "${RED}Upload failed. Exiting.${NC}" + exit 1 + fi + ((file_count++)) + echo "" + fi + done + echo -e " Uploaded ${GREEN}${file_count}${NC} fieldgroup files" + echo "" +else + echo -e "${YELLOW}Warning: Fieldgroups directory not found${NC}" + echo "" +fi + +# Upload schemas +if [ -d "schemas/paid-media" ]; then + echo -e "${GREEN}Uploading schemas...${NC}" + file_count=0 + for file in schemas/paid-media/*.schema.json; do + if [ -f "$file" ]; then + if ! upload_schema "$file" "schemas"; then + echo -e "${RED}Upload failed. Exiting.${NC}" + exit 1 + fi + ((file_count++)) + echo "" + fi + done + echo -e " Uploaded ${GREEN}${file_count}${NC} schema files" + echo "" +else + echo -e "${YELLOW}Warning: Schemas directory not found${NC}" + echo "" +fi + +echo -e "${GREEN}✓ All schemas uploaded successfully!${NC}" + From c90b576b7f3f402341d1e336ce676110ac0e1756 Mon Sep 17 00:00:00 2001 From: Dan Bunker Date: Mon, 17 Nov 2025 10:17:44 -0800 Subject: [PATCH 19/22] Fix global to tenant conversion script to output correct namespace --- convert-xdm-to-tenant.sh | 66 ++++++++++++--- upload-tenant-schemas.sh | 179 +++++++++++++++++++++++++++------------ 2 files changed, 180 insertions(+), 65 deletions(-) diff --git a/convert-xdm-to-tenant.sh b/convert-xdm-to-tenant.sh index dda4334ee..5e2869f3e 100755 --- a/convert-xdm-to-tenant.sh +++ b/convert-xdm-to-tenant.sh @@ -101,35 +101,53 @@ process_schema_file() { # 4. Strip "xdm:" namespace from property keys # 5. Remove meta:intendedToExtend from fieldgroups (not needed for tenant schemas) - jq --arg tenant_id "$TENANT_ID" ' - # Function to recursively update all $ref values and replace xdm: with tenant: in property keys - def update_refs_and_keys: + jq --arg tenant_id "$TENANT_ID" --arg file_type "$file_type" ' + # Function to recursively update all $ref values + def update_refs: if type == "object" then - # First handle $ref if present + # Handle $ref if present (if has("$ref") then .["$ref"] |= ( gsub("https://ns\\.adobe\\.com/xdm/datatypes/paid-media"; "https://ns.adobe.com/\($tenant_id)/datatypes/paid-media") | gsub("https://ns\\.adobe\\.com/xdm/mixins/paid-media"; "https://ns.adobe.com/\($tenant_id)/mixins/paid-media") ) else . end) | - # Then recursively process all values and rename keys + # Recursively process all values to_entries | + map(.value |= update_refs) | + from_entries + elif type == "array" then map( - # Replace "xdm:" prefix with tenant ID prefix for custom fields + if type == "object" or type == "array" then + update_refs + else + . + end + ) + else + . + end; + + # Function to strip xdm: prefix from property keys (but not from values) + def strip_xdm_prefix: + if type == "object" then + to_entries | + map( + # Strip xdm: prefix from keys if .key | startswith("xdm:") then - .key |= gsub("^xdm:"; "\($tenant_id):") + .key |= gsub("^xdm:"; "") else . end | # Recursively process the value - .value |= update_refs_and_keys + .value |= strip_xdm_prefix ) | from_entries elif type == "array" then # For arrays, check if they contain strings that need replacement (like in "required" arrays) map( if type == "string" and startswith("xdm:") then - gsub("^xdm:"; "\($tenant_id):") + gsub("^xdm:"; "") elif type == "object" or type == "array" then - update_refs_and_keys + strip_xdm_prefix else . end @@ -138,6 +156,24 @@ process_schema_file() { . end; + # Function to add tenant namespace prefix to property keys + # Only for fieldgroups, not for datatypes (datatypes are reusable type definitions) + # This produces Standard XDM format (tenantId:fieldName) for API upload + # Note: Remove leading underscore from tenant_id when using as namespace prefix + def add_tenant_prefix: + if $file_type == "fieldgroup" and has("definitions") and (.definitions | type == "object") then + .definitions |= ( + to_entries | map( + .value.properties |= ( + to_entries | map( + # Remove leading underscore from tenant_id for namespace prefix + .key = "\($tenant_id | ltrimstr("_")):\(.key)" + ) | from_entries + ) + ) | from_entries + ) + else . end; + # Update top-level $id if has("$id") then .["$id"] |= gsub("https://ns\\.adobe\\.com/xdm/"; "https://ns.adobe.com/\($tenant_id)/") @@ -180,8 +216,14 @@ process_schema_file() { ) else . end | - # Recursively update all $ref values and strip xdm: from property keys throughout the document - update_refs_and_keys + # First strip xdm: prefix from all property keys + strip_xdm_prefix | + + # Then add tenant prefix to property keys (for fieldgroups only) + add_tenant_prefix | + + # Finally update all $ref values + update_refs ' "$input_file" > "$output_file" if [ $? -eq 0 ]; then diff --git a/upload-tenant-schemas.sh b/upload-tenant-schemas.sh index e0f7dfca7..6e552726f 100755 --- a/upload-tenant-schemas.sh +++ b/upload-tenant-schemas.sh @@ -151,60 +151,13 @@ upload_schema() { return 0 fi + # Note: If DELETE_EXISTING is true, resources should have been deleted in bulk before upload + # So if we still get "already exists", something went wrong with the bulk delete if [ "$DELETE_EXISTING" = true ]; then - echo -e " ${YELLOW}⚠${NC} Already exists, deleting and recreating (--delete-existing flag set)..." - - # URL-encode the schema $id for use in the DELETE endpoint - local encoded_id=$(printf '%s' "$schema_id" | jq -sRr @uri) - - # Delete the existing resource - delete_response=$(curl -s -w "\n%{http_code}" -X DELETE \ - "${PLATFORM_URL}/data/foundation/schemaregistry/tenant/${endpoint}/${encoded_id}" \ - -H "Authorization: Bearer ${ACCESS_TOKEN}" \ - -H "x-api-key: ${CLIENT_ID}" \ - -H "x-gw-ims-org-id: ${ORG_ID}" \ - -H "x-sandbox-name: ${SANDBOX_NAME}") - - delete_http_code=$(echo "$delete_response" | tail -n1) - delete_response_body=$(echo "$delete_response" | sed '$d') - - if [[ "$delete_http_code" =~ ^2[0-9][0-9]$ ]]; then - echo -e " ${GREEN}✓${NC} Deleted (HTTP ${delete_http_code})" - elif [ "$delete_http_code" = "404" ]; then - echo -e " ${YELLOW}⚠${NC} Not found for deletion (HTTP 404), will try to create anyway" - else - echo -e " ${RED}✗${NC} Delete failed (HTTP ${delete_http_code})" - echo -e "${RED}Response:${NC}" - echo "$delete_response_body" | jq '.' 2>/dev/null || echo "$delete_response_body" - return 1 - fi - - # Now try to create it (again) with POST - response=$(curl -s -w "\n%{http_code}" -X POST \ - "${PLATFORM_URL}/data/foundation/schemaregistry/tenant/${endpoint}" \ - -H 'Content-Type: application/json' \ - -H "Authorization: Bearer ${ACCESS_TOKEN}" \ - -H "x-api-key: ${CLIENT_ID}" \ - -H "x-gw-ims-org-id: ${ORG_ID}" \ - -H "x-sandbox-name: ${SANDBOX_NAME}" \ - -d @"${file_path}") - - http_code=$(echo "$response" | tail -n1) - response_body=$(echo "$response" | sed '$d') - - if [[ "$http_code" =~ ^2[0-9][0-9]$ ]]; then - echo -e " ${GREEN}✓${NC} Recreated (HTTP ${http_code})" - schema_id=$(echo "$response_body" | grep -o '"$id":"[^"]*"' | cut -d'"' -f4) - if [ -n "$schema_id" ]; then - echo -e " ${BLUE}ID:${NC} ${schema_id}" - fi - return 0 - else - echo -e " ${RED}✗${NC} Recreate failed (HTTP ${http_code})" - echo -e "${RED}Response:${NC}" - echo "$response_body" | jq '.' 2>/dev/null || echo "$response_body" - return 1 - fi + echo -e " ${RED}✗${NC} Already exists even after bulk delete attempt" + echo -e "${RED}Response:${NC}" + echo "$response_body" | jq '.' 2>/dev/null || echo "$response_body" + return 1 fi echo -e " ${YELLOW}⚠${NC} Already exists, attempting to update with PUT..." @@ -251,6 +204,126 @@ upload_schema() { fi } +# Function to delete a schema resource +delete_schema() { + local file_path="$1" + local endpoint="$2" + local file_name=$(basename "$file_path") + + echo -e " Deleting: ${YELLOW}${file_name}${NC}" + + # Extract the $id from the schema file + local schema_id=$(jq -r '.["$id"]' "$file_path") + + # URL-encode the schema $id for use in the DELETE endpoint + local encoded_id=$(printf '%s' "$schema_id" | jq -sRr @uri) + + # Delete the resource + response=$(curl -s -w "\n%{http_code}" -X DELETE \ + "${PLATFORM_URL}/data/foundation/schemaregistry/tenant/${endpoint}/${encoded_id}" \ + -H "Authorization: Bearer ${ACCESS_TOKEN}" \ + -H "x-api-key: ${CLIENT_ID}" \ + -H "x-gw-ims-org-id: ${ORG_ID}" \ + -H "x-sandbox-name: ${SANDBOX_NAME}") + + http_code=$(echo "$response" | tail -n1) + response_body=$(echo "$response" | sed '$d') + + if [[ "$http_code" =~ ^2[0-9][0-9]$ ]]; then + echo -e " ${GREEN}✓${NC} Deleted (HTTP ${http_code})" + return 0 + elif [ "$http_code" = "404" ]; then + echo -e " ${YELLOW}⚠${NC} Not found (HTTP 404), already deleted or never existed" + return 0 + else + echo -e " ${RED}✗${NC} Delete failed (HTTP ${http_code})" + echo -e "${RED}Response:${NC}" + echo "$response_body" | jq '.' 2>/dev/null || echo "$response_body" + return 1 + fi +} + +# If --delete-existing flag is set, delete all resources in reverse order first +if [ "$DELETE_EXISTING" = true ]; then + echo -e "${BLUE}Deleting existing resources in reverse order...${NC}" + echo "" + + # Delete schemas first (they depend on fieldgroups) + if [ -d "schemas/paid-media" ]; then + echo -e "${GREEN}Deleting schemas...${NC}" + file_count=0 + for file in schemas/paid-media/*.schema.json; do + if [ -f "$file" ]; then + if ! delete_schema "$file" "schemas"; then + echo -e "${RED}Delete failed. Exiting.${NC}" + exit 1 + fi + ((file_count++)) + echo "" + fi + done + echo -e " Deleted ${GREEN}${file_count}${NC} schema files" + echo "" + fi + + # Delete fieldgroups (they depend on datatypes) + if [ -d "components/fieldgroups/paid-media" ]; then + echo -e "${GREEN}Deleting fieldgroups...${NC}" + file_count=0 + for file in components/fieldgroups/paid-media/*.schema.json; do + if [ -f "$file" ]; then + if ! delete_schema "$file" "fieldgroups"; then + echo -e "${RED}Delete failed. Exiting.${NC}" + exit 1 + fi + ((file_count++)) + echo "" + fi + done + echo -e " Deleted ${GREEN}${file_count}${NC} fieldgroup files" + echo "" + fi + + # Delete datatypes (they depend on nothing, but classes might depend on them) + if [ -d "components/datatypes/paid-media" ]; then + echo -e "${GREEN}Deleting datatypes...${NC}" + file_count=0 + for file in components/datatypes/paid-media/*.schema.json; do + if [ -f "$file" ]; then + if ! delete_schema "$file" "datatypes"; then + echo -e "${RED}Delete failed. Exiting.${NC}" + exit 1 + fi + ((file_count++)) + echo "" + fi + done + echo -e " Deleted ${GREEN}${file_count}${NC} datatype files" + echo "" + fi + + # Delete classes last + if [ -d "components/classes" ]; then + echo -e "${GREEN}Deleting classes...${NC}" + class_count=0 + for file in components/classes/*.schema.json; do + if [ -f "$file" ]; then + if ! delete_schema "$file" "classes"; then + echo -e "${RED}Delete failed. Exiting.${NC}" + exit 1 + fi + ((class_count++)) + echo "" + fi + done + echo -e " Deleted ${GREEN}${class_count}${NC} class files" + echo "" + fi + + echo -e "${GREEN}✓ All resources deleted successfully!${NC}" + echo "" +fi + # Upload classes first (needed by fieldgroups and schemas) if [ -d "components/classes" ]; then echo -e "${GREEN}Uploading classes...${NC}" From 35093b01317c8af3b8ead9df04be6eaf0e3a0dd7 Mon Sep 17 00:00:00 2001 From: Ray Yang Date: Wed, 3 Dec 2025 19:48:31 -0700 Subject: [PATCH 20/22] Revert "Switch number types of datatypes to xdm/data/measure refs" This reverts commit 0463359dd1f79f3735e590d8bf5a811154daf238. --- .../paid-media/paid-media-additional-field.example.2.json | 4 +--- .../paid-media/paid-media-additional-field.schema.json | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/components/datatypes/paid-media/paid-media-additional-field.example.2.json b/components/datatypes/paid-media/paid-media-additional-field.example.2.json index 18925da0c..35b9e641e 100644 --- a/components/datatypes/paid-media/paid-media-additional-field.example.2.json +++ b/components/datatypes/paid-media/paid-media-additional-field.example.2.json @@ -1,6 +1,4 @@ { "xdm:fieldName": "custom_score", - "xdm:numberValue": { - "xdm:value": 87.5 - } + "xdm:numberValue": 87.5 } diff --git a/components/datatypes/paid-media/paid-media-additional-field.schema.json b/components/datatypes/paid-media/paid-media-additional-field.schema.json index c5432757e..dcd3ec9e0 100644 --- a/components/datatypes/paid-media/paid-media-additional-field.schema.json +++ b/components/datatypes/paid-media/paid-media-additional-field.schema.json @@ -23,7 +23,7 @@ }, "xdm:numberValue": { "title": "Number Value", - "$ref": "https://ns.adobe.com/xdm/data/measure", + "type": "number", "description": "Numeric value of the field" }, "xdm:booleanValue": { From c2716458de2138230f288a2bc3135663e367e92b Mon Sep 17 00:00:00 2001 From: Ray Yang Date: Wed, 3 Dec 2025 21:28:18 -0700 Subject: [PATCH 21/22] use paidMediaCreative in creative schema definition. --- components/datatypes/paid-media/paid-media-creative.schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/datatypes/paid-media/paid-media-creative.schema.json b/components/datatypes/paid-media/paid-media-creative.schema.json index 1b93ae35e..a9d202231 100644 --- a/components/datatypes/paid-media/paid-media-creative.schema.json +++ b/components/datatypes/paid-media/paid-media-creative.schema.json @@ -11,7 +11,7 @@ "type": "object", "description": "Data type representing creative assets and content for paid media ads", "definitions": { - "creative": { + "paidMediaCreative": { "properties": { "xdm:creativeID": { "type": "string", From cbaaae7007eb80d8d5ff94f5f23a7e5e74865480 Mon Sep 17 00:00:00 2001 From: Ray Yang Date: Wed, 3 Dec 2025 21:35:11 -0700 Subject: [PATCH 22/22] fix ref in creative schema --- components/datatypes/paid-media/paid-media-creative.schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/datatypes/paid-media/paid-media-creative.schema.json b/components/datatypes/paid-media/paid-media-creative.schema.json index a9d202231..2a989fff6 100644 --- a/components/datatypes/paid-media/paid-media-creative.schema.json +++ b/components/datatypes/paid-media/paid-media-creative.schema.json @@ -175,7 +175,7 @@ }, "allOf": [ { - "$ref": "#/definitions/creative" + "$ref": "#/definitions/paidMediaCreative" } ], "meta:status": "experimental"