From 52f51840f74bd4475a4107fd89a35207746a8b5a Mon Sep 17 00:00:00 2001 From: Rob In der Maur Date: Tue, 3 Feb 2026 14:54:18 +0100 Subject: [PATCH 01/12] First draft --- src/pages/solution/adobe-content-analytics/index.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/pages/solution/adobe-content-analytics/index.md diff --git a/src/pages/solution/adobe-content-analytics/index.md b/src/pages/solution/adobe-content-analytics/index.md new file mode 100644 index 0000000000..f0c84451ca --- /dev/null +++ b/src/pages/solution/adobe-content-analytics/index.md @@ -0,0 +1,11 @@ +--- +title: Adobe Content Analytics extension +description: Configuring the Adobe Content Analytics extension in the Data Collection UI +keywords: +- Adobe Analytics +- Product overview +--- +import Tabs from './tabs/index.md' +import InitializeSDK from '/src/pages/resources/initialize.md' + +# Adobe Content Analytics From 26f60d1e10d6396dc1b3b5779f0df2b6238edec0 Mon Sep 17 00:00:00 2001 From: Rob In der Maur Date: Fri, 20 Feb 2026 16:31:08 +0100 Subject: [PATCH 02/12] More updates for Content Analytics --- README.md | 2 +- .../assets/index/configuration.png | Bin 0 -> 320252 bytes .../solution/adobe-content-analytics/index.md | 70 ++++++++++++++++++ .../tabs/api-reference.md | 0 .../adobe-content-analytics/tabs/index.md | 61 +++++++++++++++ src/pages/solution/index.md | 1 + 6 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 src/pages/solution/adobe-content-analytics/assets/index/configuration.png create mode 100644 src/pages/solution/adobe-content-analytics/tabs/api-reference.md create mode 100644 src/pages/solution/adobe-content-analytics/tabs/index.md diff --git a/README.md b/README.md index 862aea1451..b4634f6ed9 100644 --- a/README.md +++ b/README.md @@ -94,7 +94,7 @@ Within this file you'll need to add a Variant block, followed by the API informa | --------- | ----------- | ------- | | `{PLATFORM_NAME}` | The name of the platform for the API. This **must** match the name within the previously written query. | `android` | | `{API_NAME}` | The name of the API. This **must** match the name within the previously written query. | `get-identities` | -| `{PARAGRAPH_NUMBERS}` | The number of paragraphs within the API blurb. Please note that **each new line counts as a new paragraph**. Additionally, a code block and a list count only as **one** paragraph, despite how long a code block or list can be. If you are unsure about what number to put here, make sure you run the documentation site locally and ensure it renders properly. | +| `{PARAGRAPH_NUMBERS}` | The number of paragraphs within the API blurb. Please note that **each new line counts as a new paragraph**. Additionally, a code block and a list count only as **one** paragraph, despite how long a code block or list can be. If you are unsure about what number to put here, make sure you run the documentation site locally and ensure it renders properly. | `3` | An full example of a Variant block with the API information can be seen below: diff --git a/src/pages/solution/adobe-content-analytics/assets/index/configuration.png b/src/pages/solution/adobe-content-analytics/assets/index/configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..d85fc4937ae88997115d23fa3ea481d57a24e600 GIT binary patch literal 320252 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 z

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 lCz9%dSXw1-?${ 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 literal 0 HcmV?d00001 diff --git a/src/pages/solution/adobe-content-analytics/index.md b/src/pages/solution/adobe-content-analytics/index.md index f0c84451ca..40be842cc2 100644 --- a/src/pages/solution/adobe-content-analytics/index.md +++ b/src/pages/solution/adobe-content-analytics/index.md @@ -9,3 +9,73 @@ import Tabs from './tabs/index.md' import InitializeSDK from '/src/pages/resources/initialize.md' # Adobe Content Analytics + +## Configure Content Analytics extension in the Data Collection UI + +1. In the Data Collection UI, select the **Extensions** tab. +1. On the **Catalog** tab, locate the **Adobe Content Analytics** extension, and select **Install**. +1. Configure the extension settings. For more information, see [Configure Media Analytics Extension](#configure-media-analytics-extension). +1. Select **Save**. +1. Follow the publishing process to update your SDK configuration. + + +## Configure the Content Analytics extension + +![Content Analytics Extension Configuration](./assets/index/configuration.png) + +To configue the Content Analytics extension, complete the following steps: + +### Sandbox + +Select a Sandbox to use for Content Analytics. + + +### Datastreams + +Select the datastream to use for Content Analytics for the Production (required), Staging, and Development environment. + + +### General Settings + +Enable or disable Track Experiences to track experiences in Content Analytics or not. + +Select Enable Debug Logging to enable debug logging for Content Analytics. + + +### Batching Settings + +Select **Enable Batching** to enable batching for Content Analytics. + +Enter a value in **Max Batch Size** to define the maximum batch size. + +Enter a value in **Batch Flush Interval (ms)** to define a time in miliseconds to wait before flusing batched events. + + +### Exclusions + +Specify exclusions for asset URLs, assets locations, and experience locations. + +* Enter an **Asset URL Pattern** to specify a regular expression to filter which asset URLs should be excluded when collecting data for Content Analytics. Use Test Regex to open the **Regular Expression Tester** where you can validate your regular expression. +* Enter an **Asset Location Pattern** to specify a regular expression to filter which asset locations should be excluded when collecting data for Content Analytics. Use **Test Regex** to open the **Regular Expression Tester** where you can validate your regular expression. +* Enter an **Experience Location Pattern** to specify a regular expression to filter which experience locations should be excluded when collecting data for Content Analytics. Use Test Regex to open the **Regular Expression Tester** where you can validate your regular expression. + + +## Add Content Analytics extension to your app + +### Include Content Analytics extension as an app depencency. + +Add MobileCore, Edge, EdgeIdentity, and Content Analytics as dependencies to your project. + + + +Kotlin
(Android) + + + +Groovy
(Android) + + + +CocoaPods
(iOS) + + \ No newline at end of file diff --git a/src/pages/solution/adobe-content-analytics/tabs/api-reference.md b/src/pages/solution/adobe-content-analytics/tabs/api-reference.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/pages/solution/adobe-content-analytics/tabs/index.md b/src/pages/solution/adobe-content-analytics/tabs/index.md new file mode 100644 index 0000000000..fe4ed66e40 --- /dev/null +++ b/src/pages/solution/adobe-content-analytics/tabs/index.md @@ -0,0 +1,61 @@ +--- +noIndex: true +--- + +import Alerts from '/src/pages/resources/alerts.md' + + + + +Add the required dependencies to your project by including them in the app's Gradle file. + +```kotlin +// Use the BOM to manage Adobe Mobile SDK versions +implementation(platform("com.adobe.marketing.mobile:sdk-bom:3.+")) + +// Adobe Mobile SDK dependencies (versions managed by BOM) +implementation("com.adobe.marketing.mobile:core") +implementation("com.adobe.marketing.mobile:edge") +implementation("com.adobe.marketing.mobile:edgeidentity") + +// Content Analytics (not yet in BOM - specify version explicitly) +implementation("com.adobe.marketing.mobile:contentanalytics:1.0.0") +``` + + + + + + +Add the required dependencies to your project by including them in the app's Gradle file. + +```java +// Use the BOM to manage Adobe Mobile SDK versions + +implementation platform('com.adobe.marketing.mobile:sdk-bom:3.+') + +// Adobe Mobile SDK dependencies (versions managed by BOM) +implementation 'com.adobe.marketing.mobile:core' +implementation 'com.adobe.marketing.mobile:edge' +implementation 'com.adobe.marketing.mobile:edgidentity' + +// Content Analytics (not yet in BOM - specify version explicitly) +implementation 'com.adobe.marketing.mobile:contentanalytics:1.0.0" +``` + + + + + + +Add the required dependencies to your project using CocoaPods. Add following pods in your `Podfile`: + +```swift +use_frameworks! + +target 'YourTargetApp' do + pod 'AEPCore', '~> 5.0' + pod 'AEPAnalytics', '~> 5.0' + pod 'AEPContentAnalytics', '~> 5.0' +end +``` diff --git a/src/pages/solution/index.md b/src/pages/solution/index.md index f4dfd6dfa3..ff31983d0b 100644 --- a/src/pages/solution/index.md +++ b/src/pages/solution/index.md @@ -18,3 +18,4 @@ Solution extensions are extensions that directly connect with Experience Cloud s * [Adobe Media Analytics](./adobe-media-analytics/index.md) * [Adobe Target](./adobe-target/index.md) * [Places](./places/index.md) +* [Content Analytics](./adobe-content-analytics/index.md) From 5ede716cb31cee0743b9fad4c451bf63739dbd6d Mon Sep 17 00:00:00 2001 From: Rob In der Maur Date: Sat, 21 Feb 2026 10:44:07 +0100 Subject: [PATCH 03/12] Changes --- src/pages/solution/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/solution/index.md b/src/pages/solution/index.md index ff31983d0b..040879cef4 100644 --- a/src/pages/solution/index.md +++ b/src/pages/solution/index.md @@ -12,10 +12,10 @@ Solution extensions are extensions that directly connect with Experience Cloud s ## Extensions * [Adobe Analytics](./adobe-analytics/index.md) +* [Adobe Content Analytics](./adobe-content-analytics/index.md) * [Adobe Audience Manager](./adobe-audience-manager/index.md) * [Adobe Campaign Classic](./adobe-campaign-classic/index.md) * [Adobe Campaign Standard](./adobe-campaign-standard/index.md) * [Adobe Media Analytics](./adobe-media-analytics/index.md) * [Adobe Target](./adobe-target/index.md) * [Places](./places/index.md) -* [Content Analytics](./adobe-content-analytics/index.md) From aeaffa41a94306e1ef44b692c554a808e1f75e3c Mon Sep 17 00:00:00 2001 From: Rob In der Maur Date: Mon, 2 Mar 2026 17:49:41 +0100 Subject: [PATCH 04/12] More changes for content analytics --- gatsby-config.js | 26 +- .../AEP Mobile SDK.code-workspace | 14 + .../advanced-configuration.md | 198 ++++ .../adobe-content-analytics/api-reference.md | 173 ++++ .../adobe-content-analytics/crash-recovery.md | 395 ++++++++ .../experience-tracking.md | 699 +++++++++++++ .../solution/adobe-content-analytics/index.md | 14 +- .../tabs/advanced-configuration.md | 90 ++ .../tabs/api-reference.md | 921 ++++++++++++++++++ .../tabs/crash-recovery.md | 103 ++ .../tabs/experience-tracking.md | 880 +++++++++++++++++ .../adobe-content-analytics/tabs/index.md | 4 +- 12 files changed, 3506 insertions(+), 11 deletions(-) create mode 100644 src/pages/solution/adobe-content-analytics/AEP Mobile SDK.code-workspace create mode 100644 src/pages/solution/adobe-content-analytics/advanced-configuration.md create mode 100644 src/pages/solution/adobe-content-analytics/api-reference.md create mode 100644 src/pages/solution/adobe-content-analytics/crash-recovery.md create mode 100644 src/pages/solution/adobe-content-analytics/experience-tracking.md create mode 100644 src/pages/solution/adobe-content-analytics/tabs/advanced-configuration.md create mode 100644 src/pages/solution/adobe-content-analytics/tabs/crash-recovery.md create mode 100644 src/pages/solution/adobe-content-analytics/tabs/experience-tracking.md diff --git a/gatsby-config.js b/gatsby-config.js index 4b1ea2c325..51ddc92e70 100644 --- a/gatsby-config.js +++ b/gatsby-config.js @@ -900,7 +900,31 @@ module.exports = { } ] }, - + { + title: "Adobe Content Analytics", + path: "/solution/adobe-content-analytics/", + pages: [{ + title: "Overview", + path: "/solution/adobe-content-analytics/" + }, + { + title: "API reference", + path: "/solution/adobe-content-analytics/api-reference" + }, + { + title: "Experience tracking", + path: "/solution/adobe-content-analytics/experience-tracking" + }, + { + title: "Advanced configuration", + path: "/solution/adobe-content-analytics/advanced-configuration" + }, + { + title: "Crash recovery", + path: "/solution/adobe-content-analytics/crash-recovery" + } + ] + }, { title: "Adobe Media Analytics", path: "/solution/adobe-media-analytics", diff --git a/src/pages/solution/adobe-content-analytics/AEP Mobile SDK.code-workspace b/src/pages/solution/adobe-content-analytics/AEP Mobile SDK.code-workspace new file mode 100644 index 0000000000..3b2c79a35c --- /dev/null +++ b/src/pages/solution/adobe-content-analytics/AEP Mobile SDK.code-workspace @@ -0,0 +1,14 @@ +{ + "folders": [ + { + "path": "../../../.." + }, + { + "path": "../../../../../../Development/work/aca-mobile-sdk/aca-mobile-sdk-ios-extension" + }, + { + "path": "../../../../../../Development/work/aca-mobile-sdk/aca-mobile-sdk-android-extension" + } + ], + "settings": {} +} \ No newline at end of file diff --git a/src/pages/solution/adobe-content-analytics/advanced-configuration.md b/src/pages/solution/adobe-content-analytics/advanced-configuration.md new file mode 100644 index 0000000000..a8d8b52b21 --- /dev/null +++ b/src/pages/solution/adobe-content-analytics/advanced-configuration.md @@ -0,0 +1,198 @@ +--- +title: Content Analytics Advanced Configuration +description: Learn how to configure advanced features for Content Analytics. +keywords: +- Adobe Analytics +- Product overview +--- +import Tabs from './tabs/advanced-configuration.md' +import InitializeSDK from '/src/pages/resources/initialize.md' + +# Advanced Configuration + +## Configuration Keys + +All keys are prepended with `contentanalytics.`. + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| `configId` | String | - | Datastream override | +| `trackExperiences` | Bool | `true` | Enable experience tracking | +| `batchingEnabled` | Bool | `true` | Enable batching | +| `maxBatchSize` | Int | `10` | Events before flush (1-100) | +| `batchFlushInterval` | Double | `2000` | Milliseconds between flushes | +| `excludedAssetUrlsRegexp` | String | - | Exclude assets by URL | +| `excludedAssetLocationsRegexp` | String | - | Exclude assets by location | +| `excludedExperienceLocationsRegexp` | String | - | Exclude experiences by location | + +**Set via Launch UI** or programmatically: + + + +Android + + + +iOS + + + + +## Datastream + +### Separate Datastream + +Route Content Analytics to a different datastream: + +```json +{ + "edge.configId": "main-datastream-id", + "contentanalytics.configId": "content-analytics-datastream-id" +} +``` + +If `contentanalytics.configId` is not set, uses `edge.configId`. + +--- + +## Batching + +Flush triggers: + +- Batch reaches `maxBatchSize` +- Timer reaches `batchFlushInterval` (ms) +- App backgrounds + +```json +{ + "contentanalytics.batchingEnabled": true, + "contentanalytics.maxBatchSize": 10, + "contentanalytics.batchFlushInterval": 2000 +} +``` + +Disable for immediate sends: + +```json +{ "contentanalytics.batchingEnabled": false } +``` + + + +Batching only affects network delivery. Features like asset attribution, experience tracking, and featurization work the same whether batching is enabled or disabled. + + +## Filtering + +### By URL + +```json +{ "contentanalytics.excludedAssetUrlsRegexp": ".*\\.gif$|.*spinner.*" } +``` + +### By Location + +```json +{ "contentanalytics.excludedAssetLocationsRegexp": "^(debug|test).*" } +{ "contentanalytics.excludedExperienceLocationsRegexp": "^admin\\..*" } +``` + +--- + +## Privacy + +### Edge Consent + + + +Android + + + +iOS + + + +| Value | Result | +|-------|--------| +| `"y"` | Events sent | +| `"n"` | Events dropped | +| `"p"` | Events queued | + +### Legacy + + + +Android + + + +iOS + + + +### Data Deletion + + + +Android + + + +iOS + + + +--- + +## Featurization + +Configured automatically. Sends experience content to ML service for feature extraction. + +Payload sent: + +```json +{ + "experienceId": "mobile-abc123", + "orgID": "YOUR_ORG@AdobeOrg", + "content": { + "images": [{"value": "https://...jpg", "style": {}}], + "texts": [{"value": "Title", "style": {"role": "headline"}}], + "ctas": [{"value": "Buy", "style": {"enabled": true}}] + } +} +``` + +--- + +## Tuning Batch Settings + +The default settings (`maxBatchSize: 10`, `batchFlushInterval: 2000` ms) work well for most apps. Adjust based on your event volume: + +| Events per Minute | maxBatchSize | batchFlushInterval (ms) | Notes | +|-------------------|--------------|-------------------------|-------| +| < 10 | 10 (default) | 2000 (default) | Default works well | +| 10-50 | 15-25 | 3000 | Reduces network calls | +| > 50 | 25-50 | 5000 | High-volume optimization | + +**Trade-off:** Larger batches reduce network overhead but increase latency before data appears in reporting. + +--- + +## Debugging + + + +Android + + + +iOS + + + +Log tags: + +- `[ContentAnalytics]` - main +- `[ContentAnalytics.Batch]` - batching +- `[ContentAnalytics.Featurization]` - ML service diff --git a/src/pages/solution/adobe-content-analytics/api-reference.md b/src/pages/solution/adobe-content-analytics/api-reference.md new file mode 100644 index 0000000000..acf066bb16 --- /dev/null +++ b/src/pages/solution/adobe-content-analytics/api-reference.md @@ -0,0 +1,173 @@ +--- +title: Adobe Campaign Standard API reference +description: An API reference for the Adobe Campaign Standard mobile extension. +keywords: +- Adobe Campaign Standard +- API reference +--- + +import Alerts from '/src/pages/resources/alerts.md' +import Tabs from './tabs/api-reference.md' + +# Adobe Content Analytics API reference + +## registerExperience + +Registers an experience and returns an ID to track the experience. + + + +Android + + + +iOS + + + + +## trackAsset + +Track an assets with an explicit defined interaction type. + + + +Android + + + +iOS + + + + +## trackAssetClick + +Convenience method for tracking asset clicks. + + + +Android + + + +iOS + + + + +## trackAssetCollection + +Tracks multiple assets with the same interaction type. + + + +Android + + + +iOS + + + + +## trackAssetView + +Convenience method for tracking asset views. + + + +Android + + + +iOS + + + + + +## trackExperienceClick + +Track when an experience is clicked. + + + +You must call [`registerExperience()`](#registerexperience) before you can track experience clicks. See the Experience Tracking Guide for detailed usage patterns. + + + +Android + + + +iOS + + + + +## trackExperienceView + +Track when an experience is viewed. + + + +You must call [`registerExperience()`](#registerexperience) before you can track experience views. See the Experience Tracking Guide for detailed usage patterns. + + + +Android + + + +iOS + + + +## Data types + +### contentItem + +Represents the content within an experience (assets, texts, CTAs). + + + +Android + + + +iOS + + + + +### interactionType + +Defines the type of interaction, either a view or a click. + + + +Android + + + +iOS + + + + +## Configuration + +The following config settings are available. These settings can also be managed within the [Adobe Content Analytics extension](index.md#configure-the-content-analytics-extension). + +| Setting | Type | Default | Description | +|---|---|---|---| +| `configId` | String | N/A | [Custom datastream for Content Analytics events](index.md#datastreams) (overrides edge.configId) | +| `batchingEnabled` | Boolean | true | [Enable batching](index.md#batching-settings) | +| `maxBatchSize` | Integer | 10 | [Maximum events per batch](index.md#batching-settings). | +| `flushInterval` | Integer | 2000 | [Flush interval (in milliseconds)](index.md#batching-settings) | +| `trackExperiences` | Boolean | true | [Enable experience tracking](index.md#general-settings). | +| `excludedAssetLocationsRegexp` | String | - | [Asset location regex pattern](index.md#exclusions). | +| `excludedAssetUrlsRegexp` | String | - | [Asset URL regex pattern](index.md#exclusions). | +| `excludedExperienceLocationsRegexp` | String | - | [Experience location regex pattern](index.md#exclusions). | +| `debugLogging` | Boolean | false | [Verbose logging](index.md#general-settings). | diff --git a/src/pages/solution/adobe-content-analytics/crash-recovery.md b/src/pages/solution/adobe-content-analytics/crash-recovery.md new file mode 100644 index 0000000000..cfc0d5f151 --- /dev/null +++ b/src/pages/solution/adobe-content-analytics/crash-recovery.md @@ -0,0 +1,395 @@ +--- +title: Content Analytics Crash Recovery Architecture +description: Learn how to use experience tracking in Content Analytics. +keywords: +- Adobe Analytics +- Product overview +--- + +import Tabs from './tabs/crash-recovery.md' +import InitializeSDK from '/src/pages/resources/initialize.md' + +# Crash recovery architecture + +## Overview + +Content Analytics uses `PersistentHitQueue` to protect against data loss during the batching window (0-5 seconds). Events are written to disk immediately when tracked. On next app launch, any persisted events are recovered from disk into memory for processing, then cleared from disk (no data loss - events are safely in memory before disk cleanup). + +## How It Works + +```00% hone +User tracks event + └─> Event added to memory + disk (crash-safe) + │ + └─> Batching (0-5 seconds) + │ + └─> Flush triggered + │ + ├─> Process accumulated events + ├─> Calculate aggregated metrics + └─> Dispatch to Edge Network (Edge guarantees delivery) +``` + +## Architecture Components + +### BatchCoordinator + +**Responsibilities:** + +- Manages batching logic (count threshold + time-based flush) +- Writes incoming events to disk immediately via `PersistentHitQueue` +- Maintains in-memory event counters +- Triggers flush when threshold reached (10 events or 5 seconds) +- Coordinates between `DirectHitProcessor` and `ContentAnalyticsOrchestrator` + +**Key Methods:** + + + +Android + + + +iOS + + + +### DirectHitProcessor + +**Responsibilities:** + +- Implements `HitProcessing` protocol for `PersistentHitQueue` integration +- Accumulates events in memory for fast batching +- On recovery: loads events from disk into memory, then clears disk (no data loss) + +**Event Lifecycle:** + + + +Android + + + +iOS + + + +### PersistentHitQueue (AEPServices) + +**Provides:** + +- Two separate queues: `asset.events` and `experience.events` +- SQLite-backed persistence (survives crashes, force-quit, background termination) +- Automatic processing via `beginProcessing()` +- Thread-safe operations + +**Storage:** + +- Events encoded as JSON via `Event: Codable` +- Each event wrapped with type metadata (`asset` or `experience`) +- Unique identifier: `event.id.uuidString` + +## Detailed Timeline Example + +``` +Time │ Event │ Memory │ Disk │ Safe? +───────┼──────────────────────────────────────┼────────┼──────┼─────── +00.00s │ User views Asset A │ ✓ │ ✓ │ ✅ YES +00.01s │ Event written to disk │ ✓ │ ✓ │ ✅ YES +00.50s │ User clicks Asset B │ ✓ │ ✓ │ ✅ YES +01.00s │ User clicks Asset B │ ✓ │ ✓ │ ✅ YES + │ [Batching window - events on disk] │ │ │ +02.00s │ Timer fires → Flush triggered │ ✓ │ ✓ │ ✅ YES +02.01s │ Process accumulated events │ ✓ │ ✓ │ ✅ YES +02.02s │ Calculate metrics (1 view, 2 clicks) │ ✓ │ ✓ │ ✅ YES +02.03s │ Dispatch to Edge Network │ ✗ │ ✗ │ ✅ YES* + │ (*Edge guarantees delivery) │ │ │ + +Legend: +✓ = Present +✗ = Not present +``` + +Events stay on disk during the entire batching window. Once we hand off to Edge, their persistence takes over. + +## Crash Scenarios + +### Scenario 1: Crash During Batching (0-5s window) + +``` +Status: Events in memory + disk +Crash: ⚡ App terminated + └─> Memory lost ✗ + └─> Disk persists ✓ + +Recovery on Next Launch: +1. PersistentHitQueue.beginProcessing() starts +2. DirectHitProcessor.processHit() called for each persisted event +3. Events accumulated in memory, cleared from disk +4. Normal batch processing resumes + +Result: ✅ ZERO DATA LOSS +``` + +### Scenario 2: Crash During Flush + +``` +Status: Events being processed +Crash: ⚡ App terminated mid-dispatch + └─> Memory lost ✗ + └─> Events may still be on disk if not yet processed + +Recovery on Next Launch: +1. Any remaining events on disk are recovered +2. Re-accumulated and dispatched on next flush + +Result: ✅ ZERO DATA LOSS (possible duplicate if crash after Edge dispatch) +``` + +### Scenario 3: Crash After Edge Dispatch + +``` +Status: Events dispatched to Edge +Crash: ⚡ App terminated + └─> Disk already cleared during processHit() + └─> Edge has the events + +Result: ✅ ZERO DATA LOSS - Edge guarantees delivery +``` + +## Edge Network Handoff + +Once we dispatch to Edge extension: + +``` +ContentAnalytics → runtime.dispatch(event) → Event Hub → Edge Extension + └─> Edge.PersistentHitQueue + └─> Network retries + └─> Exponential backoff +``` + +**Handoff Point:** After `eventDispatcher.dispatch()` completes, Edge extension owns persistence. + +**Edge Guarantees:** Once Edge receives the event, it handles persistence, retries, and delivery confirmation. + +## Metrics Calculation + +Metrics are **derived from events**, not stored separately: + + + +Android + + + +iOS + + + +This avoids state sync issues - we just count events on flush. If the app crashes, the restored events give us the same metrics. + +## Configuration + +```json +{ + "contentanalytics.batchingEnabled": true, + "contentanalytics.maxBatchSize": 10, + "contentanalytics.batchFlushInterval": 2000 +} +``` + +**Parameters:** + +- `maxBatchSize`: Event count threshold (default: 10) +- `batchFlushInterval`: Timer interval for periodic flush in milliseconds (default: 2000 ms = 2s). Max wait time is derived from this (2.5× = 5000 ms). +- `batchingEnabled`: Set to `false` for immediate dispatch (no batching) + +## Performance Characteristics + +| Operation | Time | Notes | +|-----------|------|-------| +| Event persistence | ~1-2ms | SQLite write | +| Event recovery | ~5-10ms | SQLite read on launch | +| Batch flush | ~10-20ms | Metrics calculation + Edge dispatch | +| Memory per event | ~2KB | Event object + metadata | +| Disk per event | ~1-2KB | JSON encoding | + +**Memory Usage:** With default batch size (10), worst-case memory is ~20-40KB (negligible). + +**Network Efficiency:** Batching reduces Edge Network calls by 10x for high-volume tracking. + +## Thread Safety + +All operations use Kotlin coroutines with `Mutex` for thread-safe access: + + + +Android + + + + +## Testing Crash Recovery + +### Test 1: Crash During Batching + +1. Track 5 asset events +2. DO NOT wait for flush timer +3. Force-quit app (⌘+Q or kill process) +4. Relaunch app +5. Track 5 more asset events +6. Wait 2 seconds for flush +7. Verify: 1 Edge event with 10 aggregated interactions + + +### Test 2: Crash During Flush + + +1. Track 10 asset events (triggers immediate flush) +2. Set breakpoint in `sendToEdge()` +3. Force-quit app at breakpoint +4. Relaunch app +5. Wait 5 seconds +6. Verify: Events re-dispatched (possible duplicate) + +### Test 3: Background Termination + +1. Track events +2. Background app +3. OS terminates app (memory pressure) +4. Relaunch app +5. Verify: Events recovered and dispatched + +## Implementation Details + +### Key Files + +- `BatchCoordinator.swift` - Batching logic and persistence coordination +- `DirectHitProcessor.swift` - Crash recovery and event accumulation +- `ContentAnalyticsOrchestrator.swift` - Metrics calculation and Edge dispatch +- `PersistentHitQueue` (AEPServices) - SQLite-backed queue + +### Thread Safety + +- All operations use serial dispatch queues +- `batchQueue` (BatchCoordinator) - batch operations +- `queue` (DirectHitProcessor) - hit processing + +### Data Flow + +``` +Event tracked + └─> BatchCoordinator.addAssetEvent() + ├─> DirectHitProcessor.accumulateEvent() [memory] + ├─> PersistentHitQueue.queue() [disk] + └─> checkAndFlushIfNeeded() + └─> performFlush() + └─> DirectHitProcessor.processAccumulatedEvents() + └─> Orchestrator.processAssetEvents() + └─> EventDispatcher.dispatch() [→ Edge] +``` + +### Callback Chain Architecture + +The SDK uses a callback chain to decouple components while maintaining type safety: + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ INITIALIZATION PHASE │ +├─────────────────────────────────────────────────────────────────────────────┤ +│ │ +│ ContentAnalyticsFactory.createOrchestrator() │ +│ │ │ +│ ├─> Creates BatchCoordinator(assetQueue, experienceQueue, state) │ +│ │ └─> DirectHitProcessor initialized with no-op callbacks │ +│ │ │ +│ ├─> Creates ContentAnalyticsOrchestrator(batchCoordinator, ...) │ +│ │ │ +│ └─> Wires callbacks: batchCoordinator.setCallbacks( │ +│ assetCallback: orchestrator.processAssetEvents, │ +│ experienceCallback: orchestrator.processExperienceEvents │ +│ ) │ +│ │ +└─────────────────────────────────────────────────────────────────────────────┘ + +┌─────────────────────────────────────────────────────────────────────────────┐ +│ RUNTIME DATA FLOW │ +├─────────────────────────────────────────────────────────────────────────────┤ +│ │ +│ User calls ContentAnalytics.trackAssetInteraction() │ +│ │ │ +│ v │ +│ ┌──────────────────┐ │ +│ │ BatchCoordinator │ │ +│ │ addAssetEvent() │──────────────────────────────────────────┐ │ +│ └────────┬─────────┘ │ │ +│ │ │ │ +│ v v │ +│ ┌────────────────────┐ ┌─────────────────────┐ │ +│ │ DirectHitProcessor │ │ PersistentHitQueue │ │ +│ │ accumulateEvent() │ │ queue() [disk] │ │ +│ │ [memory buffer] │ └─────────────────────┘ │ +│ └────────┬───────────┘ │ +│ │ │ +│ │ (on flush trigger: count >= 10 or timer >= 2s) │ +│ v │ +│ ┌────────────────────────────┐ │ +│ │ DirectHitProcessor │ │ +│ │ processAccumulatedEvents() │ │ +│ └────────┬───────────────────┘ │ +│ │ │ +│ │ invokes processingCallback([events]) │ +│ v │ +│ ┌─────────────────────────────────┐ │ +│ │ ContentAnalyticsOrchestrator │ │ +│ │ processAssetEvents([events]) │ │ +│ │ ├─> Group by asset key │ │ +│ │ ├─> Calculate metrics │ │ +│ │ └─> Build XDM payload │ │ +│ └────────┬────────────────────────┘ │ +│ │ │ +│ v │ +│ ┌───────────────────┐ │ +│ │ EdgeEventDispatcher│ │ +│ │ dispatch() │──────────────> Edge Network │ +│ └───────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────────┘ +``` + +Callbacks avoid circular dependencies - BatchCoordinator doesn't need to import Orchestrator. Also makes testing easier since we can inject mocks. + +### Logging + +Enable verbose logging to debug crash recovery: + +```swift +Log.setLogLevel(.trace) +``` + +Look for: + +``` +[BATCH_PROCESSOR] Accumulated ASSET event | ID: +[BATCH_PROCESSOR] Recovered event from disk | Type: asset | ID: +[BATCH_PROCESSOR] Processing 5 asset events +``` + +## Comparison with Edge Extension + +| Feature | Content Analytics | Edge Extension | +|---------|------------------|----------------| +| Pre-dispatch persistence | ✅ YES (0-5s) | ❌ NO | +| Batching | ✅ YES | ❌ NO | +| Post-dispatch persistence | ✅ Edge's queue | ✅ PersistentHitQueue | +| Network retries | ✅ Edge handles | ✅ Exponential backoff | +| Crash recovery during batch | ✅ FULL | N/A | + +Content Analytics batches events for 0-5 seconds before dispatch. Without disk persistence during that window, crashes would lose data. Edge dispatches immediately so it doesn't need this. + +## Known Limitations + +1. **No dispatch confirmation:** Extensions cannot receive callbacks from Edge to confirm receipt +2. **Possible duplicates:** Crash during Edge dispatch may cause duplicate events (Edge deduplication handles this) +3. **Memory overhead:** Events held in memory + disk during batching (minimal: ~40KB) + diff --git a/src/pages/solution/adobe-content-analytics/experience-tracking.md b/src/pages/solution/adobe-content-analytics/experience-tracking.md new file mode 100644 index 0000000000..342ce1acfc --- /dev/null +++ b/src/pages/solution/adobe-content-analytics/experience-tracking.md @@ -0,0 +1,699 @@ +--- +title: Experience Tracking Usage Guide +description: Learn how to use experience tracking in Content Analytics. +keywords: +- Adobe Analytics +- Product overview +--- +import Tabs from './tabs/experience-tracking.md' +import InitializeSDK from '/src/pages/resources/initialize.md' + + +# Experience tracking + +Experience tracking measures how users interact with complete experiences (combinations of images, text, and CTAs) in your app. + +## Quick start + +You first register the experience. Then you can track the view of the experience, when the experience becomes visible. Or you can track the click on the experience, when the experience gets tapped. + + + +Android + + + +iOS + + + + +## Registration required + +You must register an experience definition before tracking views or clicks. If you don't: + +* Asset attribution won't work. +* Featurization hits won't be sent. +* A warning will be logged. + +### Basic usage + +Basis usage of experience tracking is that you first register the experience, and then track the experience view or click. + +### Register the experience + +Register the experience once with all of its content. + + + +Android + + + +iOS + + + + +### Track interactions + +Then trackthe experience. + + + +Android + + + +iOS + + + + +## Session lifecycle + +Experience definitions are cached in memory for the duration of the app session. After app restart or crash, you'll need to re-register experiences before tracking. + + + +Android + + + +iOS + + + +Re-registration is idempotent. Calling `registerExperience()` with the same content returns the same ID with no negative side effects. The featurization service is also idempotent, so even if the same experience definition is sent multiple times (for example, after cache eviction or app restart), there's no duplication or data inconsistency on the backend. + +### Cache Behavior + +The SDK uses an LRU (Least Recently Used) cache with a capacity of 100 experience definitions: + +* Capacity: 100 definitions maximum. +* Eviction: When full, least recently used definitions are removed. +* Memory-only: Not persisted to disk. + +The benefits are: + +* Fast lookups for asset attribution. +* Bounded memory usage (~20-40KB worst case). +* Automatic cleanup of stale definitions. +* No disk I/O overhead. +* Safe re-registration: Featurization service handles duplicates gracefully. + +For most apps, 100 definitions is sufficient. If you're registering more unique experiences per session, consider reusing experience IDs where content is identical (same content = same ID). + + +## Implementation patterns + +Some below examples of implementation patterns. + +### Single screen + +Implementation of experience tracking for a single screen. + + + +Android + + + +iOS + + + +### Collection / Feed + +Implementation of experience tracking for collection or feed. + + + +Android + + + +iOS + + + + +### Experience ID generation + +Experience IDs are deterministic - the same content always produces the same ID. The algorithm: + +1. Sort text values alphabetically. +1. Sort asset URLs alphabetically. +1. Sort CTA values alphabetically. +1. Join all with | separator (texts, then assets, then CTAs). +1. SHA-1 hash the combined string. +1. Take first 12 hex characters. +1. Prefix with `mobile-`. + +#### Example + +Imagine the following details: + +```text +// Content: texts=["$99", "Product"], assets=["img.jpg"], ctas=["Buy"] +// Sorted & joined: "Product|$99|img.jpg|Buy" +// SHA-1 → first 12 chars → "mobile-a1b2c3d4e5f6" +``` + +This means you can: + +* Pre-compute IDs server-side for consistent cross-platform IDs. +* Cache by content hash instead of arbitrary keys. +* Detect content changes by comparing IDs. + + + +Android + + + +iOS + + + + +## Missing registration warning + +If you track without registering, you will see this warning. + + + + +Experience definition not found for 'exp-123'. Call `registerExperience()` before tracking views/clicks. + +This means: + +* View/click events still go to Analytics. +* But asset attribution won't work. +* Featurization service won't get the data. + +Fix the warning by registering the experience first. + + + +Android + + + +iOS + + + + +## Asset attribution + +When you register an experience with assets, the SDK links those asset URLs to the experience. This enables asset attribution: connecting standalone asset tracking events to their parent experience. + + + +Asset attribution works regardless of the `batchingEnabled` setting. The SDK caches experience definitions locally, so attribution is based on the registration cache - not on how events are batched for network delivery. + +### How it works + +See below how asset attribution works. + + + +Android + + + +iOS + + + +When the analytics backend receives `trackAssetView` for `hero.jpg`, it can attribute that view to the "Summer Sale" experience because the asset URL was registered. + +### Without attribution + +If you track an asset without registering the experience first, like below. + + + +Android + + + +iOS + + + +The asset view is still recorded, but it's not linked to any experience. You lose: + +* Which experience contained this asset. +* Performance metrics per experience. +* A/B test attribution. + +## Location strategy + +The `experienceLocation` and `assetLocation` parameters control how metrics are grouped in Customer Journey Analytics. + +### With location - Metrics per placement + +Track same experience at different locations. + + + +Android + + + +iOS + + + +Customer Journey Analytics report will look like: + +| Experience | Location | Views | Clicks | CTR | +|---|---|--:|--:|--:| +| Summer Sale | `homepage.hero` | 10,000 | 500 | 5% | +| Summer Sale | `product.sidebar` | 3,000 | 90 | 3% | +| Summer Sale | `checkout.upsell` | 1,000 | 150 | 15% | + +This lets you answer: *"Where does this experience perform best?"* + +### Without location - global metrics + +Track without location to get aggregate metrics. + + + +Android + + + +iOS + + + +Customer Journey Analytics report will look like: + +| Experience | Views | Clicks | CTR | +|---|---|--:|--:| +| Summer Sale | 14,000 | 740 | 5.3% | + +### Same asset - different locations + +Track the same asset on different locations. + + + +Android + + + +iOS + + + +Customer Journey Analytics report will look like: + +| Experience | Location | Views | Clicks | +|---|---|--:|--:| +| Summer Sale | `homepage` | 50,000 | 2,500 | +| Summer Sale | `category.electronics` | 8,000 | 320 | +| Summer Sale | `search.results` | 3,000 | 45 | + +## Location naming convention + +Use a consistent hierarchy for easier filtering in Customer Journey Analytics + +```text +screen.section.subsection +``` + +Examples are: + +* `homepage.hero` +* `homepage.featured` +* `product.detail.recommendations` +* `cart.upsell` +* `search.results.sponsored` + +When to use a location: + + +| Goal | Location | +|---|---| +| Compare same content across placements | ✅ Set location | +| A/B test content in a specific spot | ✅ Set location| +| Track overall content performance | ❌ Omit location | +| Simple asset tracking (no placement analysis) | ❌ Omit location | + + +## Machine learning powered analytics + +When you register experiences, the featurization service analyzes the content and extracts ML attributes like persuasion strategy, emotional tone, content category, etc. These attributes are then available in Customer Journey Analytics for advanced analysis. + +### Performance by persuasion strategy + +After featurization, Customer Journey Analytics can show which persuasion strategies work best in each location. + +Customer Journey Analytics report - persuasion strategy by location: + +| Location | Persuasion strategy | Views | Click | CTR | +|---|---|--:|--:|--:| +| `homepage.hero` | Urgency | 10,000 | 800 | 8% | +| `homepage.hero` | Social Proof | 10,000 | 650 | 6.5% | +| `homepage.hero` | Scarcity | 10,000 | 720 | 7.2% | +| `checkout.upsell` | Urgency | 2,000 | 300 | 15% | +| `checkout.upsell` | Social Proof | 2,000 | 180 | 9% | + +Insight: **Urgency** messaging performs best at checkout (+15% CTR), while **Social Proof** works better on homepage. + +### Performance by content category + +Customer Journey Analytics report - asset category performance: + +| Asset Category | Location | Views | Engagement | +|---|---|--:|--:| +| Lifestyle | `homepage` | 50,000 | 12% | +| Product-focused | `homepage` | 50,000 | 8% | +| Lifestyle | `product.detail` | 20,000 | 6% | +| Product-focused | `product.detail` | 20,000 | 14% | + +Insight: **Lifestyle** imagery works on homepage, but **Product-focused** images convert better on detail pages. + +### How it works + +1. You track: `registerExperience()` sends content to the featurization service. +1. ML analyzes: service extracts persuasion strategy, tone, category, and more. +1. Attributes stored: machine learning attributes are linked to the experience/asset. +1. Customer Journey Analytics queries: Reports can segment by any machine learning attribute and location. + + + +Android + + + +iOS + + + +In Customer Journey Analytics, you can then filter or group by persuasion strategy to see what messaging resonates in each location. + + +## Custom metrics with `additionalData` + +The `additionalData` parameter lets you attach custom metrics to tracking events. These appear in Customer Journey Analytics as additional dimensions or metrics. + +### Asset performance metrics + +To get asset performance metrics, see this example. + + + +Android + + + +iOS + + + +### Asset view duration + +To get asset view duration, see this example. + + + +Android + + + +iOS + + + + +### Experience engagement metrics + +To get experience engagement metrics, see this example. + + + +Android + + + +iOS + + + +### Common custom metrics + +| Metric | Type | Description | +|---|---|---| +| `assetLoadTime` | Double | Image/video load time (ms).. | +| `assetViewDuration` | Double | Time asset was visible (ms). | +| `assetSize` | Int | Asset file size (bytes). | +| `experienceViewDuration` | Double | Time before interaction (ms). | +| `scrollDepth` | Double | Scroll position when viewed (%). | +| `viewportPosition` | String | `above_fold` / `below_fold`. | +| `interactionIndex` | Int | Nth click on this session .| +| `experimentVariant` | String | A/B test variant ID.| +| `deviceOrientation` | String | `portrait` / `landscape`. | + +#### Customer Journey Analytics report with custom metric. + +For example average load time by asset location. + +| Location | Avg Load Time | Avg View Duration | +|---|--:|--:| +| `homepage.hero` | 120ms | 3.2s | +| `product.gallery` | 85ms | 8.5s | +| `search.results` | 45ms | 1.1s | + +Insight: Gallery images load slower but get 8x more viewing time. + + +## Debugging with Assurance + +Adobe Assurance (Project Griffon) lets you inspect tracking events in real-time. Connect your app to an Assurance session to see exactly what payloads are being sent. + +### Setup + +To setup Assurance, import the extension and start the session. + + + +Android + + + +iOS + + + +### What You'll See in Assurance + +1. Track Asset Events + + When you call trackAssetView() or trackAssetClick(), you'll see: + + ``` + Event: Track Asset + Type: com.adobe.eventType.contentAnalytics + Source: com.adobe.eventSource.requestContent + + Payload: + { + "assetURL": "https://example.com/hero.jpg", + "interactionType": "view", + "assetLocation": "homepage.hero", + "assetExtras": { + "assetLoadTime": 120, + "assetSize": 45000 + } + } + ``` + +2. Track Experience Events + + * When you call `registerExperience()`: + + ```json + Event: Track Experience + Type: com.adobe.eventType.contentAnalytics + + Payload: + { + "experienceId": "mobile-abc123...", + "interactionType": "definition", + "assetURLs": ["https://example.com/hero.jpg"], + "texts": [ + {"value": "Summer Sale", "styles": {"role": "headline"}} + ], + "ctas": [ + {"value": "Shop Now", "styles": {"enabled": true}} + ] + } + ``` + + * When you call trackExperienceView() or trackExperienceClick(): + + ```json + Event: Track Experience + Type: com.adobe.eventType.contentAnalytics + + Payload: + { + "experienceId": "mobile-abc123...", + "interactionType": "view", + "experienceLocation": "homepage.hero", + "experienceExtras": { + "experienceViewDuration": 3500 + } + } + ``` + +3. Edge Network Events + + After batching, you'll see the Edge request: + + ```json + Event: Edge Request + Type: com.adobe.eventType.edge + + Payload: + { + "xdm": { + "eventType": "contentanalytics.asset.view", + "_contentanalytics": { + "asset": { + "url": "https://example.com/hero.jpg", + "location": "homepage.hero" + } + } + } + } + ``` + + +### Debugging checklist + +| What to Check | Where in Assurance | +|---|---| +| Event dispatched | Look for Track Asset / Track Experience events. | +| Correct payload | Expand event → check assetURL, experienceId, etc. | +| Batching working | Multiple events → single Edge request. | +| Edge delivery | Look for Edge Request after batch flush. | +| Consent status | Check Edge Consent events. | + + +### Common Issues in Assurance + +No events appearing: + +* Check extension is registered. +* Verify MobileCore.dispatch() is being called. + +Events but no Edge request: + +* Check consent status (must be "yes" or "pending"). +* Wait for batch timeout (default 5s) or threshold (default 10 events). + +Missing experienceId in track events: + +* Ensure registerExperience() was called first +* Check the returned ID is being passed to track methods + + +## Testing + +To test your implementation, enable verbose logging. + + + +Android + + + +iOS + + + +Then look for registration confirmation + +```text +[ContentAnalytics] Stored experience definition: exp-abc123 with 3 assets +``` + +And tracking confirmation: + +```text +[ContentAnalytics] Experience event processed successfully: track-view - exp-abc123 +Test cross-session: register, force quit, relaunch, track same ID. No warning should appear. +``` + +## Troubleshooting + +* **Experience definition not found** warning: Register the experience before tracking it. +* Assets not attributed. Same issue - register with `assetURLs` before tracking. +* Duplicate registrations: Check if already registered before calling `registerExperience()`: + + + +Android + + + +iOS + + + +* Or compute the ID yourself using the algorithm above for content-based caching. + +## Common patterns + +Common implementation patterns are illustrated below. + +### Carousel/Banner + +To implement a carousel or banner, see below for an example. + + + +Android + + + +iOS + + + + +### Product Grid + +To implement a product grid, see below for an example. + + + +Android + + + +iOS + + + +### Reusable Tracking Component + +To implement a reusable tracking component, see below for an example. + + + +Android + + + +iOS + + +``` diff --git a/src/pages/solution/adobe-content-analytics/index.md b/src/pages/solution/adobe-content-analytics/index.md index 40be842cc2..573f674581 100644 --- a/src/pages/solution/adobe-content-analytics/index.md +++ b/src/pages/solution/adobe-content-analytics/index.md @@ -37,27 +37,27 @@ Select the datastream to use for Content Analytics for the Production (required) ### General Settings -Enable or disable Track Experiences to track experiences in Content Analytics or not. +Enable or disable **Track Experiences** to track experiences in Content Analytics or not. Default is enabled (true). -Select Enable Debug Logging to enable debug logging for Content Analytics. +Select **Enable Debug Logging** to enable verbose debug logging for Content Analytics. Default is disabled (false). ### Batching Settings Select **Enable Batching** to enable batching for Content Analytics. -Enter a value in **Max Batch Size** to define the maximum batch size. +Enter a value in **Max Batch Size** to define the maximum batch size. Default is `10`. -Enter a value in **Batch Flush Interval (ms)** to define a time in miliseconds to wait before flusing batched events. +Enter a value in **Batch Flush Interval (ms)** to define a time in miliseconds to wait before flusing batched events. Default is `2000` (2 seconds). ### Exclusions Specify exclusions for asset URLs, assets locations, and experience locations. -* Enter an **Asset URL Pattern** to specify a regular expression to filter which asset URLs should be excluded when collecting data for Content Analytics. Use Test Regex to open the **Regular Expression Tester** where you can validate your regular expression. -* Enter an **Asset Location Pattern** to specify a regular expression to filter which asset locations should be excluded when collecting data for Content Analytics. Use **Test Regex** to open the **Regular Expression Tester** where you can validate your regular expression. -* Enter an **Experience Location Pattern** to specify a regular expression to filter which experience locations should be excluded when collecting data for Content Analytics. Use Test Regex to open the **Regular Expression Tester** where you can validate your regular expression. +* Enter an **Asset URL Pattern** to specify a regular expression to filter which asset URLs should be excluded when collecting data for Content Analytics. For example: `.*\\.gif$|.*\\.svg$` to exclude GIF or SVG files.
Use **Test Regex** to open the **Regular Expression Tester** where you can validate your regular expression. An example regular expression +* Enter an **Asset Location Pattern** to specify a regular expression to filter which asset locations should be excluded when collecting data for Content Analytics. For example: `^(debug|test).*` to exclude asset location that contain `debug` or `test`.
Use **Test Regex** to open the **Regular Expression Tester** where you can validate your regular expression. +* Enter an **Experience Location Pattern** to specify a regular expression to filter which experience locations should be excluded when collecting data for Content Analytics. For example: `^test\\..*|^dev\\..*` to exclude any experience location that contains `test.` or `dev.`
Use **Test Regex** to open the **Regular Expression Tester** where you can validate your regular expression. ## Add Content Analytics extension to your app diff --git a/src/pages/solution/adobe-content-analytics/tabs/advanced-configuration.md b/src/pages/solution/adobe-content-analytics/tabs/advanced-configuration.md new file mode 100644 index 0000000000..4c24c378af --- /dev/null +++ b/src/pages/solution/adobe-content-analytics/tabs/advanced-configuration.md @@ -0,0 +1,90 @@ +--- +noIndex: true +--- + +import Alerts from '/src/pages/resources/alerts.md' + + + +```java +MobileCore.updateConfiguration(mapOf( + "contentanalytics.maxBatchSize" to 20, + "contentanalytics.batchFlushInterval" to 5000 +)) +``` + + + +```swift +MobileCore.updateConfigurationWith(configDict: [ + "contentanalytics.maxBatchSize": 20, + "contentanalytics.batchFlushInterval": 5000 +]) +``` + + + +```java +// Opt in +Consent.update(mapOf("consents" to mapOf("collect" to mapOf("val" to "y")))) + +// Opt out +Consent.update(mapOf("consents" to mapOf("collect" to mapOf("val" to "n")))) + +// Pending +Consent.update(mapOf("consents" to mapOf("collect" to mapOf("val" to "p")))) +``` + + + +```swift +// Opt in +Consent.update(with: ["consents": ["collect": ["val": "y"]]]) + +// Opt out +Consent.update(with: ["consents": ["collect": ["val": "n"]]]) + +// Pending +Consent.update(with: ["consents": ["collect": ["val": "p"]]]) +``` + + + +```java +MobileCore.setPrivacyStatus(MobilePrivacyStatus.OPT_IN) // send +MobileCore.setPrivacyStatus(MobilePrivacyStatus.OPT_OUT) // drop + clear +MobileCore.setPrivacyStatus(MobilePrivacyStatus.UNKNOWN) // queue +``` + + + +```swift +MobileCore.setPrivacyStatus(.optedIn) // send +MobileCore.setPrivacyStatus(.optedOut) // drop + clear +MobileCore.setPrivacyStatus(.unknown) // queue +``` + + + +```java +MobileCore.resetIdentities() // clears cache + queue +``` + + + +```swift +MobileCore.resetIdentities() // clears cache + queue +``` + + + +```java +MobileCore.setLogLevel(LoggingMode.VERBOSE) +``` + + + +```swift +MobileCore.setLogLevel(.debug) +``` + diff --git a/src/pages/solution/adobe-content-analytics/tabs/api-reference.md b/src/pages/solution/adobe-content-analytics/tabs/api-reference.md index e69de29bb2..e82e9092f5 100644 --- a/src/pages/solution/adobe-content-analytics/tabs/api-reference.md +++ b/src/pages/solution/adobe-content-analytics/tabs/api-reference.md @@ -0,0 +1,921 @@ +--- +noIndex: true +--- + + + +#### Java + +**Syntax** + +```java +static void trackAsset(String assetURL) +static void trackAsset(String assetURL, InteractionType interactionType) +static void trackAsset(String assetURL, InteractionType interactionType, String assetLocation) +static void trackAsset(String assetURL, InteractionType interactionType, String assetLocation, Map additionalData) + +``` + +**Example** + +```java +// Using InteractionType enum directly +ContentAnalytics.trackAsset( + "https://example.com/image.jpg", + InteractionType.VIEW, + "home" +); +``` + +#### Kotlin + +**Syntax** + +```java +fun trackAsset( + assetURL: String, + interactionType: InteractionType = InteractionType.VIEW, + assetLocation: String? = null, + additionalData: Map? = null +): Unit +``` + +**Example** + +```java +// Using InteractionType enum directly +ContentAnalytics.trackAsset( + assetURL: "https://example.com/image.jpg", + interactionType: InteractionType.VIEW, + assetLocation: "home" +); +``` + + + +#### Swift + +**Syntax** + +```swift +static func trackAsset( + assetURL: String, + interactionType: InteractionType = .view, + assetLocation: String? = nil, + additionalData: [String: Any]? = nil +) +``` + +**Example** + +```swift +ContentAnalytics.trackAsset( + assetURL: "https://example.com/image.jpg", + interactionType: InteractionType.VIEW, + assetLocation: "home" +); +``` + +#### Objective-C + +**Syntax** + +```objc ++ (void)trackAsset:(NSString *)assetURL + interactionType:(AEPInteractionType)interactionType + assetLocation:(nullable NSString *)assetLocation + additionalData:(nullable NSDictionary *)additionalData; +``` + +**Example** + +```objc +[AEPContentAnalytics trackAsset:@"https://example.com/image.jpg" + interactionType:AEPInteractionTypeView + assetLocation:@"home"]; +``` + + + +#### Java + +**Syntax** + +```java +static void trackAssetView(String assetURL) +static void trackAssetView(String assetURL, String assetLocation) +static void trackAssetView(String assetURL, String assetLocation, Map additionalData)additionalData) + +``` + +**Example** + +```java +// Using InteractionType enum directly +ContentAnalytics.trackAssetView( + "https://example.com/image.jpg", + "home" +); +``` + +#### Kotlin + +**Syntax** + +```java +fun trackAssetView( + assetURL: String, + assetLocation: String? = null, + additionalData: Map? = null +): Unit +``` + +**Example** + +```java +// Using InteractionType enum directly +ContentAnalytics.trackAssetView( + assetURL: "https://example.com/image.jpg", + assetLocation: "home" +); +``` + + + +#### Swift + +**Syntax** + +```swift +static func trackAssetView( + assetURL: String, + assetLocation: String? = nil, + additionalData: [String: Any]? = nil +) +``` + +**Example** + +```swift +ContentAnalytics.trackAsset( + assetURL: "https://example.com/image.jpg", + assetLocation: "home" +); +``` + +#### Objective-C + +**Syntax** + +```objc ++ (void)trackAssetView:(NSString *)assetURL + assetLocation:(nullable NSString *)assetLocation + additionalData:(nullable NSDictionary *)additionalData; + +``` + +**Example** + +```objc +[AEPContentAnalytics trackAssetView:@"https://example.com/image.jpg" + assetLocation:@"home"]; +``` + + + +#### Java + +**Syntax** + +```java +static void trackAssetClick(String assetURL) +static void trackAssetClick(String assetURL, String assetLocation) +static void trackAssetClick(String assetURL, String assetLocation, Map additionalData) + +``` + +**Example** + +```java +// Using InteractionType enum directly +ContentAnalytics.trackAssetClick( + "https://example.com/image.jpg", + "home", + null +); +``` + +#### Kotlin + +**Syntax** + +```java +fun trackAssetClick( + assetURL: String, + assetLocation: String? = null, + additionalData: Map? = null +): Unit +``` + +**Example** + +```java +// Using InteractionType enum directly +ContentAnalytics.trackAssetClick( + "https://example.com/image.jpg", + "home", + null +); +``` + + + +#### Swift + +**Syntax** + +```swift +static func trackAssetClick( + assetURL: String, + assetLocation: String? = nil, + additionalData: [String: Any]? = nil +) +``` + +**Example** + +```swift +ContentAnalytics.trackAssetClick( + assetURL: "https://example.com/image.jpg", + assetLocation: "home" +); +``` + +#### Objective-C + +**Syntax** + +```objc ++ (void)trackAssetClick:(NSString *)assetURL + assetLocation:(nullable NSString *)assetLocation + additionalData:(nullable NSDictionary *)additionalData; +``` + +**Example** + +```objc +[AEPContentAnalytics trackAssetClick:@"https://example.com/image.jpg" + assetLocation:@"home"]; +``` + + + +#### Java + +**Syntax** + +```java +static void trackAssetCollection(List assetURLs) +static void trackAssetCollection(List assetURLs, InteractionType interactionType) +static void trackAssetCollection(List assetURLs, InteractionType interactionType, String assetLocation) + +``` + +**Example** + +```java +ContentAnalytics.trackAssetCollection( + List.of( + "https://example.com/img1.jpg", + "https://example.com/img2.jpg" + ), + "product-carousel" +); +``` + +#### Kotlin + +**Syntax** + +```java +fun trackAssetCollection( + assetURLs: List, + interactionType: InteractionType = InteractionType.VIEW, + assetLocation: String? = null +): Unit +``` + +**Example** + +```java +ContentAnalytics.trackAssetCollection( + assetURLs = listOf( + "https://example.com/img1.jpg", + "https://example.com/img2.jpg" + ), + assetLocation = "product-carousel" +); +``` + + + +#### Swift + +**Syntax** + +```swift +static func trackAssetCollection( + assetURLs: [String], + interactionType: InteractionType = .view, + assetLocation: String? = nil +) +``` + +**Example** + +```swift +ContentAnalytics.trackAssetCollection( + assetURLs: ["https://example.com/image1.jpg", "https://example.com/image1.jpg"], + assetLocation: "home" +); +``` + +#### Objective-C + +**Syntax** + +```objc ++ (void)trackAssetCollectionWithAssetURLs:(NSArray *)assetURLs + interactionType:(AEPInteractionType)interactionType + assetLocation:(nullable NSString *)assetLocation; +``` + +**Example** + +```objc +[AEPContentAnalytics trackAssetCollectionWithAssetURLs:@[@"https://example.com/image1.jpg",@"https://example.com/image1.jpg"] + interactionType:AEPInteractionTypeView + assetLocation:@"home"]; +``` + + + + + + +#### Java + +**Syntax** + +```java +static String registerExperience(List assets, List texts) +static String registerExperience(List assets, List texts, List ctas) + +``` + +**Example** + +```java +String expId = ContentAnalytics.registerExperience( + List.of( + new ContentItem("https://example.com/product.jpg") + ), + List.of( + new ContentItem("iPhone 16 Pro", Map.of("role", "headline")), + new ContentItem("$999", Map.of("role", "price")) + ), + List.of( + new ContentItem("Buy Now", Map.of("enabled", true)) + ) +); + +ContentAnalytics.trackExperienceView(expId, "product.detail") +``` + +#### Kotlin + +**Syntax** + +```java +fun registerExperience( + assets: List, + texts: List, + ctas: List? = null +): String + +``` + +**Example** + +```java +// Using InteractionType enum directly +val expId = ContentAnalytics.registerExperience( + assets = listOf( + ContentItem("https://example.com/product.jpg") + ), + texts = listOf( + ContentItem("iPhone 16 Pro", mapOf("role" to "headline")), + ContentItem("$999", mapOf("role" to "price")) + ), + ctas = listOf( + ContentItem("Buy Now", mapOf("enabled" to true)) + ) +); + +ContentAnalytics.trackExperienceView(experienceId: expId, experienceLocation: "product.detail") +``` + + + +#### Swift + +**Syntax** + +```swift +@discardableResult +static func registerExperience( + assets: [ContentItem], + texts: [ContentItem], + ctas: [ContentItem]? = nil +) -> String +``` + +**Example** + +```swift +let expId = ContentAnalytics.registerExperience( + assets: [ContentItem(value: "https://example.com/product.jpg", styles: [:])], + texts: [ + ContentItem(value: "iPhone 16 Pro", styles: ["role": "headline"]), + ContentItem(value: "$999", styles: ["role": "price"]) + ], + ctas: [ContentItem(value: "Buy Now", styles: ["enabled": true])] +) +ContentAnalytics.trackExperienceView(experienceId: expId, experienceLocation: "product.detail") +``` + +#### Objective-C + +**Syntax** + +```objc ++ (NSString *)registerExperienceWithAssets:(NSArray *)assets + texts:(NSArray *)texts + ctas:(nullable NSArray *)ctas; +``` + +**Example** + +```objc +NSString *expId = [AEPContentAnalytics registerExperienceWithAssets:@[ + [[AEPContentItem alloc] initWithValue:@"https://example.com/product.jpg" styles:@{}] +] +texts:@[ + [[AEPContentItem alloc] initWithValue:@"iPhone 16 Pro" styles:@{@"role": @"headline"}], + [[AEPContentItem alloc] initWithValue:@"$999" styles:@{@"role": @"price"}] +] +ctas:@[ + [[AEPContentItem alloc] initWithValue:@"Buy Now" styles:@{@"enabled": @YES}] +]]; + +[AEPContentAnalytics trackExperienceViewWithExperienceId:expId + experienceLocation:@"product.detail"]; +``` + + + +#### Java + +**Syntax** + +```java +static void trackExperienceView(String experienceId) +static void trackExperienceView(String experienceId, String experienceLocation) +static void trackExperienceView(String experienceId, String experienceLocation, Map additionalData) + +``` + +**Example** + +```java +ContentAnalytics.trackExperienceView( + expId, + "homepage.hero", + Map.of("viewDuration", 5.2) +); +``` + +#### Kotlin + +**Syntax** + +```java +fun trackExperienceView( + experienceId: String, + experienceLocation: String? = null, + additionalData: Map? = null +): Unit +``` + +**Example** + +```java +// Using InteractionType enum directly +ContentAnalytics.trackExperienceView( + experienceId: expId, + experienceLocation: "homepage.hero", + additionalData: ["viewDuration": 5.2] +) +``` + + + +#### Swift + +**Syntax** + +```swift +static func trackExperienceView( + experienceId: String, + experienceLocation: String? = nil, + additionalData: [String: Any]? = nil +) +``` + +**Example** + +```swift +ContentAnalytics.trackExperienceView( + experienceId: expId, + experienceLocation: "homepage.hero", + additionalData: ["viewDuration": 5.2] +) +``` + +#### Objective-C + +**Syntax** + +```objc ++ (void)trackExperienceView:(NSString *)assetURL + assetLocation:(nullable NSString *)assetLocation + additionalData:(nullable NSDictionary *)additionalData; + +``` + +**Example** + +```objc +[AEPContentAnalytics trackExperienceView:expId + experienceLocation:@"homepage.hero" + additionalData:@{@"viewDuration": @5.2}]; +``` + + + + +#### Java + +**Syntax** + +```java +static void trackExperienceClick(String experienceId) +static void trackExperienceClick(String experienceId, String experienceLocation) +static void trackExperienceClick(String experienceId, String experienceLocation, Map additionalData) + +``` + +**Example** + +```java +ContentAnalytics.trackExperienceClick( + expId, + "homepage.hero", + Map.of("viewDuration", 5.2) +); +``` + +#### Kotlin + +**Syntax** + +```java +fun trackExperienceClick( + experienceId: String, + experienceLocation: String? = null, + additionalData: Map? = null +): Unit +``` + +**Example** + +```java +// Using InteractionType enum directly +ContentAnalytics.trackExperienceClick( + experienceId: expId, + experienceLocation: "homepage.hero", + additionalData: ["viewDuration": 5.2] +) +``` + + + +#### Swift + +**Syntax** + +```swift +static func trackExperienceClick( + experienceId: String, + experienceLocation: String? = nil, + additionalData: [String: Any]? = nil +) +``` + +**Example** + +```swift +ContentAnalytics.trackExperienceClick( + experienceId: expId, + experienceLocation: "homepage.hero", + additionalData: ["viewDuration": 5.2] +) +``` + +#### Objective-C + +**Syntax** + +```objc ++ (void)trackExperienceClick:(NSString *)assetURL + assetLocation:(nullable NSString *)assetLocation + additionalData:(nullable NSDictionary *)additionalData; + +``` + +**Example** + +```objc +[AEPContentAnalytics trackExperienceClick:expId + experienceLocation:@"homepage.hero" + additionalData:@{@"viewDuration": @5.2}]; +``` + + + +#### Java + +**Syntax** + +```java +public class ContentItem { + private final String value; + private final Map styles; + + public ContentItem(String value, Map styles) { + this.value = value; + this.styles = styles; + } + + // Convenience constructor to mirror the default parameter + public ContentItem(String value) { + this(value, Collections.emptyMap()); + } + + public String getValue() { + return value; + } + + public Map getStyles() { + return styles; + } + + public Map toMap() { + Map map = new HashMap<>(); + map.put("value", value); + map.put("styles", styles); + return map; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ContentItem)) return false; + ContentItem that = (ContentItem) o; + return Objects.equals(value, that.value) && + Objects.equals(styles, that.styles); + } + + @Override + public int hashCode() { + return Objects.hash(value, styles); + } + + @Override + public String toString() { + return "ContentItem{value='" + value + "', styles=" + styles + "}"; + } +} +``` + +**Example** + +```java +// Asset with URL +ContentItem("https://example.com/hero.jpg") + +// Text with role +ContentItem("Welcome!", mapOf("role" to "headline")) + +// CTA with enabled state +ContentItem("Shop Now", mapOf("enabled" to true, "role" to "primary")) +``` + +#### Kotlin + +**Syntax** + +```java +data class ContentItem( + val value: String, + val styles: Map = emptyMap() +) { + fun toMap(): Map +} +``` + +**Example** + +```java +// Asset with URL +ContentItem(value: "https://example.com/hero.jpg") + +// Text with role +ContentItem(value: "Welcome!", styles: mapOf("role" to "headline")) + +// CTA with enabled state +ContentItem(value: "Shop Now", styles: mapOf("enabled" to true, "role" to "primary")) +``` + + + +#### Swift + +**Syntax** + +```swift +public struct ContentItem { + let value: String + let styles: [String: Any] + + init(value: String, styles: [String: Any]) +} +``` + +**Example** + +```swift +// Asset +ContentItem(value: "https://example.com/image.jpg", styles: [:]) + +// Text with role +ContentItem(value: "Product Title", styles: ["role": "headline"]) +ContentItem(value: "$99.99", styles: ["role": "price"]) + +// CTA +ContentItem(value: "Buy Now", styles: ["enabled": true]) +``` + +#### Objective-C + +**Syntax** + +```objc +@implementation AEPContentItem + +- (instancetype)initWithValue:(NSString *)value + styles:(NSDictionary *)styles { + if (self = [super init]) { + _value = value; + _styles = styles; + } + return self; +} +``` + +**Example** + +```objc +AEPContentItem *asset = [[AEPContentItem alloc] initWithValue:@"https://example.com/image.jpg" + styles:@{}]; + + +AEPContentItem *title = [[AEPContentItem alloc] initWithValue:@"Product Title" + styles:@{@"role": @"headline"}]; +AEPContentItem *price = [[AEPContentItem alloc] initWithValue:@"$99.99" + styles:@{@"role": @"price"}]; + + +AEPContentItem *cta = [[AEPContentItem alloc] initWithValue:@"Buy Now" + styles:@{@"enabled": @YES}]; +``` + + + +#### Java + +**Syntax** + +```java +public enum InteractionType { + VIEW, + CLICK, + DEFINITION; + + public String getStringValue() { + return name().toLowerCase(); + } +} +``` + +**Example** + +```java +ContentAnalytics.trackAsset( + "https://example.com/hero.jpg", + InteractionType.VIEW +) +``` + +#### Kotlin + +**Syntax** + +```java +enum class InteractionType { + VIEW, + CLICK, + DEFINITION; + + val stringValue: String + get() = name.lowercase() +} +``` + +**Example** + +```java +ContentAnalytics.trackAsset( + assetURL = "https://example.com/hero.jpg", + interactionType = InteractionType.VIEW +) +``` + + + +#### Swift + +**Syntax** + +```swift +public enum InteractionType: Int { + case view = 0 + case click = 1 + + public var stringValue: String { ... } + public static func from(string: String) -> InteractionType? +} +``` + +**Example** + +```swift +ContentAnalytics.trackAsset( + assetURL: "https://example.com/hero.jpg", + interactionType: .view +) +``` + +#### Objective-C + +**Syntax** + +```objc +@objc(AEPInteractionType) +public enum InteractionType: Int { + case view = 0 + case click = 1 + + public var stringValue: String { ... } + public static func from(string: String) -> InteractionType? +} +``` + +**Example** + +```objc +[ContentAnalytics trackAsset:@"https://example.com/hero.jpg" + interactionType:AEPInteractionTypeView + assetLocation:nil + additionalData:nil]; +``` diff --git a/src/pages/solution/adobe-content-analytics/tabs/crash-recovery.md b/src/pages/solution/adobe-content-analytics/tabs/crash-recovery.md new file mode 100644 index 0000000000..a41fb5eedb --- /dev/null +++ b/src/pages/solution/adobe-content-analytics/tabs/crash-recovery.md @@ -0,0 +1,103 @@ +--- +noIndex: true +--- + +import Alerts from '/src/pages/resources/alerts.md' + + + +```java +fun addAssetEvent(event: Event) + ├─> assetHitProcessor.accumulateEvent(event) // Add to memory + ├─> persistEventImmediately(event, queue) // Write to disk + └─> checkAndFlushIfNeeded() // Check thresholds + +suspend fun performFlush() + ├─> val events = assetHitProcessor.processAccumulatedEvents() + └─> [Orchestrator processes events → dispatches to Edge] + └─> Edge guarantees delivery from here +``` + + + +```swift +func addAssetEvent(_ event: Event) + ├─> assetHitProcessor.accumulateEvent(event) // Add to memory + ├─> persistEventImmediately(event, to: queue) // Write to disk + └─> checkAndFlushIfNeeded() // Check thresholds + +func performFlush() + ├─> let events = assetHitProcessor.processAccumulatedEvents() + └─> [Orchestrator processes events → dispatches to Edge] + └─> Edge guarantees delivery from here +``` + + + + +```java +override suspend fun processHit(entity: DataEntity): Boolean + ├─> Decode event from disk + ├─> Accumulate in memory (if not already present) + └─> return true → clear from disk (event now in memory) +``` + + + +```swift +func processHit(entity: DataEntity, completion: (Bool) -> Void) + ├─> Decode event from disk + ├─> Accumulate in memory (if not already present) + └─> completion(true) → clear from disk (event now in memory) +``` + + + + +```java +// On flush (ContentAnalyticsOrchestrator.kt) +private fun buildAssetMetricsCollection(events: List): AssetMetricsCollection { + val groupedEvents = events.groupBy { it.assetKey ?: "" } + val metricsMap = mutableMapOf() + + for ((key, events) in groupedEvents) { + val views = events.count { it.interactionType == InteractionType.VIEW } + val clicks = events.count { it.interactionType == InteractionType.CLICK } + metricsMap[key] = AssetMetrics(viewCount = views, clickCount = clicks, ...) + } + + return AssetMetricsCollection(metricsMap) +} +``` + + + +```swift +// On flush (ContentAnalyticsOrchestrator.swift) +func buildAssetMetricsCollection(from events: [Event]) -> AssetMetricsCollection { + let groupedEvents = Dictionary(grouping: events) { $0.assetKey ?? "" } + var metricsMap: [String: AssetMetrics] = [:] + + for (key, events) in groupedEvents { + let views = events.filter { $0.interactionType == .view }.count + let clicks = events.filter { $0.interactionType == .click }.count + metricsMap[key] = AssetMetrics(viewCount: views, clickCount: clicks, ...) + } + + return AssetMetricsCollection(metrics: metricsMap) +} +``` + + + +```java +// BatchCoordinator +private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) +private val stateMutex = kotlinx.coroutines.sync.Mutex() + +// DirectHitProcessor +private val mutex = Mutex() + +// All state mutations wrapped in mutex.withLock { } +``` + diff --git a/src/pages/solution/adobe-content-analytics/tabs/experience-tracking.md b/src/pages/solution/adobe-content-analytics/tabs/experience-tracking.md new file mode 100644 index 0000000000..36c38fe177 --- /dev/null +++ b/src/pages/solution/adobe-content-analytics/tabs/experience-tracking.md @@ -0,0 +1,880 @@ +--- +noIndex: true +--- + +import Alerts from '/src/pages/resources/alerts.md' + + + +```java +// 1. Register (once per experience) +val expId = ContentAnalytics.registerExperience( + assets = listOf(ContentItem("https://example.com/hero.jpg", emptyMap())), + texts = listOf(ContentItem("Buy Now", mapOf("role" to "headline"))), + ctas = listOf(ContentItem("Shop", mapOf("enabled" to true))) +) + +// 2. Track view (when visible) +ContentAnalytics.trackExperienceView(expId, "homepage.hero") + +// 3. Track click (on tap) +ContentAnalytics.trackExperienceClick(expId, "homepage.hero") +``` + + + +```swift +// 1. Register (once per experience) +let expId = ContentAnalytics.registerExperience( + assets: [ContentItem(value: "https://example.com/hero.jpg", styles: [:])], + texts: [ContentItem(value: "Buy Now", styles: ["role": "headline"])], + ctas: [ContentItem(value: "Shop", styles: ["enabled": true])] +) + +// 2. Track view (when visible) +ContentAnalytics.trackExperienceView(experienceId: expId, experienceLocation: "homepage.hero") + +// 3. Track click (on tap) +ContentAnalytics.trackExperienceClick(experienceId: expId, experienceLocation: "homepage.hero") +``` + + + +```swift +let experienceId = ContentAnalytics.registerExperience( + assets: [ + ContentItem(value: "https://example.com/hero.jpg", styles: [:]), + ContentItem(value: "https://example.com/icon.png", styles: [:]) + ], + texts: [ + ContentItem(value: "iPhone 16 Pro", styles: ["role": "headline"]), + ContentItem(value: "Forged in titanium", styles: ["role": "body"]), + ContentItem(value: "$999", styles: ["role": "price"]) + ], + ctas: [ + ContentItem(value: "Buy Now", styles: ["enabled": true]) + ] +) +``` + + + + +```java +val experienceId = ContentAnalytics.registerExperience( + assets = listOf( + ContentItem("https://example.com/hero.jpg", emptyMap()), + ContentItem("https://example.com/icon.png", emptyMap()) + ), + texts = listOf( + ContentItem("iPhone 16 Pro", mapOf("role" to "headline")), + ContentItem("Forged in titanium", mapOf("role" to "body")), + ContentItem("$999", mapOf("role" to "price")) + ), + ctas = listOf( + ContentItem("Buy Now", mapOf("enabled" to true)) + ) +) +``` + + + +```swift +ContentAnalytics.trackExperienceView(experienceId: experienceId, experienceLocation: "product.detail") +ContentAnalytics.trackExperienceClick(experienceId: experienceId, experienceLocation: "product.detail") +``` + + + + +```java +ContentAnalytics.trackExperienceView(experienceId, "product.detail") +ContentAnalytics.trackExperienceClick(experienceId, "product.detail") +``` + + + + +```swift +// Each app session +let expId = ContentAnalytics.registerExperience( + assets: [ContentItem(value: "https://example.com/hero.jpg", styles: [:])], + texts: [ContentItem(value: "Title", styles: ["role": "headline"])] +) +ContentAnalytics.trackExperienceView(experienceId: expId, experienceLocation: "home") +``` + + + +```java +// Each app session +val expId = ContentAnalytics.registerExperience( + assets = listOf(ContentItem("https://example.com/hero.jpg", emptyMap())), + texts = listOf(ContentItem("Title", mapOf("role" to "headline"))) +) +ContentAnalytics.trackExperienceView(expId, "home") +``` + + + + +```swift +class ProductDetailViewController { + var experienceId: String? + + override func viewDidLoad() { + super.viewDidLoad() + + experienceId = ContentAnalytics.registerExperience( + assets: product.imageURLs.map { ContentItem(value: $0, styles: [:]) }, + texts: [ + ContentItem(value: product.name, styles: ["role": "headline"]), + ContentItem(value: product.price, styles: ["role": "price"]) + ], + ctas: [ContentItem(value: "Add to Cart", styles: ["enabled": true])] + ) + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + if let expId = experienceId { + ContentAnalytics.trackExperienceView(experienceId: expId, experienceLocation: "product.detail.\(product.id)") + } + } + + @IBAction func buyButtonTapped(_ sender: Any) { + if let expId = experienceId { + ContentAnalytics.trackExperienceClick(experienceId: expId, experienceLocation: "product.detail.\(product.id)") + } + } +} +``` + + + +```java +class ProductDetailActivity : AppCompatActivity() { + private var experienceId: String? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_product_detail) + + experienceId = ContentAnalytics.registerExperience( + assets = product.imageURLs.map { ContentItem(it, emptyMap()) }, + texts = listOf( + ContentItem(product.name, mapOf("role" to "headline")), + ContentItem(product.price, mapOf("role" to "price")) + ), + ctas = listOf(ContentItem("Add to Cart", mapOf("enabled" to true))) + ) + } + + override fun onResume() { + super.onResume() + experienceId?.let { expId -> + ContentAnalytics.trackExperienceView(expId, "product.detail.${product.id}") + } + } + + fun onBuyButtonClicked() { + experienceId?.let { expId -> + ContentAnalytics.trackExperienceClick(expId, "product.detail.${product.id}") + } + } +} +``` + + + + +```swift +class FeedViewController: UIViewController { + var experienceIds: [String: String] = [:] + + func displayProduct(_ product: Product) { + if experienceIds[product.id] == nil { + let expId = ContentAnalytics.registerExperience( + assets: product.imageURLs.map { ContentItem(value: $0, styles: [:]) }, + texts: [ContentItem(value: product.name, styles: ["role": "headline"])] + ) + experienceIds[product.id] = expId + } + } + + func productCellBecameVisible(_ product: Product) { + if let expId = experienceIds[product.id] { + ContentAnalytics.trackExperienceView(experienceId: expId, experienceLocation: "feed.item.\(product.id)") + } + } +} +``` + + + +```java +class FeedFragment : Fragment() { + private val experienceIds = mutableMapOf() + + fun displayProduct(product: Product) { + if (!experienceIds.containsKey(product.id)) { + val expId = ContentAnalytics.registerExperience( + assets = product.imageURLs.map { ContentItem(it, emptyMap()) }, + texts = listOf(ContentItem(product.name, mapOf("role" to "headline"))) + ) + experienceIds[product.id] = expId + } + } + + fun onProductCellVisible(product: Product) { + experienceIds[product.id]?.let { expId -> + ContentAnalytics.trackExperienceView(expId, "feed.item.${product.id}") + } + } +} +``` + + + + +```swift +import CommonCrypto + +func computeExperienceId(texts: [String], assets: [String], ctas: [String]) -> String { + let content = (texts.sorted() + assets.sorted() + ctas.sorted()).joined(separator: "|") + let hash = content.data(using: .utf8)!.sha1Hex() + return "mobile-\(hash.prefix(12))" +} +``` + + + +```java +import java.security.MessageDigest + +fun computeExperienceId(texts: List, assets: List, ctas: List): String { + val content = (texts.sorted() + assets.sorted() + ctas.sorted()).joinToString("|") + val hash = MessageDigest.getInstance("SHA-1") + .digest(content.toByteArray()) + .joinToString("") { "%02x".format(it) } + return "mobile-${hash.take(12)}" +} +``` + + + + +```swift +// Wrong +ContentAnalytics.trackExperienceView(experienceId: "exp-123") + +// Correct +let expId = ContentAnalytics.registerExperience(...) +ContentAnalytics.trackExperienceView(experienceId: expId) +``` + + + +```java +// Wrong +ContentAnalytics.trackExperienceView("exp-123", "home") + +// Correct +val expId = ContentAnalytics.registerExperience( + assets = listOf(ContentItem("https://example.com/image.jpg", emptyMap())), + texts = listOf(ContentItem("Title", mapOf("role" to "headline"))) +) +ContentAnalytics.trackExperienceView(expId, "home") +``` + + + + +```swift +// 1. Register experience with assets +let expId = ContentAnalytics.registerExperience( + assets: [ + ContentItem(value: "https://example.com/hero.jpg", styles: [:]), + ContentItem(value: "https://example.com/thumbnail.jpg", styles: [:]) + ], + texts: [ContentItem(value: "Summer Sale", styles: ["role": "headline"])] +) + +// 2. Track asset view (SDK knows this belongs to the experience above) +ContentAnalytics.trackAssetView(assetURL: "https://example.com/hero.jpg") + +// 3. Track experience interaction +ContentAnalytics.trackExperienceView(experienceId: expId, experienceLocation: "homepage") +``` + + + +```java +// 1. Register experience with assets +val expId = ContentAnalytics.registerExperience( + assets = listOf( + ContentItem("https://example.com/hero.jpg", emptyMap()), + ContentItem("https://example.com/thumbnail.jpg", emptyMap()) + ), + texts = listOf(ContentItem("Summer Sale", mapOf("role" to "headline"))) +) + +// 2. Track asset view (SDK knows this belongs to the experience above) +ContentAnalytics.trackAssetView("https://example.com/hero.jpg") + +// 3. Track experience interaction +ContentAnalytics.trackExperienceView(expId, "homepage") +``` + + + +```swift +// Asset tracked standalone - no experience context +ContentAnalytics.trackAssetView(assetURL: "https://example.com/hero.jpg") +``` + + + +```java +// Asset tracked standalone - no experience context +ContentAnalytics.trackAssetView("https://example.com/hero.jpg") +``` + + + + + +```swift +// Same experience tracked at different locations +ContentAnalytics.trackExperienceView(experienceId: expId, experienceLocation: "homepage.hero") +ContentAnalytics.trackExperienceView(experienceId: expId, experienceLocation: "product.sidebar") +ContentAnalytics.trackExperienceView(experienceId: expId, experienceLocation: "checkout.upsell") +``` + + + +```java +// Same experience tracked at different locations +ContentAnalytics.trackExperienceView(expId, "homepage.hero") +ContentAnalytics.trackExperienceView(expId, "product.sidebar") +ContentAnalytics.trackExperienceView(expId, "checkout.upsell") +``` + + + + + + +```swift +// Track without location for aggregate metrics +ContentAnalytics.trackExperienceView(experienceId: expId) +``` + + + +```java +// Track without location for aggregate metrics +ContentAnalytics.trackExperienceView(expId) +``` + + + +```swift +let heroImage = "https://example.com/hero.jpg" + +// Track per location +ContentAnalytics.trackAssetView(assetURL: heroImage, assetLocation: "homepage") +ContentAnalytics.trackAssetView(assetURL: heroImage, assetLocation: "category.electronics") +ContentAnalytics.trackAssetView(assetURL: heroImage, assetLocation: "search.results") +``` + + + +```java +val heroImage = "https://example.com/hero.jpg" + +// Track per location +ContentAnalytics.trackAssetView(heroImage, "homepage") +ContentAnalytics.trackAssetView(heroImage, "category.electronics") +ContentAnalytics.trackAssetView(heroImage, "search.results") +``` + + + +```swift +// You just track normally - ML attributes are automatic +let expId = ContentAnalytics.registerExperience( + assets: [ContentItem(value: "https://example.com/urgency-banner.jpg", styles: [:])], + texts: [ + ContentItem(value: "Only 3 left!", styles: ["role": "headline"]), + ContentItem(value: "Order now before it's gone", styles: ["role": "body"]) + ] +) +// Featurization service detects: persuasion_strategy = "scarcity + urgency" + +ContentAnalytics.trackExperienceView(experienceId: expId, experienceLocation: "product.detail") +``` + + + +```java +// You just track normally - ML attributes are automatic +val expId = ContentAnalytics.registerExperience( + assets = listOf(ContentItem("https://example.com/urgency-banner.jpg", emptyMap())), + texts = listOf( + ContentItem("Only 3 left!", mapOf("role" to "headline")), + ContentItem("Order now before it's gone", mapOf("role" to "body")) + ) +) +// Featurization service detects: persuasion_strategy = "scarcity + urgency" + +ContentAnalytics.trackExperienceView(expId, "product.detail") +``` + + + + +```swift +// Track asset load time +let loadStart = Date() +// ... load image ... +let loadTime = Date().timeIntervalSince(loadStart) * 1000 // ms + +ContentAnalytics.trackAssetView( + assetURL: imageURL, + assetLocation: "product.gallery", + additionalData: [ + "assetLoadTime": loadTime, // How long to load (ms) + "assetSize": imageData.count, // Bytes + "assetSource": "cdn" // Cache vs CDN + ] +) +``` + + + +```java +// Track asset load time +val loadStart = System.currentTimeMillis() +// ... load image ... +val loadTime = System.currentTimeMillis() - loadStart + +ContentAnalytics.trackAssetView( + assetURL = imageURL, + assetLocation = "product.gallery", + additionalData = mapOf( + "assetLoadTime" to loadTime, // How long to load (ms) + "assetSize" to imageData.size, // Bytes + "assetSource" to "cdn" // Cache vs CDN + ) +) +``` + + + + +```swift +class ImageViewController { + var viewStartTime: Date? + var imageURL: String? + + func viewDidAppear() { + viewStartTime = Date() + ContentAnalytics.trackAssetView(assetURL: imageURL!, assetLocation: "gallery") + } + + func viewWillDisappear() { + guard let start = viewStartTime else { return } + let viewDuration = Date().timeIntervalSince(start) * 1000 // ms + + ContentAnalytics.trackAssetClick( + assetURL: imageURL!, + assetLocation: "gallery", + additionalData: [ + "assetViewDuration": viewDuration // Time spent viewing (ms) + ] + ) + } +} +``` + + + +```java +class ImageFragment : Fragment() { + private var viewStartTime: Long = 0 + private var imageURL: String? = null + + override fun onResume() { + super.onResume() + viewStartTime = System.currentTimeMillis() + ContentAnalytics.trackAssetView(imageURL!!, "gallery") + } + + override fun onPause() { + super.onPause() + val viewDuration = System.currentTimeMillis() - viewStartTime + + ContentAnalytics.trackAssetClick( + assetURL = imageURL!!, + assetLocation = "gallery", + additionalData = mapOf( + "assetViewDuration" to viewDuration // Time spent viewing (ms) + ) + ) + } +} +``` + + + + +```swift +class ProductCardView { + var expId: String? + var appearTime: Date? + + func onAppear() { + appearTime = Date() + expId = ContentAnalytics.registerExperience( + assets: [ContentItem(value: product.imageURL, styles: [:])], + texts: [ContentItem(value: product.name, styles: ["role": "headline"])] + ) + ContentAnalytics.trackExperienceView( + experienceId: expId!, + experienceLocation: "homepage.featured" + ) + } + + func onTap() { + let viewDuration = Date().timeIntervalSince(appearTime!) * 1000 + + ContentAnalytics.trackExperienceClick( + experienceId: expId!, + experienceLocation: "homepage.featured", + additionalData: [ + "experienceViewDuration": viewDuration, // Time before click (ms) + "scrollDepth": currentScrollPercent, // How far user scrolled + "interactionIndex": tapCount // Nth interaction + ] + ) + } +} +``` + + + +```java +@Composable +fun ProductCard(product: Product) { + var expId by remember { mutableStateOf(null) } + var appearTime by remember { mutableStateOf(0L) } + + LaunchedEffect(product.id) { + appearTime = System.currentTimeMillis() + expId = ContentAnalytics.registerExperience( + assets = listOf(ContentItem(product.imageUrl, emptyMap())), + texts = listOf(ContentItem(product.name, mapOf("role" to "headline"))) + ) + ContentAnalytics.trackExperienceView(expId!!, "homepage.featured") + } + + Column( + modifier = Modifier.clickable { + val viewDuration = System.currentTimeMillis() - appearTime + + ContentAnalytics.trackExperienceClick( + experienceId = expId!!, + experienceLocation = "homepage.featured", + additionalData = mapOf( + "experienceViewDuration" to viewDuration, // Time before click + "scrollDepth" to currentScrollPercent, // How far scrolled + "interactionIndex" to tapCount // Nth interaction + ) + ) + } + ) { + // ... UI content + } +} +``` + + + + +```swift +// In your app delegate or SwiftUI app +import AEPAssurance + +// Start Assurance session (typically via deep link) +Assurance.startSession(url: assuranceDeepLink) +``` + + + +```java +// In your Application class or Activity +import com.adobe.marketing.mobile.Assurance + +// Start Assurance session (typically via deep link) +Assurance.startSession(assuranceDeepLink) +``` + + + + +```swift +MobileCore.setLogLevel(.trace) +``` + + + +```java +MobileCore.setLogLevel(LoggingMode.VERBOSE) +``` + + + + +```swift +if experienceIds[productId] == nil { + experienceIds[productId] = ContentAnalytics.registerExperience(...) +} +``` + + + +```java +if (!experienceIds.containsKey(productId)) { + experienceIds[productId] = ContentAnalytics.registerExperience( + assets = listOf(ContentItem(product.imageUrl, emptyMap())), + texts = listOf(ContentItem(product.name, mapOf("role" to "headline"))) + ) +} +``` + + + +```swift +class CarouselView: UIView { + private var experienceIds: [Int: String] = [:] + + func configureSlide(_ slide: Slide, at index: Int) { + experienceIds[index] = ContentAnalytics.registerExperience( + assets: [ContentItem(value: slide.imageURL, styles: [:])], + texts: [ContentItem(value: slide.title, styles: ["role": "headline"])], + ctas: slide.ctaText.map { [ContentItem(value: $0, styles: ["enabled": true])] } + ) + } + + func slideDidAppear(at index: Int) { + guard let expId = experienceIds[index] else { return } + ContentAnalytics.trackExperienceView(experienceId: expId, experienceLocation: "home.carousel.\(index)") + } + + func slideWasTapped(at index: Int) { + guard let expId = experienceIds[index] else { return } + ContentAnalytics.trackExperienceClick(experienceId: expId, experienceLocation: "home.carousel.\(index)") + } +} +``` + + + + +```java +class CarouselAdapter : RecyclerView.Adapter() { + private val experienceIds = mutableMapOf() + + override fun onBindViewHolder(holder: CarouselViewHolder, position: Int) { + val slide = slides[position] + + experienceIds[position] = ContentAnalytics.registerExperience( + assets = listOf(ContentItem(slide.imageUrl, emptyMap())), + texts = listOf(ContentItem(slide.title, mapOf("role" to "headline"))), + ctas = slide.ctaText?.let { listOf(ContentItem(it, mapOf("enabled" to true))) } + ) + + holder.bind(slide) + } + + override fun onViewAttachedToWindow(holder: CarouselViewHolder) { + experienceIds[holder.adapterPosition]?.let { expId -> + ContentAnalytics.trackExperienceView(expId, "home.carousel.${holder.adapterPosition}") + } + } + + fun onSlideClicked(position: Int) { + experienceIds[position]?.let { expId -> + ContentAnalytics.trackExperienceClick(expId, "home.carousel.$position") + } + } +} +``` + + + + +```swift +struct ProductCard: View { + let product: Product + @State private var expId: String? + + var body: some View { + VStack { + AsyncImage(url: URL(string: product.imageURL)) + Text(product.name) + Text(product.price) + } + .onAppear { + if expId == nil { + expId = ContentAnalytics.registerExperience( + assets: [ContentItem(value: product.imageURL, styles: [:])], + texts: [ + ContentItem(value: product.name, styles: ["role": "headline"]), + ContentItem(value: product.price, styles: ["role": "price"]) + ] + ) + } + if let id = expId { + ContentAnalytics.trackExperienceView(experienceId: id, experienceLocation: "catalog.product.\(product.id)") + } + } + .onTapGesture { + if let id = expId { + ContentAnalytics.trackExperienceClick(experienceId: id, experienceLocation: "catalog.product.\(product.id)") + } + } + } +} +``` + + + + +```java +@Composable +fun ProductCard(product: Product) { + var expId by remember { mutableStateOf(null) } + + LaunchedEffect(product.id) { + expId = ContentAnalytics.registerExperience( + assets = listOf(ContentItem(product.imageUrl, emptyMap())), + texts = listOf( + ContentItem(product.name, mapOf("role" to "headline")), + ContentItem(product.price, mapOf("role" to "price")) + ) + ) + expId?.let { + ContentAnalytics.trackExperienceView(it, "catalog.product.${product.id}") + } + } + + Column( + modifier = Modifier.clickable { + expId?.let { + ContentAnalytics.trackExperienceClick(it, "catalog.product.${product.id}") + } + } + ) { + AsyncImage(model = product.imageUrl, contentDescription = null) + Text(product.name) + Text(product.price) + } +} +``` + + + + +```swift +struct TrackedExperience: View { + let assets: [ContentItem] + let texts: [ContentItem] + let location: String + let content: Content + + @State private var expId: String? + + init( + assets: [ContentItem], + texts: [ContentItem], + location: String, + @ViewBuilder content: () -> Content + ) { + self.assets = assets + self.texts = texts + self.location = location + self.content = content() + } + + var body: some View { + content + .onAppear { + if expId == nil { + expId = ContentAnalytics.registerExperience(assets: assets, texts: texts) + } + if let id = expId { + ContentAnalytics.trackExperienceView(experienceId: id, experienceLocation: location) + } + } + .onTapGesture { + if let id = expId { + ContentAnalytics.trackExperienceClick(experienceId: id, experienceLocation: location) + } + } + } +} + +// Usage +TrackedExperience( + assets: [ContentItem(value: product.imageURL, styles: [:])], + texts: [ContentItem(value: product.name, styles: ["role": "headline"])], + location: "product.\(product.id)" +) { + ProductCardView(product: product) +} +``` + + + + +```java +@Composable +fun TrackedExperience( + assets: List, + texts: List, + location: String, + onClick: (() -> Unit)? = null, + content: @Composable () -> Unit +) { + var expId by remember { mutableStateOf(null) } + + LaunchedEffect(location) { + expId = ContentAnalytics.registerExperience(assets = assets, texts = texts) + expId?.let { ContentAnalytics.trackExperienceView(it, location) } + } + + Box( + modifier = Modifier.clickable { + expId?.let { ContentAnalytics.trackExperienceClick(it, location) } + onClick?.invoke() + } + ) { + content() + } +} + +// Usage +TrackedExperience( + assets = listOf(ContentItem(product.imageUrl, emptyMap())), + texts = listOf(ContentItem(product.name, mapOf("role" to "headline"))), + location = "product.${product.id}" +) { + ProductCardView(product) +} +``` + + + + diff --git a/src/pages/solution/adobe-content-analytics/tabs/index.md b/src/pages/solution/adobe-content-analytics/tabs/index.md index fe4ed66e40..539f2f5deb 100644 --- a/src/pages/solution/adobe-content-analytics/tabs/index.md +++ b/src/pages/solution/adobe-content-analytics/tabs/index.md @@ -16,7 +16,6 @@ implementation(platform("com.adobe.marketing.mobile:sdk-bom:3.+")) // Adobe Mobile SDK dependencies (versions managed by BOM) implementation("com.adobe.marketing.mobile:core") implementation("com.adobe.marketing.mobile:edge") -implementation("com.adobe.marketing.mobile:edgeidentity") // Content Analytics (not yet in BOM - specify version explicitly) implementation("com.adobe.marketing.mobile:contentanalytics:1.0.0") @@ -37,7 +36,6 @@ implementation platform('com.adobe.marketing.mobile:sdk-bom:3.+') // Adobe Mobile SDK dependencies (versions managed by BOM) implementation 'com.adobe.marketing.mobile:core' implementation 'com.adobe.marketing.mobile:edge' -implementation 'com.adobe.marketing.mobile:edgidentity' // Content Analytics (not yet in BOM - specify version explicitly) implementation 'com.adobe.marketing.mobile:contentanalytics:1.0.0" @@ -55,7 +53,7 @@ use_frameworks! target 'YourTargetApp' do pod 'AEPCore', '~> 5.0' - pod 'AEPAnalytics', '~> 5.0' + pod 'AEPEdge', '~> 5.0' pod 'AEPContentAnalytics', '~> 5.0' end ``` From 85ee9828d20ba14db16a91ebb661de63fd684acf Mon Sep 17 00:00:00 2001 From: Rob In der Maur Date: Tue, 3 Mar 2026 09:12:28 +0100 Subject: [PATCH 05/12] Further updates. --- .../advanced-configuration.md | 74 ++++++++++++------- .../adobe-content-analytics/api-reference.md | 22 +++--- .../experience-tracking.md | 55 +++++++------- .../solution/adobe-content-analytics/index.md | 21 ++++-- .../adobe-content-analytics/tabs/index.md | 16 ++++ 5 files changed, 118 insertions(+), 70 deletions(-) diff --git a/src/pages/solution/adobe-content-analytics/advanced-configuration.md b/src/pages/solution/adobe-content-analytics/advanced-configuration.md index a8d8b52b21..a7400a1769 100644 --- a/src/pages/solution/adobe-content-analytics/advanced-configuration.md +++ b/src/pages/solution/adobe-content-analytics/advanced-configuration.md @@ -12,20 +12,25 @@ import InitializeSDK from '/src/pages/resources/initialize.md' ## Configuration Keys -All keys are prepended with `contentanalytics.`. +This section details how to programmatically configure the Content Analytics extension. + +The following config settings are available. These settings can also be managed within the [Adobe Content Analytics extension](/src/pages/solution/adobe-content-analytics/index.md#configure-the-content-analytics-extension). + +| Setting | Type | Default | Description | +|---|---|---|---| +| `configId` | String | N/A | [Custom datastream for Content Analytics events](/src/pages/solution/adobe-content-analytics/index.md#datastreams) (overrides edge.configId) | +| `batchingEnabled` | Boolean | true | [Enable batching](/src/pages/solution/adobe-content-analytics/index.md#batching-settings) | +| `maxBatchSize` | Integer | 10 | [Maximum events per batch](/src/pages/solution/adobe-content-analytics/index.md#batching-settings). | +| `flushInterval` | Integer | 2000 | [Flush interval (in milliseconds)](/src/pages/solution/adobe-content-analytics/index.md#batching-settings) | +| `trackExperiences` | Boolean | true | [Enable experience tracking](/src/pages/solution/adobe-content-analytics/index.md#general-settings). | +| `excludedAssetLocationsRegexp` | String | - | [Asset location regex pattern](/src/pages/solution/adobe-content-analytics/index.md#exclusions). | +| `excludedAssetUrlsRegexp` | String | - | [Asset URL regex pattern](/src/pages/solution/adobe-content-analytics/index.md#exclusions). | +| `excludedExperienceLocationsRegexp` | String | - | [Experience location regex pattern](/src/pages/solution/adobe-content-analytics/index.md#exclusions). | +| `debugLogging` | Boolean | false | [Verbose logging](/src/pages/solution/adobe-content-analytics/index.md#general-settings). | -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| `configId` | String | - | Datastream override | -| `trackExperiences` | Bool | `true` | Enable experience tracking | -| `batchingEnabled` | Bool | `true` | Enable batching | -| `maxBatchSize` | Int | `10` | Events before flush (1-100) | -| `batchFlushInterval` | Double | `2000` | Milliseconds between flushes | -| `excludedAssetUrlsRegexp` | String | - | Exclude assets by URL | -| `excludedAssetLocationsRegexp` | String | - | Exclude assets by location | -| `excludedExperienceLocationsRegexp` | String | - | Exclude experiences by location | +All keys are prepended with `contentanalytics.`. -**Set via Launch UI** or programmatically: +You can configure the extension through the Data Collection Content Analytics extension UI, or programmatically. @@ -40,9 +45,9 @@ iOS ## Datastream -### Separate Datastream +You can stream data from content analytics through a separate datastream. -Route Content Analytics to a different datastream: +To route Content Analytics to a different datastream: ```json { @@ -51,17 +56,16 @@ Route Content Analytics to a different datastream: } ``` -If `contentanalytics.configId` is not set, uses `edge.configId`. +If `contentanalytics.configId` is not set, the default `edge.configId` is used. ---- ## Batching -Flush triggers: +You can use the following flush triggers: -- Batch reaches `maxBatchSize` -- Timer reaches `batchFlushInterval` (ms) -- App backgrounds +- Batch reaches `maxBatchSize`. +- Timer reaches `batchFlushInterval` (ms). +- App backgrounds. ```json { @@ -71,27 +75,33 @@ Flush triggers: } ``` -Disable for immediate sends: +To disable flushes for immediate sends: ```json { "contentanalytics.batchingEnabled": false } ``` - + Batching only affects network delivery. Features like asset attribution, experience tracking, and featurization work the same whether batching is enabled or disabled. ## Filtering +You filter content analytics events through regular expressions. + ### By URL +An example of a regex that filters out URLs. + ```json { "contentanalytics.excludedAssetUrlsRegexp": ".*\\.gif$|.*spinner.*" } ``` ### By Location +An example of a regex that filers our asset and experience locations. + ```json { "contentanalytics.excludedAssetLocationsRegexp": "^(debug|test).*" } { "contentanalytics.excludedExperienceLocationsRegexp": "^admin\\..*" } @@ -101,6 +111,8 @@ Batching only affects network delivery. Features like asset attribution, experie ## Privacy +To manage privacy, use the consent API's. + ### Edge Consent @@ -121,6 +133,8 @@ iOS ### Legacy +The legacy privacy APIs also should work. + Android @@ -131,8 +145,11 @@ iOS + ### Data Deletion +To delete data, use resetIdentities() to reset identities, clear cache and queue. + Android @@ -143,13 +160,12 @@ iOS ---- ## Featurization -Configured automatically. Sends experience content to ML service for feature extraction. +Featurization is configured automatically. Sends experience content to the machine learning service for feature extraction. -Payload sent: +See below for an example of the payload to send. ```json { @@ -163,11 +179,10 @@ Payload sent: } ``` ---- ## Tuning Batch Settings -The default settings (`maxBatchSize: 10`, `batchFlushInterval: 2000` ms) work well for most apps. Adjust based on your event volume: +The default settings (`maxBatchSize: 10`, `batchFlushInterval: 2000` ms) should work well for most apps. Adjust these settings based on your event volume: | Events per Minute | maxBatchSize | batchFlushInterval (ms) | Notes | |-------------------|--------------|-------------------------|-------| @@ -181,6 +196,8 @@ The default settings (`maxBatchSize: 10`, `batchFlushInterval: 2000` ms) work we ## Debugging +Use `setLogLevel()` to set the debugging level. + Android @@ -191,7 +208,8 @@ iOS -Log tags: + +Log entries are tagged. See below for the various tags. - `[ContentAnalytics]` - main - `[ContentAnalytics.Batch]` - batching diff --git a/src/pages/solution/adobe-content-analytics/api-reference.md b/src/pages/solution/adobe-content-analytics/api-reference.md index acf066bb16..8a2b3f4072 100644 --- a/src/pages/solution/adobe-content-analytics/api-reference.md +++ b/src/pages/solution/adobe-content-analytics/api-reference.md @@ -11,6 +11,8 @@ import Tabs from './tabs/api-reference.md' # Adobe Content Analytics API reference +This section details the publicly available API's for Content Analytics. + ## registerExperience Registers an experience and returns an ID to track the experience. @@ -158,16 +160,16 @@ iOS ## Configuration -The following config settings are available. These settings can also be managed within the [Adobe Content Analytics extension](index.md#configure-the-content-analytics-extension). +The following config settings are available. These settings can also be managed within the [Adobe Content Analytics extension](/src/pages/solution/adobe-content-analytics/index.md#configure-the-content-analytics-extension). | Setting | Type | Default | Description | |---|---|---|---| -| `configId` | String | N/A | [Custom datastream for Content Analytics events](index.md#datastreams) (overrides edge.configId) | -| `batchingEnabled` | Boolean | true | [Enable batching](index.md#batching-settings) | -| `maxBatchSize` | Integer | 10 | [Maximum events per batch](index.md#batching-settings). | -| `flushInterval` | Integer | 2000 | [Flush interval (in milliseconds)](index.md#batching-settings) | -| `trackExperiences` | Boolean | true | [Enable experience tracking](index.md#general-settings). | -| `excludedAssetLocationsRegexp` | String | - | [Asset location regex pattern](index.md#exclusions). | -| `excludedAssetUrlsRegexp` | String | - | [Asset URL regex pattern](index.md#exclusions). | -| `excludedExperienceLocationsRegexp` | String | - | [Experience location regex pattern](index.md#exclusions). | -| `debugLogging` | Boolean | false | [Verbose logging](index.md#general-settings). | +| `configId` | String | N/A | [Custom datastream for Content Analytics events](/src/pages/solution/adobe-content-analytics/index.md#datastreams) (overrides edge.configId) | +| `batchingEnabled` | Boolean | true | [Enable batching](/src/pages/solution/adobe-content-analytics/index.md#batching-settings) | +| `maxBatchSize` | Integer | 10 | [Maximum events per batch](/src/pages/solution/adobe-content-analytics/index.md#batching-settings). | +| `flushInterval` | Integer | 2000 | [Flush interval (in milliseconds)](/src/pages/solution/adobe-content-analytics/index.md#batching-settings) | +| `trackExperiences` | Boolean | true | [Enable experience tracking](/src/pages/solution/adobe-content-analytics/index.md#general-settings). | +| `excludedAssetLocationsRegexp` | String | - | [Asset location regex pattern](/src/pages/solution/adobe-content-analytics/index.md#exclusions). | +| `excludedAssetUrlsRegexp` | String | - | [Asset URL regex pattern](/src/pages/solution/adobe-content-analytics/index.md#exclusions). | +| `excludedExperienceLocationsRegexp` | String | - | [Experience location regex pattern](/src/pages/solution/adobe-content-analytics/index.md#exclusions). | +| `debugLogging` | Boolean | false | [Verbose logging](/src/pages/solution/adobe-content-analytics/index.md#general-settings). | diff --git a/src/pages/solution/adobe-content-analytics/experience-tracking.md b/src/pages/solution/adobe-content-analytics/experience-tracking.md index 342ce1acfc..96b6c5e9b0 100644 --- a/src/pages/solution/adobe-content-analytics/experience-tracking.md +++ b/src/pages/solution/adobe-content-analytics/experience-tracking.md @@ -57,7 +57,7 @@ iOS ### Track interactions -Then trackthe experience. +Then track the experience. @@ -107,7 +107,7 @@ For most apps, 100 definitions is sufficient. If you're registering more unique ## Implementation patterns -Some below examples of implementation patterns. +See below for examples of implementation patterns. ### Single screen @@ -123,9 +123,9 @@ iOS -### Collection / Feed +### Collection or feed -Implementation of experience tracking for collection or feed. +Implementation of experience tracking fora collection or a feed. @@ -227,11 +227,11 @@ iOS -When the analytics backend receives `trackAssetView` for `hero.jpg`, it can attribute that view to the "Summer Sale" experience because the asset URL was registered. +When the analytics backend receives `trackAssetView` for `hero.jpg`, the backend attributes that view to the `Summer Sale` experience because the asset URL was registered. ### Without attribution -If you track an asset without registering the experience first, like below. +You can track an asset without registering the experience first. @@ -243,7 +243,7 @@ iOS -The asset view is still recorded, but it's not linked to any experience. You lose: +The asset view is still recorded, but the asset view is not linked to any experience. As a result, you lose: * Which experience contained this asset. * Performance metrics per experience. @@ -255,7 +255,7 @@ The `experienceLocation` and `assetLocation` parameters control how metrics are ### With location - Metrics per placement -Track same experience at different locations. +Track the same experience at different locations. @@ -267,19 +267,19 @@ iOS -Customer Journey Analytics report will look like: +A sample Customer Journey Analytics report for this scenario will look like: | Experience | Location | Views | Clicks | CTR | |---|---|--:|--:|--:| -| Summer Sale | `homepage.hero` | 10,000 | 500 | 5% | -| Summer Sale | `product.sidebar` | 3,000 | 90 | 3% | -| Summer Sale | `checkout.upsell` | 1,000 | 150 | 15% | +| Summer Sale | `homepage.`
`hero` | 10,000 | 500 | 5% | +| Summer Sale | `product.`
`sidebar` | 3,000 | 90 | 3% | +| Summer Sale | `checkout.`
`upsell` | 1,000 | 150 | 15% | -This lets you answer: *"Where does this experience perform best?"* +You can use this report to answer questions like *"Where does this experience perform best?"* ### Without location - global metrics -Track without location to get aggregate metrics. +Track experiences without location details to get aggregate metrics. @@ -291,12 +291,14 @@ iOS -Customer Journey Analytics report will look like: +A sample Customer Journey Analytics report for this scenario will look like: | Experience | Views | Clicks | CTR | |---|---|--:|--:| | Summer Sale | 14,000 | 740 | 5.3% | +You can use this report to answer questions like *How is this experience performing overall?* + ### Same asset - different locations Track the same asset on different locations. @@ -316,12 +318,13 @@ Customer Journey Analytics report will look like: | Experience | Location | Views | Clicks | |---|---|--:|--:| | Summer Sale | `homepage` | 50,000 | 2,500 | -| Summer Sale | `category.electronics` | 8,000 | 320 | -| Summer Sale | `search.results` | 3,000 | 45 | +| Summer Sale | `category.`
`electronics` | 8,000 | 320 | +| Summer Sale | `search.`
`results` | 3,000 | 45 | + ## Location naming convention -Use a consistent hierarchy for easier filtering in Customer Journey Analytics +Use a consistent location naming hierarchy to filter on locations easily in Customer Journey Analytics. ```text screen.section.subsection @@ -335,7 +338,9 @@ Examples are: * `cart.upsell` * `search.results.sponsored` -When to use a location: +### When to use a location + +See the following goals and whether you should consider to use locations or not. | Goal | Location | @@ -348,7 +353,7 @@ When to use a location: ## Machine learning powered analytics -When you register experiences, the featurization service analyzes the content and extracts ML attributes like persuasion strategy, emotional tone, content category, etc. These attributes are then available in Customer Journey Analytics for advanced analysis. +When you register experiences, the featurization service analyzes the content and extracts machine learning (ML) attributes like persuasion strategy, emotional tone, content category, and more. These attributes are then available in Customer Journey Analytics for advanced analysis. ### Performance by persuasion strategy @@ -358,11 +363,11 @@ Customer Journey Analytics report - persuasion strategy by location: | Location | Persuasion strategy | Views | Click | CTR | |---|---|--:|--:|--:| -| `homepage.hero` | Urgency | 10,000 | 800 | 8% | -| `homepage.hero` | Social Proof | 10,000 | 650 | 6.5% | -| `homepage.hero` | Scarcity | 10,000 | 720 | 7.2% | -| `checkout.upsell` | Urgency | 2,000 | 300 | 15% | -| `checkout.upsell` | Social Proof | 2,000 | 180 | 9% | +| `homepage.`
`hero` | Urgency | 10,000 | 800 | 8% | +| `homepage.`
`hero` | Social Proof | 10,000 | 650 | 6.5% | +| `homepage.`
`hero` | Scarcity | 10,000 | 720 | 7.2% | +| `checkout.`
`upsell` | Urgency | 2,000 | 300 | 15% | +| `checkout.`
`upsell` | Social Proof | 2,000 | 180 | 9% | Insight: **Urgency** messaging performs best at checkout (+15% CTR), while **Social Proof** works better on homepage. diff --git a/src/pages/solution/adobe-content-analytics/index.md b/src/pages/solution/adobe-content-analytics/index.md index 573f674581..e61f0f3392 100644 --- a/src/pages/solution/adobe-content-analytics/index.md +++ b/src/pages/solution/adobe-content-analytics/index.md @@ -14,25 +14,25 @@ import InitializeSDK from '/src/pages/resources/initialize.md' 1. In the Data Collection UI, select the **Extensions** tab. 1. On the **Catalog** tab, locate the **Adobe Content Analytics** extension, and select **Install**. -1. Configure the extension settings. For more information, see [Configure Media Analytics Extension](#configure-media-analytics-extension). +1. Configure the extension settings. For more information, see [Configure the Content Analytics extension](#configure-the-content-analytics-extension). 1. Select **Save**. 1. Follow the publishing process to update your SDK configuration. ## Configure the Content Analytics extension -![Content Analytics Extension Configuration](./assets/index/configuration.png) - To configue the Content Analytics extension, complete the following steps: +![Content Analytics Extension Configuration](./assets/index/configuration.png) + ### Sandbox -Select a Sandbox to use for Content Analytics. +Select a **Sandbox** to use for Content Analytics. ### Datastreams -Select the datastream to use for Content Analytics for the Production (required), Staging, and Development environment. +Select the **Datastream** to use for Content Analytics for the **Production** (required), **Staging**, and **Development** environment. ### General Settings @@ -62,11 +62,13 @@ Specify exclusions for asset URLs, assets locations, and experience locations. ## Add Content Analytics extension to your app +To add the Content Analytics extension to your app, follow the steps below based on the platform and package manager you use. + ### Include Content Analytics extension as an app depencency. Add MobileCore, Edge, EdgeIdentity, and Content Analytics as dependencies to your project. - + Kotlin
(Android) @@ -76,6 +78,11 @@ Groovy
(Android) +SPM
(iOS) + + + CocoaPods
(iOS) - \ No newline at end of file + + diff --git a/src/pages/solution/adobe-content-analytics/tabs/index.md b/src/pages/solution/adobe-content-analytics/tabs/index.md index 539f2f5deb..8b9100c8ba 100644 --- a/src/pages/solution/adobe-content-analytics/tabs/index.md +++ b/src/pages/solution/adobe-content-analytics/tabs/index.md @@ -57,3 +57,19 @@ target 'YourTargetApp' do pod 'AEPContentAnalytics', '~> 5.0' end ``` + + + +Add the required dependencies to your project using Swift Package Manager. For Content Analytics, use the following instructions. + +1. In Xcode, select **File** > **Add Package Dependencies**. + +1. Enter the package URL: + + ```text + https://github.com/adobe/aca-mobile-sdk-ios-extension + ``` + +1. Select version `5.0.0` or later. + +1. Select **Add Package**. From b6101cda2cc6449c4cb59ba5e984088ee9ed35a8 Mon Sep 17 00:00:00 2001 From: Rob In der Maur Date: Tue, 3 Mar 2026 09:39:05 +0100 Subject: [PATCH 06/12] Lint error fixes --- .../advanced-configuration.md | 16 ++--- .../adobe-content-analytics/crash-recovery.md | 70 +++++++++---------- .../experience-tracking.md | 20 +----- .../tabs/advanced-configuration.md | 1 - .../tabs/experience-tracking.md | 23 ------ .../adobe-content-analytics/tabs/index.md | 2 - 6 files changed, 40 insertions(+), 92 deletions(-) diff --git a/src/pages/solution/adobe-content-analytics/advanced-configuration.md b/src/pages/solution/adobe-content-analytics/advanced-configuration.md index a7400a1769..356e6da214 100644 --- a/src/pages/solution/adobe-content-analytics/advanced-configuration.md +++ b/src/pages/solution/adobe-content-analytics/advanced-configuration.md @@ -42,7 +42,6 @@ iOS - ## Datastream You can stream data from content analytics through a separate datastream. @@ -58,14 +57,13 @@ To route Content Analytics to a different datastream: If `contentanalytics.configId` is not set, the default `edge.configId` is used. - ## Batching You can use the following flush triggers: -- Batch reaches `maxBatchSize`. -- Timer reaches `batchFlushInterval` (ms). -- App backgrounds. +* Batch reaches `maxBatchSize`. +* Timer reaches `batchFlushInterval` (ms). +* App backgrounds. ```json { @@ -107,8 +105,6 @@ An example of a regex that filers our asset and experience locations. { "contentanalytics.excludedExperienceLocationsRegexp": "^admin\\..*" } ``` ---- - ## Privacy To manage privacy, use the consent API's. @@ -211,6 +207,6 @@ iOS Log entries are tagged. See below for the various tags. -- `[ContentAnalytics]` - main -- `[ContentAnalytics.Batch]` - batching -- `[ContentAnalytics.Featurization]` - ML service +* `[ContentAnalytics]` - main +* `[ContentAnalytics.Batch]` - batching +* `[ContentAnalytics.Featurization]` - ML service diff --git a/src/pages/solution/adobe-content-analytics/crash-recovery.md b/src/pages/solution/adobe-content-analytics/crash-recovery.md index cfc0d5f151..3017a27b2a 100644 --- a/src/pages/solution/adobe-content-analytics/crash-recovery.md +++ b/src/pages/solution/adobe-content-analytics/crash-recovery.md @@ -36,11 +36,11 @@ User tracks event **Responsibilities:** -- Manages batching logic (count threshold + time-based flush) -- Writes incoming events to disk immediately via `PersistentHitQueue` -- Maintains in-memory event counters -- Triggers flush when threshold reached (10 events or 5 seconds) -- Coordinates between `DirectHitProcessor` and `ContentAnalyticsOrchestrator` +* Manages batching logic (count threshold + time-based flush) +* Writes incoming events to disk immediately via `PersistentHitQueue` +* Maintains in-memory event counters +* Triggers flush when threshold reached (10 events or 5 seconds) +* Coordinates between `DirectHitProcessor` and `ContentAnalyticsOrchestrator` **Key Methods:** @@ -58,9 +58,9 @@ iOS **Responsibilities:** -- Implements `HitProcessing` protocol for `PersistentHitQueue` integration -- Accumulates events in memory for fast batching -- On recovery: loads events from disk into memory, then clears disk (no data loss) +* Implements `HitProcessing` protocol for `PersistentHitQueue` integration +* Accumulates events in memory for fast batching +* On recovery: loads events from disk into memory, then clears disk (no data loss) **Event Lifecycle:** @@ -78,20 +78,20 @@ iOS **Provides:** -- Two separate queues: `asset.events` and `experience.events` -- SQLite-backed persistence (survives crashes, force-quit, background termination) -- Automatic processing via `beginProcessing()` -- Thread-safe operations +* Two separate queues: `asset.events` and `experience.events` +* SQLite-backed persistence (survives crashes, force-quit, background termination) +* Automatic processing via `beginProcessing()` +* Thread-safe operations **Storage:** -- Events encoded as JSON via `Event: Codable` -- Each event wrapped with type metadata (`asset` or `experience`) -- Unique identifier: `event.id.uuidString` +* Events encoded as JSON via `Event: Codable` +* Each event wrapped with type metadata (`asset` or `experience`) +* Unique identifier: `event.id.uuidString` ## Detailed Timeline Example -``` +```text Time │ Event │ Memory │ Disk │ Safe? ───────┼──────────────────────────────────────┼────────┼──────┼─────── 00.00s │ User views Asset A │ ✓ │ ✓ │ ✅ YES @@ -116,7 +116,7 @@ Events stay on disk during the entire batching window. Once we hand off to Edge, ### Scenario 1: Crash During Batching (0-5s window) -``` +```text Status: Events in memory + disk Crash: ⚡ App terminated └─> Memory lost ✗ @@ -148,7 +148,7 @@ Result: ✅ ZERO DATA LOSS (possible duplicate if crash after Edge dispatch) ### Scenario 3: Crash After Edge Dispatch -``` +```text Status: Events dispatched to Edge Crash: ⚡ App terminated └─> Disk already cleared during processHit() @@ -161,7 +161,7 @@ Result: ✅ ZERO DATA LOSS - Edge guarantees delivery Once we dispatch to Edge extension: -``` +```text ContentAnalytics → runtime.dispatch(event) → Event Hub → Edge Extension └─> Edge.PersistentHitQueue └─> Network retries @@ -186,7 +186,7 @@ iOS -This avoids state sync issues - we just count events on flush. If the app crashes, the restored events give us the same metrics. +This avoids state sync issues * we just count events on flush. If the app crashes, the restored events give us the same metrics. ## Configuration @@ -200,9 +200,9 @@ This avoids state sync issues - we just count events on flush. If the app crashe **Parameters:** -- `maxBatchSize`: Event count threshold (default: 10) -- `batchFlushInterval`: Timer interval for periodic flush in milliseconds (default: 2000 ms = 2s). Max wait time is derived from this (2.5× = 5000 ms). -- `batchingEnabled`: Set to `false` for immediate dispatch (no batching) +* `maxBatchSize`: Event count threshold (default: 10) +* `batchFlushInterval`: Timer interval for periodic flush in milliseconds (default: 2000 ms = 2s). Max wait time is derived from this (2.5× = 5000 ms). +* `batchingEnabled`: Set to `false` for immediate dispatch (no batching) ## Performance Characteristics @@ -228,7 +228,6 @@ Android - ## Testing Crash Recovery ### Test 1: Crash During Batching @@ -241,10 +240,8 @@ Android 6. Wait 2 seconds for flush 7. Verify: 1 Edge event with 10 aggregated interactions - ### Test 2: Crash During Flush - 1. Track 10 asset events (triggers immediate flush) 2. Set breakpoint in `sendToEdge()` 3. Force-quit app at breakpoint @@ -264,20 +261,20 @@ Android ### Key Files -- `BatchCoordinator.swift` - Batching logic and persistence coordination -- `DirectHitProcessor.swift` - Crash recovery and event accumulation -- `ContentAnalyticsOrchestrator.swift` - Metrics calculation and Edge dispatch -- `PersistentHitQueue` (AEPServices) - SQLite-backed queue +* `BatchCoordinator.swift` - Batching logic and persistence coordination +* `DirectHitProcessor.swift` - Crash recovery and event accumulation +* `ContentAnalyticsOrchestrator.swift` - Metrics calculation and Edge dispatch +* `PersistentHitQueue` (AEPServices) - SQLite-backed queue ### Thread Safety -- All operations use serial dispatch queues -- `batchQueue` (BatchCoordinator) - batch operations -- `queue` (DirectHitProcessor) - hit processing +* All operations use serial dispatch queues +* `batchQueue` (BatchCoordinator) - batch operations +* `queue` (DirectHitProcessor) - hit processing ### Data Flow -``` +```text Event tracked └─> BatchCoordinator.addAssetEvent() ├─> DirectHitProcessor.accumulateEvent() [memory] @@ -293,7 +290,7 @@ Event tracked The SDK uses a callback chain to decouple components while maintaining type safety: -``` +```text ┌─────────────────────────────────────────────────────────────────────────────┐ │ INITIALIZATION PHASE │ ├─────────────────────────────────────────────────────────────────────────────┤ @@ -369,7 +366,7 @@ Log.setLogLevel(.trace) Look for: -``` +```text [BATCH_PROCESSOR] Accumulated ASSET event | ID: [BATCH_PROCESSOR] Recovered event from disk | Type: asset | ID: [BATCH_PROCESSOR] Processing 5 asset events @@ -392,4 +389,3 @@ Content Analytics batches events for 0-5 seconds before dispatch. Without disk p 1. **No dispatch confirmation:** Extensions cannot receive callbacks from Edge to confirm receipt 2. **Possible duplicates:** Crash during Edge dispatch may cause duplicate events (Edge deduplication handles this) 3. **Memory overhead:** Events held in memory + disk during batching (minimal: ~40KB) - diff --git a/src/pages/solution/adobe-content-analytics/experience-tracking.md b/src/pages/solution/adobe-content-analytics/experience-tracking.md index 96b6c5e9b0..c3485c002e 100644 --- a/src/pages/solution/adobe-content-analytics/experience-tracking.md +++ b/src/pages/solution/adobe-content-analytics/experience-tracking.md @@ -8,7 +8,6 @@ keywords: import Tabs from './tabs/experience-tracking.md' import InitializeSDK from '/src/pages/resources/initialize.md' - # Experience tracking Experience tracking measures how users interact with complete experiences (combinations of images, text, and CTAs) in your app. @@ -27,7 +26,6 @@ iOS - ## Registration required You must register an experience definition before tracking views or clicks. If you don't: @@ -54,7 +52,6 @@ iOS - ### Track interactions Then track the experience. @@ -69,7 +66,6 @@ iOS - ## Session lifecycle Experience definitions are cached in memory for the duration of the app session. After app restart or crash, you'll need to re-register experiences before tracking. @@ -104,7 +100,6 @@ The benefits are: For most apps, 100 definitions is sufficient. If you're registering more unique experiences per session, consider reusing experience IDs where content is identical (same content = same ID). - ## Implementation patterns See below for examples of implementation patterns. @@ -137,7 +132,6 @@ iOS - ### Experience ID generation Experience IDs are deterministic - the same content always produces the same ID. The algorithm: @@ -176,12 +170,10 @@ iOS - ## Missing registration warning If you track without registering, you will see this warning. - Experience definition not found for 'exp-123'. Call `registerExperience()` before tracking views/clicks. @@ -204,7 +196,6 @@ iOS - ## Asset attribution When you register an experience with assets, the SDK links those asset URLs to the experience. This enables asset attribution: connecting standalone asset tracking events to their parent experience. @@ -321,7 +312,6 @@ Customer Journey Analytics report will look like: | Summer Sale | `category.`
`electronics` | 8,000 | 320 | | Summer Sale | `search.`
`results` | 3,000 | 45 | - ## Location naming convention Use a consistent location naming hierarchy to filter on locations easily in Customer Journey Analytics. @@ -342,7 +332,6 @@ Examples are: See the following goals and whether you should consider to use locations or not. - | Goal | Location | |---|---| | Compare same content across placements | ✅ Set location | @@ -350,7 +339,6 @@ See the following goals and whether you should consider to use locations or not. | Track overall content performance | ❌ Omit location | | Simple asset tracking (no placement analysis) | ❌ Omit location | - ## Machine learning powered analytics When you register experiences, the featurization service analyzes the content and extracts machine learning (ML) attributes like persuasion strategy, emotional tone, content category, and more. These attributes are then available in Customer Journey Analytics for advanced analysis. @@ -403,7 +391,6 @@ iOS In Customer Journey Analytics, you can then filter or group by persuasion strategy to see what messaging resonates in each location. - ## Custom metrics with `additionalData` The `additionalData` parameter lets you attach custom metrics to tracking events. These appear in Customer Journey Analytics as additional dimensions or metrics. @@ -477,7 +464,6 @@ For example average load time by asset location. Insight: Gallery images load slower but get 8x more viewing time. - ## Debugging with Assurance Adobe Assurance (Project Griffon) lets you inspect tracking events in real-time. Connect your app to an Assurance session to see exactly what payloads are being sent. @@ -502,7 +488,7 @@ iOS When you call trackAssetView() or trackAssetClick(), you'll see: - ``` + ```json Event: Track Asset Type: com.adobe.eventType.contentAnalytics Source: com.adobe.eventSource.requestContent @@ -580,7 +566,6 @@ iOS } ``` - ### Debugging checklist | What to Check | Where in Assurance | @@ -591,7 +576,6 @@ iOS | Edge delivery | Look for Edge Request after batch flush. | | Consent status | Check Edge Consent events. | - ### Common Issues in Assurance No events appearing: @@ -609,7 +593,6 @@ Missing experienceId in track events: * Ensure registerExperience() was called first * Check the returned ID is being passed to track methods - ## Testing To test your implementation, enable verbose logging. @@ -673,7 +656,6 @@ iOS - ### Product Grid To implement a product grid, see below for an example. diff --git a/src/pages/solution/adobe-content-analytics/tabs/advanced-configuration.md b/src/pages/solution/adobe-content-analytics/tabs/advanced-configuration.md index 4c24c378af..5cae02183b 100644 --- a/src/pages/solution/adobe-content-analytics/tabs/advanced-configuration.md +++ b/src/pages/solution/adobe-content-analytics/tabs/advanced-configuration.md @@ -87,4 +87,3 @@ MobileCore.setLogLevel(LoggingMode.VERBOSE) ```swift MobileCore.setLogLevel(.debug) ``` - diff --git a/src/pages/solution/adobe-content-analytics/tabs/experience-tracking.md b/src/pages/solution/adobe-content-analytics/tabs/experience-tracking.md index 36c38fe177..929b58e904 100644 --- a/src/pages/solution/adobe-content-analytics/tabs/experience-tracking.md +++ b/src/pages/solution/adobe-content-analytics/tabs/experience-tracking.md @@ -57,7 +57,6 @@ let experienceId = ContentAnalytics.registerExperience( ) ``` - ```java @@ -115,7 +114,6 @@ val expId = ContentAnalytics.registerExperience( ContentAnalytics.trackExperienceView(expId, "home") ``` - ```swift @@ -185,7 +183,6 @@ class ProductDetailActivity : AppCompatActivity() { } ``` - ```swift @@ -234,7 +231,6 @@ class FeedFragment : Fragment() { } ``` - ```swift @@ -261,7 +257,6 @@ fun computeExperienceId(texts: List, assets: List, ctas: List ```swift @@ -340,8 +335,6 @@ ContentAnalytics.trackAssetView(assetURL: "https://example.com/hero.jpg") ContentAnalytics.trackAssetView("https://example.com/hero.jpg") ``` - - ```swift @@ -360,9 +353,6 @@ ContentAnalytics.trackExperienceView(expId, "product.sidebar") ContentAnalytics.trackExperienceView(expId, "checkout.upsell") ``` - - - ```swift @@ -431,7 +421,6 @@ val expId = ContentAnalytics.registerExperience( ContentAnalytics.trackExperienceView(expId, "product.detail") ``` - ```swift @@ -470,7 +459,6 @@ ContentAnalytics.trackAssetView( ) ``` - ```swift @@ -526,7 +514,6 @@ class ImageFragment : Fragment() { } ``` - ```swift @@ -599,7 +586,6 @@ fun ProductCard(product: Product) { } ``` - ```swift @@ -679,7 +665,6 @@ class CarouselView: UIView { } ``` - ```java @@ -712,7 +697,6 @@ class CarouselAdapter : RecyclerView.Adapter() { } ``` - ```swift @@ -749,7 +733,6 @@ struct ProductCard: View { } ``` - ```java @@ -784,7 +767,6 @@ fun ProductCard(product: Product) { } ``` - ```swift @@ -836,7 +818,6 @@ TrackedExperience( } ``` - ```java @@ -874,7 +855,3 @@ TrackedExperience( ProductCardView(product) } ``` - - - - diff --git a/src/pages/solution/adobe-content-analytics/tabs/index.md b/src/pages/solution/adobe-content-analytics/tabs/index.md index 8b9100c8ba..3d0ff7d1a3 100644 --- a/src/pages/solution/adobe-content-analytics/tabs/index.md +++ b/src/pages/solution/adobe-content-analytics/tabs/index.md @@ -4,7 +4,6 @@ noIndex: true import Alerts from '/src/pages/resources/alerts.md' - Add the required dependencies to your project by including them in the app's Gradle file. @@ -23,7 +22,6 @@ implementation("com.adobe.marketing.mobile:contentanalytics:1.0.0") - Add the required dependencies to your project by including them in the app's Gradle file. From dc0575ea3f913b8985a35df77390936c6e52dc9d Mon Sep 17 00:00:00 2001 From: Rob In der Maur Date: Tue, 3 Mar 2026 09:53:46 +0100 Subject: [PATCH 07/12] Fix lint errors --- .../AEP Mobile SDK.code-workspace | 14 -------------- .../advanced-configuration.md | 6 ------ .../adobe-content-analytics/api-reference.md | 7 ------- .../adobe-content-analytics/crash-recovery.md | 2 +- .../adobe-content-analytics/experience-tracking.md | 3 +-- .../solution/adobe-content-analytics/index.md | 6 ------ .../adobe-content-analytics/tabs/api-reference.md | 5 ----- .../adobe-content-analytics/tabs/crash-recovery.md | 5 +---- 8 files changed, 3 insertions(+), 45 deletions(-) delete mode 100644 src/pages/solution/adobe-content-analytics/AEP Mobile SDK.code-workspace diff --git a/src/pages/solution/adobe-content-analytics/AEP Mobile SDK.code-workspace b/src/pages/solution/adobe-content-analytics/AEP Mobile SDK.code-workspace deleted file mode 100644 index 3b2c79a35c..0000000000 --- a/src/pages/solution/adobe-content-analytics/AEP Mobile SDK.code-workspace +++ /dev/null @@ -1,14 +0,0 @@ -{ - "folders": [ - { - "path": "../../../.." - }, - { - "path": "../../../../../../Development/work/aca-mobile-sdk/aca-mobile-sdk-ios-extension" - }, - { - "path": "../../../../../../Development/work/aca-mobile-sdk/aca-mobile-sdk-android-extension" - } - ], - "settings": {} -} \ No newline at end of file diff --git a/src/pages/solution/adobe-content-analytics/advanced-configuration.md b/src/pages/solution/adobe-content-analytics/advanced-configuration.md index 356e6da214..227351f51d 100644 --- a/src/pages/solution/adobe-content-analytics/advanced-configuration.md +++ b/src/pages/solution/adobe-content-analytics/advanced-configuration.md @@ -141,7 +141,6 @@ iOS - ### Data Deletion To delete data, use resetIdentities() to reset identities, clear cache and queue. @@ -156,7 +155,6 @@ iOS - ## Featurization Featurization is configured automatically. Sends experience content to the machine learning service for feature extraction. @@ -175,7 +173,6 @@ See below for an example of the payload to send. } ``` - ## Tuning Batch Settings The default settings (`maxBatchSize: 10`, `batchFlushInterval: 2000` ms) should work well for most apps. Adjust these settings based on your event volume: @@ -188,8 +185,6 @@ The default settings (`maxBatchSize: 10`, `batchFlushInterval: 2000` ms) should **Trade-off:** Larger batches reduce network overhead but increase latency before data appears in reporting. ---- - ## Debugging Use `setLogLevel()` to set the debugging level. @@ -204,7 +199,6 @@ iOS - Log entries are tagged. See below for the various tags. * `[ContentAnalytics]` - main diff --git a/src/pages/solution/adobe-content-analytics/api-reference.md b/src/pages/solution/adobe-content-analytics/api-reference.md index 8a2b3f4072..dafa1465c8 100644 --- a/src/pages/solution/adobe-content-analytics/api-reference.md +++ b/src/pages/solution/adobe-content-analytics/api-reference.md @@ -27,7 +27,6 @@ iOS - ## trackAsset Track an assets with an explicit defined interaction type. @@ -42,7 +41,6 @@ iOS - ## trackAssetClick Convenience method for tracking asset clicks. @@ -57,7 +55,6 @@ iOS - ## trackAssetCollection Tracks multiple assets with the same interaction type. @@ -87,8 +84,6 @@ iOS - - ## trackExperienceClick Track when an experience is clicked. @@ -107,7 +102,6 @@ iOS - ## trackExperienceView Track when an experience is viewed. @@ -157,7 +151,6 @@ iOS - ## Configuration The following config settings are available. These settings can also be managed within the [Adobe Content Analytics extension](/src/pages/solution/adobe-content-analytics/index.md#configure-the-content-analytics-extension). diff --git a/src/pages/solution/adobe-content-analytics/crash-recovery.md b/src/pages/solution/adobe-content-analytics/crash-recovery.md index 3017a27b2a..edabb5689f 100644 --- a/src/pages/solution/adobe-content-analytics/crash-recovery.md +++ b/src/pages/solution/adobe-content-analytics/crash-recovery.md @@ -133,7 +133,7 @@ Result: ✅ ZERO DATA LOSS ### Scenario 2: Crash During Flush -``` +```text Status: Events being processed Crash: ⚡ App terminated mid-dispatch └─> Memory lost ✗ diff --git a/src/pages/solution/adobe-content-analytics/experience-tracking.md b/src/pages/solution/adobe-content-analytics/experience-tracking.md index c3485c002e..8ab7894502 100644 --- a/src/pages/solution/adobe-content-analytics/experience-tracking.md +++ b/src/pages/solution/adobe-content-analytics/experience-tracking.md @@ -423,7 +423,6 @@ iOS - ### Experience engagement metrics To get experience engagement metrics, see this example. @@ -625,7 +624,7 @@ Test cross-session: register, force quit, relaunch, track same ID. No warning sh * **Experience definition not found** warning: Register the experience before tracking it. * Assets not attributed. Same issue - register with `assetURLs` before tracking. * Duplicate registrations: Check if already registered before calling `registerExperience()`: - + Android diff --git a/src/pages/solution/adobe-content-analytics/index.md b/src/pages/solution/adobe-content-analytics/index.md index e61f0f3392..72a3adc81a 100644 --- a/src/pages/solution/adobe-content-analytics/index.md +++ b/src/pages/solution/adobe-content-analytics/index.md @@ -18,7 +18,6 @@ import InitializeSDK from '/src/pages/resources/initialize.md' 1. Select **Save**. 1. Follow the publishing process to update your SDK configuration. - ## Configure the Content Analytics extension To configue the Content Analytics extension, complete the following steps: @@ -29,19 +28,16 @@ To configue the Content Analytics extension, complete the following steps: Select a **Sandbox** to use for Content Analytics. - ### Datastreams Select the **Datastream** to use for Content Analytics for the **Production** (required), **Staging**, and **Development** environment. - ### General Settings Enable or disable **Track Experiences** to track experiences in Content Analytics or not. Default is enabled (true). Select **Enable Debug Logging** to enable verbose debug logging for Content Analytics. Default is disabled (false). - ### Batching Settings Select **Enable Batching** to enable batching for Content Analytics. @@ -50,7 +46,6 @@ Enter a value in **Max Batch Size** to define the maximum batch size. Default is Enter a value in **Batch Flush Interval (ms)** to define a time in miliseconds to wait before flusing batched events. Default is `2000` (2 seconds). - ### Exclusions Specify exclusions for asset URLs, assets locations, and experience locations. @@ -59,7 +54,6 @@ Specify exclusions for asset URLs, assets locations, and experience locations. * Enter an **Asset Location Pattern** to specify a regular expression to filter which asset locations should be excluded when collecting data for Content Analytics. For example: `^(debug|test).*` to exclude asset location that contain `debug` or `test`.
Use **Test Regex** to open the **Regular Expression Tester** where you can validate your regular expression. * Enter an **Experience Location Pattern** to specify a regular expression to filter which experience locations should be excluded when collecting data for Content Analytics. For example: `^test\\..*|^dev\\..*` to exclude any experience location that contains `test.` or `dev.`
Use **Test Regex** to open the **Regular Expression Tester** where you can validate your regular expression. - ## Add Content Analytics extension to your app To add the Content Analytics extension to your app, follow the steps below based on the platform and package manager you use. diff --git a/src/pages/solution/adobe-content-analytics/tabs/api-reference.md b/src/pages/solution/adobe-content-analytics/tabs/api-reference.md index e82e9092f5..5f545a8a38 100644 --- a/src/pages/solution/adobe-content-analytics/tabs/api-reference.md +++ b/src/pages/solution/adobe-content-analytics/tabs/api-reference.md @@ -191,7 +191,6 @@ ContentAnalytics.trackAsset( static void trackAssetClick(String assetURL) static void trackAssetClick(String assetURL, String assetLocation) static void trackAssetClick(String assetURL, String assetLocation, Map additionalData) - ``` **Example** @@ -358,9 +357,6 @@ ContentAnalytics.trackAssetCollection( assetLocation:@"home"]; ``` - - - #### Java @@ -571,7 +567,6 @@ ContentAnalytics.trackExperienceView( additionalData:@{@"viewDuration": @5.2}]; ``` - #### Java diff --git a/src/pages/solution/adobe-content-analytics/tabs/crash-recovery.md b/src/pages/solution/adobe-content-analytics/tabs/crash-recovery.md index a41fb5eedb..cb66677599 100644 --- a/src/pages/solution/adobe-content-analytics/tabs/crash-recovery.md +++ b/src/pages/solution/adobe-content-analytics/tabs/crash-recovery.md @@ -32,7 +32,6 @@ func performFlush() └─> Edge guarantees delivery from here ``` - ```java @@ -51,7 +50,6 @@ func processHit(entity: DataEntity, completion: (Bool) -> Void) └─> completion(true) → clear from disk (event now in memory) ``` - ```java @@ -99,5 +97,4 @@ private val stateMutex = kotlinx.coroutines.sync.Mutex() private val mutex = Mutex() // All state mutations wrapped in mutex.withLock { } -``` - +``` \ No newline at end of file From a69d0d04fb022212ae73e26f1832cf8db56a2082 Mon Sep 17 00:00:00 2001 From: Rob In der Maur Date: Tue, 3 Mar 2026 10:03:37 +0100 Subject: [PATCH 08/12] More lint errors --- src/pages/solution/adobe-content-analytics/tabs/index.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/pages/solution/adobe-content-analytics/tabs/index.md b/src/pages/solution/adobe-content-analytics/tabs/index.md index 3d0ff7d1a3..47190329af 100644 --- a/src/pages/solution/adobe-content-analytics/tabs/index.md +++ b/src/pages/solution/adobe-content-analytics/tabs/index.md @@ -41,7 +41,6 @@ implementation 'com.adobe.marketing.mobile:contentanalytics:1.0.0" - Add the required dependencies to your project using CocoaPods. Add following pods in your `Podfile`: @@ -61,7 +60,7 @@ end Add the required dependencies to your project using Swift Package Manager. For Content Analytics, use the following instructions. 1. In Xcode, select **File** > **Add Package Dependencies**. - + 1. Enter the package URL: ```text @@ -69,5 +68,5 @@ Add the required dependencies to your project using Swift Package Manager. For C ``` 1. Select version `5.0.0` or later. - + 1. Select **Add Package**. From e390fbadd79a9a2edf0dbdda6fb18b5b67731705 Mon Sep 17 00:00:00 2001 From: Rob In der Maur Date: Tue, 3 Mar 2026 10:11:18 +0100 Subject: [PATCH 09/12] Lint errors --- .../adobe-content-analytics/advanced-configuration.md | 1 - src/pages/solution/adobe-content-analytics/api-reference.md | 2 -- src/pages/solution/adobe-content-analytics/index.md | 1 - .../solution/adobe-content-analytics/tabs/crash-recovery.md | 2 +- .../adobe-content-analytics/tabs/experience-tracking.md | 5 ----- 5 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/pages/solution/adobe-content-analytics/advanced-configuration.md b/src/pages/solution/adobe-content-analytics/advanced-configuration.md index 227351f51d..c3b7370199 100644 --- a/src/pages/solution/adobe-content-analytics/advanced-configuration.md +++ b/src/pages/solution/adobe-content-analytics/advanced-configuration.md @@ -83,7 +83,6 @@ To disable flushes for immediate sends: Batching only affects network delivery. Features like asset attribution, experience tracking, and featurization work the same whether batching is enabled or disabled. - ## Filtering You filter content analytics events through regular expressions. diff --git a/src/pages/solution/adobe-content-analytics/api-reference.md b/src/pages/solution/adobe-content-analytics/api-reference.md index dafa1465c8..454f247a33 100644 --- a/src/pages/solution/adobe-content-analytics/api-reference.md +++ b/src/pages/solution/adobe-content-analytics/api-reference.md @@ -69,7 +69,6 @@ iOS - ## trackAssetView Convenience method for tracking asset views. @@ -136,7 +135,6 @@ iOS - ### interactionType Defines the type of interaction, either a view or a click. diff --git a/src/pages/solution/adobe-content-analytics/index.md b/src/pages/solution/adobe-content-analytics/index.md index 72a3adc81a..8b54d24c02 100644 --- a/src/pages/solution/adobe-content-analytics/index.md +++ b/src/pages/solution/adobe-content-analytics/index.md @@ -79,4 +79,3 @@ SPM
(iOS) CocoaPods
(iOS) - diff --git a/src/pages/solution/adobe-content-analytics/tabs/crash-recovery.md b/src/pages/solution/adobe-content-analytics/tabs/crash-recovery.md index cb66677599..ae0f30599b 100644 --- a/src/pages/solution/adobe-content-analytics/tabs/crash-recovery.md +++ b/src/pages/solution/adobe-content-analytics/tabs/crash-recovery.md @@ -97,4 +97,4 @@ private val stateMutex = kotlinx.coroutines.sync.Mutex() private val mutex = Mutex() // All state mutations wrapped in mutex.withLock { } -``` \ No newline at end of file +``` diff --git a/src/pages/solution/adobe-content-analytics/tabs/experience-tracking.md b/src/pages/solution/adobe-content-analytics/tabs/experience-tracking.md index 929b58e904..8d750ae7ab 100644 --- a/src/pages/solution/adobe-content-analytics/tabs/experience-tracking.md +++ b/src/pages/solution/adobe-content-analytics/tabs/experience-tracking.md @@ -83,7 +83,6 @@ ContentAnalytics.trackExperienceView(experienceId: experienceId, experienceLocat ContentAnalytics.trackExperienceClick(experienceId: experienceId, experienceLocation: "product.detail") ``` - ```java @@ -91,7 +90,6 @@ ContentAnalytics.trackExperienceView(experienceId, "product.detail") ContentAnalytics.trackExperienceClick(experienceId, "product.detail") ``` - ```swift @@ -282,7 +280,6 @@ val expId = ContentAnalytics.registerExperience( ContentAnalytics.trackExperienceView(expId, "home") ``` - ```swift @@ -606,7 +603,6 @@ import com.adobe.marketing.mobile.Assurance Assurance.startSession(assuranceDeepLink) ``` - ```swift @@ -619,7 +615,6 @@ MobileCore.setLogLevel(.trace) MobileCore.setLogLevel(LoggingMode.VERBOSE) ``` - ```swift From ed56de9a749bbf62e8c7562682ad1c6d60df341e Mon Sep 17 00:00:00 2001 From: Rob In der Maur Date: Tue, 3 Mar 2026 18:22:33 +0100 Subject: [PATCH 10/12] Typo --- src/pages/solution/adobe-content-analytics/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/solution/adobe-content-analytics/index.md b/src/pages/solution/adobe-content-analytics/index.md index 8b54d24c02..16780da7c5 100644 --- a/src/pages/solution/adobe-content-analytics/index.md +++ b/src/pages/solution/adobe-content-analytics/index.md @@ -20,7 +20,7 @@ import InitializeSDK from '/src/pages/resources/initialize.md' ## Configure the Content Analytics extension -To configue the Content Analytics extension, complete the following steps: +To configure the Content Analytics extension, complete the following steps: ![Content Analytics Extension Configuration](./assets/index/configuration.png) From 8a8ec53ee6ca06f005fab06fff0c474b799db954 Mon Sep 17 00:00:00 2001 From: Rob In der Maur Date: Wed, 29 Apr 2026 10:56:14 +0200 Subject: [PATCH 11/12] Additional updates --- gatsby-config.js | 50 +++++++++---------- .../advanced-configuration.md | 2 +- .../adobe-content-analytics/api-reference.md | 10 ++-- .../adobe-content-analytics/crash-recovery.md | 8 +-- .../experience-tracking.md | 26 +++++----- .../solution/adobe-content-analytics/index.md | 2 +- 6 files changed, 49 insertions(+), 49 deletions(-) diff --git a/gatsby-config.js b/gatsby-config.js index 92a3ac59b8..48ee556673 100644 --- a/gatsby-config.js +++ b/gatsby-config.js @@ -1129,6 +1129,31 @@ module.exports = { } ] }, + { + title: "Adobe Content Analytics", + path: "/solution/adobe-content-analytics/", + pages: [{ + title: "Overview", + path: "/solution/adobe-content-analytics/" + }, + { + title: "API reference", + path: "/solution/adobe-content-analytics/api-reference" + }, + { + title: "Experience tracking", + path: "/solution/adobe-content-analytics/experience-tracking" + }, + { + title: "Advanced configuration", + path: "/solution/adobe-content-analytics/advanced-configuration" + }, + { + title: "Crash recovery", + path: "/solution/adobe-content-analytics/crash-recovery" + } + ] + }, { title: "Adobe Audience Manager", path: "/solution/adobe-audience-manager/", @@ -1200,31 +1225,6 @@ module.exports = { } ] }, - { - title: "Adobe Content Analytics", - path: "/solution/adobe-content-analytics/", - pages: [{ - title: "Overview", - path: "/solution/adobe-content-analytics/" - }, - { - title: "API reference", - path: "/solution/adobe-content-analytics/api-reference" - }, - { - title: "Experience tracking", - path: "/solution/adobe-content-analytics/experience-tracking" - }, - { - title: "Advanced configuration", - path: "/solution/adobe-content-analytics/advanced-configuration" - }, - { - title: "Crash recovery", - path: "/solution/adobe-content-analytics/crash-recovery" - } - ] - }, { title: "Adobe Media Analytics", path: "/solution/adobe-media-analytics", diff --git a/src/pages/solution/adobe-content-analytics/advanced-configuration.md b/src/pages/solution/adobe-content-analytics/advanced-configuration.md index c3b7370199..33b637eb36 100644 --- a/src/pages/solution/adobe-content-analytics/advanced-configuration.md +++ b/src/pages/solution/adobe-content-analytics/advanced-configuration.md @@ -142,7 +142,7 @@ iOS ### Data Deletion -To delete data, use resetIdentities() to reset identities, clear cache and queue. +To delete data, use `resetIdentities()` to reset identities, clear cache and queue. diff --git a/src/pages/solution/adobe-content-analytics/api-reference.md b/src/pages/solution/adobe-content-analytics/api-reference.md index 454f247a33..a92b6ab536 100644 --- a/src/pages/solution/adobe-content-analytics/api-reference.md +++ b/src/pages/solution/adobe-content-analytics/api-reference.md @@ -15,7 +15,7 @@ This section details the publicly available API's for Content Analytics. ## registerExperience -Registers an experience and returns an ID to track the experience. +Registers an experience and return an ID to track the experience. @@ -29,7 +29,7 @@ iOS ## trackAsset -Track an assets with an explicit defined interaction type. +Tracks an asset with an explicit defined interaction type. @@ -85,7 +85,7 @@ iOS ## trackExperienceClick -Track when an experience is clicked. +Tracks when an experience is clicked. @@ -103,7 +103,7 @@ iOS ## trackExperienceView -Track when an experience is viewed. +Tracks when an experience is viewed. @@ -158,7 +158,7 @@ The following config settings are available. These settings can also be managed | `configId` | String | N/A | [Custom datastream for Content Analytics events](/src/pages/solution/adobe-content-analytics/index.md#datastreams) (overrides edge.configId) | | `batchingEnabled` | Boolean | true | [Enable batching](/src/pages/solution/adobe-content-analytics/index.md#batching-settings) | | `maxBatchSize` | Integer | 10 | [Maximum events per batch](/src/pages/solution/adobe-content-analytics/index.md#batching-settings). | -| `flushInterval` | Integer | 2000 | [Flush interval (in milliseconds)](/src/pages/solution/adobe-content-analytics/index.md#batching-settings) | +| `flushInterval` | Integer | 2000 | [Flush interval (in milliseconds)](/src/pages/solution/adobe-content-analytics/index.md#batching-settings). | | `trackExperiences` | Boolean | true | [Enable experience tracking](/src/pages/solution/adobe-content-analytics/index.md#general-settings). | | `excludedAssetLocationsRegexp` | String | - | [Asset location regex pattern](/src/pages/solution/adobe-content-analytics/index.md#exclusions). | | `excludedAssetUrlsRegexp` | String | - | [Asset URL regex pattern](/src/pages/solution/adobe-content-analytics/index.md#exclusions). | diff --git a/src/pages/solution/adobe-content-analytics/crash-recovery.md b/src/pages/solution/adobe-content-analytics/crash-recovery.md index edabb5689f..f8ec8aac47 100644 --- a/src/pages/solution/adobe-content-analytics/crash-recovery.md +++ b/src/pages/solution/adobe-content-analytics/crash-recovery.md @@ -110,7 +110,7 @@ Legend: ✗ = Not present ``` -Events stay on disk during the entire batching window. Once we hand off to Edge, their persistence takes over. +Events stay on disk during the entire batching window. Once events are handed off to Edge, their persistence takes over. ## Crash Scenarios @@ -159,7 +159,7 @@ Result: ✅ ZERO DATA LOSS - Edge guarantees delivery ## Edge Network Handoff -Once we dispatch to Edge extension: +Once events are dispatched to Edge extension: ```text ContentAnalytics → runtime.dispatch(event) → Event Hub → Edge Extension @@ -186,7 +186,7 @@ iOS -This avoids state sync issues * we just count events on flush. If the app crashes, the restored events give us the same metrics. +This avoids state sync issues. Just events are counted on flush. If the app crashes, the restored events give the same metrics. ## Configuration @@ -354,7 +354,7 @@ The SDK uses a callback chain to decouple components while maintaining type safe └─────────────────────────────────────────────────────────────────────────────┘ ``` -Callbacks avoid circular dependencies - BatchCoordinator doesn't need to import Orchestrator. Also makes testing easier since we can inject mocks. +Callbacks avoid circular dependencies - BatchCoordinator doesn't need to import Orchestrator. Also this makes testing easier since you can inject mocks. ### Logging diff --git a/src/pages/solution/adobe-content-analytics/experience-tracking.md b/src/pages/solution/adobe-content-analytics/experience-tracking.md index 8ab7894502..8332232739 100644 --- a/src/pages/solution/adobe-content-analytics/experience-tracking.md +++ b/src/pages/solution/adobe-content-analytics/experience-tracking.md @@ -14,7 +14,7 @@ Experience tracking measures how users interact with complete experiences (combi ## Quick start -You first register the experience. Then you can track the view of the experience, when the experience becomes visible. Or you can track the click on the experience, when the experience gets tapped. +You first register the experience. Then you can track the view of the experience, when the experience becomes visible. Or you can track the interaction on the experience, when the experience gets clicked (tapped). @@ -120,7 +120,7 @@ iOS ### Collection or feed -Implementation of experience tracking fora collection or a feed. +Implementation of experience tracking for a collection or a feed. @@ -139,7 +139,7 @@ Experience IDs are deterministic - the same content always produces the same ID. 1. Sort text values alphabetically. 1. Sort asset URLs alphabetically. 1. Sort CTA values alphabetically. -1. Join all with | separator (texts, then assets, then CTAs). +1. Join all with `|` separator (texts, then assets, then CTAs). 1. SHA-1 hash the combined string. 1. Take first 12 hex characters. 1. Prefix with `mobile-`. @@ -347,7 +347,7 @@ When you register experiences, the featurization service analyzes the content an After featurization, Customer Journey Analytics can show which persuasion strategies work best in each location. -Customer Journey Analytics report - persuasion strategy by location: +Sample Customer Journey Analytics report - persuasion strategy by location: | Location | Persuasion strategy | Views | Click | CTR | |---|---|--:|--:|--:| @@ -361,7 +361,7 @@ Insight: **Urgency** messaging performs best at checkout (+15% CTR), while **Soc ### Performance by content category -Customer Journey Analytics report - asset category performance: +Sample Customer Journey Analytics report - asset category performance: | Asset Category | Location | Views | Engagement | |---|---|--:|--:| @@ -376,8 +376,8 @@ Insight: **Lifestyle** imagery works on homepage, but **Product-focused** images 1. You track: `registerExperience()` sends content to the featurization service. 1. ML analyzes: service extracts persuasion strategy, tone, category, and more. -1. Attributes stored: machine learning attributes are linked to the experience/asset. -1. Customer Journey Analytics queries: Reports can segment by any machine learning attribute and location. +1. Attributes are stored: machine learning attributes are linked to the experience/asset. +1. Customer Journey Analytics queries: reports can segment by any machine learning attribute and location. @@ -393,7 +393,7 @@ In Customer Journey Analytics, you can then filter or group by persuasion strate ## Custom metrics with `additionalData` -The `additionalData` parameter lets you attach custom metrics to tracking events. These appear in Customer Journey Analytics as additional dimensions or metrics. +The `additionalData` parameter lets you attach custom metrics to tracking events. These custom metrics appear in Customer Journey Analytics as additional dimensions or metrics. ### Asset performance metrics @@ -451,9 +451,9 @@ iOS | `experimentVariant` | String | A/B test variant ID.| | `deviceOrientation` | String | `portrait` / `landscape`. | -#### Customer Journey Analytics report with custom metric. +#### Customer Journey Analytics report with custom metric -For example average load time by asset location. +For example, reporting on average load time by asset location. | Location | Avg Load Time | Avg View Duration | |---|--:|--:| @@ -461,7 +461,7 @@ For example average load time by asset location. | `product.gallery` | 85ms | 8.5s | | `search.results` | 45ms | 1.1s | -Insight: Gallery images load slower but get 8x more viewing time. +Insight: Gallery images load **slower** but get **eight times more viewing time.** ## Debugging with Assurance @@ -485,7 +485,7 @@ iOS 1. Track Asset Events - When you call trackAssetView() or trackAssetClick(), you'll see: + When you call `trackAssetView()` or `trackAssetClick()`, you'll see: ```json Event: Track Asset @@ -526,7 +526,7 @@ iOS } ``` - * When you call trackExperienceView() or trackExperienceClick(): + * When you call `trackExperienceView()` or `trackExperienceClick()`: ```json Event: Track Experience diff --git a/src/pages/solution/adobe-content-analytics/index.md b/src/pages/solution/adobe-content-analytics/index.md index 16780da7c5..1f72791e76 100644 --- a/src/pages/solution/adobe-content-analytics/index.md +++ b/src/pages/solution/adobe-content-analytics/index.md @@ -50,7 +50,7 @@ Enter a value in **Batch Flush Interval (ms)** to define a time in miliseconds t Specify exclusions for asset URLs, assets locations, and experience locations. -* Enter an **Asset URL Pattern** to specify a regular expression to filter which asset URLs should be excluded when collecting data for Content Analytics. For example: `.*\\.gif$|.*\\.svg$` to exclude GIF or SVG files.
Use **Test Regex** to open the **Regular Expression Tester** where you can validate your regular expression. An example regular expression +* Enter an **Asset URL Pattern** to specify a regular expression to filter which asset URLs should be excluded when collecting data for Content Analytics. For example: `.*\\.gif$|.*\\.svg$` to exclude GIF or SVG files.
Use **Test Regex** to open the **Regular Expression Tester** where you can validate your regular expression. * Enter an **Asset Location Pattern** to specify a regular expression to filter which asset locations should be excluded when collecting data for Content Analytics. For example: `^(debug|test).*` to exclude asset location that contain `debug` or `test`.
Use **Test Regex** to open the **Regular Expression Tester** where you can validate your regular expression. * Enter an **Experience Location Pattern** to specify a regular expression to filter which experience locations should be excluded when collecting data for Content Analytics. For example: `^test\\..*|^dev\\..*` to exclude any experience location that contains `test.` or `dev.`
Use **Test Regex** to open the **Regular Expression Tester** where you can validate your regular expression. From 7cf3c8fadd029a2bcc6f59e014c62e1f1ae3fbf2 Mon Sep 17 00:00:00 2001 From: Rob In der Maur Date: Tue, 5 May 2026 00:02:29 +0200 Subject: [PATCH 12/12] Updates. --- src/pages/solution/adobe-content-analytics/api-reference.md | 2 +- src/pages/solution/adobe-content-analytics/crash-recovery.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/solution/adobe-content-analytics/api-reference.md b/src/pages/solution/adobe-content-analytics/api-reference.md index a92b6ab536..387344afd3 100644 --- a/src/pages/solution/adobe-content-analytics/api-reference.md +++ b/src/pages/solution/adobe-content-analytics/api-reference.md @@ -107,7 +107,7 @@ Tracks when an experience is viewed. -You must call [`registerExperience()`](#registerexperience) before you can track experience views. See the Experience Tracking Guide for detailed usage patterns. +You must call [`registerExperience()`](#registerexperience) before you can track experience views. See the [Experience Tracking Guide](./experience-tracking.md) for detailed usage patterns. diff --git a/src/pages/solution/adobe-content-analytics/crash-recovery.md b/src/pages/solution/adobe-content-analytics/crash-recovery.md index f8ec8aac47..424297d014 100644 --- a/src/pages/solution/adobe-content-analytics/crash-recovery.md +++ b/src/pages/solution/adobe-content-analytics/crash-recovery.md @@ -36,7 +36,7 @@ User tracks event **Responsibilities:** -* Manages batching logic (count threshold + time-based flush) +* Manages batching logic (count threshold and time-based flush) * Writes incoming events to disk immediately via `PersistentHitQueue` * Maintains in-memory event counters * Triggers flush when threshold reached (10 events or 5 seconds)