Expand my Community achievements bar.

Submissions are now open for the 2026 Adobe Experience Maker Awards

Migration Support: Adobe Analytics to AEP CJA for Xamarin Native (MonoAndroid) Application

Avatar

Level 1

Hello,

I am currently exploring the migration from Adobe Analytics to Adobe Experience Platform Customer Journey Analytics (AEP CJA) for our mobile application. Our app is built using Xamarin Native (MonoAndroid), and we have integrated Adobe Analytics using the existing mobile SDK.

As part of our migration planning, I have a few questions:

  1. Is there official support or recommended integration paths for AEP CJA in Xamarin Native (MonoAndroid) applications?
  2. Can we leverage our existing Adobe Analytics implementation, or will significant changes be required to support AEP CJA?
  3. Are there any SDKs, wrappers, or sample projects available for Xamarin or .NET-based mobile apps targeting AEP CJA?
  4. What are the key considerations or challenges when migrating analytics tracking from Adobe Analytics to AEP CJA in a cross-platform environment?

Any guidance, documentation, or references to migration best practices would be greatly appreciated.

Thank you!

Topics

Topics help categorize Community content and increase your ability to discover relevant content.

4 Replies

Avatar

Community Advisor

Adobe does not currently provide a dedicated Xamarin Native (MonoAndroid) SDK for AEP or CJA. The supported mobile SDKs are for iOS, Android, React Native, and Flutter. In Xamarin environments, most teams either wrap the native Android/iOS AEP SDKs or use a custom binding library to bridge them into Xamarin.

You won’t be able to reuse the legacy Adobe Analytics SDK directly, since CJA relies on data being sent into AEP via the Edge Network. That typically requires moving to the AEP Mobile SDKs and updating your tracking implementation accordingly.

There aren’t official .NET/Xamarin samples, so you’ll likely need some custom integration work. The main considerations are:

  • Routing all data through AEP Edge instead of the Analytics endpoint

  • Re-mapping events/parameters into XDM schemas for CJA

  • Testing identity handling and consent flows carefully across platforms

For migration best practices, Adobe recommends starting with your current analytics design, mapping it to XDM, and implementing incrementally. The Experience League docs for AEP Mobile SDK and Edge Network setup are the best reference points.

Avatar

Level 1

Hi @Vinay_Chauhan ,

 

Thanks for your response,

 

Right now, I'm working with a Flutter app that's in the process of migrating to Adobe Experience Platform Customer Journey Analytics (AEP CJA).

Goal: Successfully send XDM events (for CJA) to Adobe Edge Network from Flutter

Issue:

  • I can see adobedtm network calls in Charles Proxy, but I do not see any events sent to edge.adobedc.net endpoints.
  • I’ve experimented with various XDM payload formats, but still don’t see the Edge events in Charles.

sample

try

{

  final experienceData = {

    “test”: {

      "webPageDetails": {

        "screen": "homepage",

      },

      "userDetails": {

        "userID": userID,

        "ecid": "1234",

      },

      "applicationDetails": {

        "applicationName": appName,

        "appVersion": appVersion,

        "domain": domain,

        "platform": platform,

        "apmID": "apm_78910",

      }

    }

  };

    Map<String, dynamic> xdmData = {"eventType": "view"};

    final ExperienceEvent experienceEvent1 = ExperienceEvent({

      "xdmData": xdmData,

      "data": experienceData

    });

    List<EventHandle> result = await Edge.sendEvent(experienceEvent1);

}

catch(e)

{

  print(e.toString());

}

 

Is my XDM event structure correct for posting events with the Edge Mobile SDK (via Flutter)?

Is there any official or community-supported example of Dart/Flutter integration with AEP Edge events that I can reference?

If the event fields (or some nested fields) aren’t mapped or expected in the AEP schema—will that prevent the request from being sent and visible in Charles, or will the SDK still POST the raw event?

 

Thank you!

 

 

Avatar

Community Advisor

Hi @vamshiKr1 

Here are my comments against your each question -

Is my XDM event structure correct for posting events with the Edge Mobile SDK (via Flutter)?
Your XDM event structure looks mostly fine, but there are a couple of points to check:

  • Make sure the top-level key is "xdm" instead of "xdmData". The SDK expects the event to contain an xdm object that matches the schema defined in your datastream.

  • You don’t need to include fields like eventID or timestamp; the SDK automatically adds those.

  • The nested experienceData object is fine if your schema supports those fields, but any unmapped key won’t be stored in AEP.

  • Most importantly, confirm that your app has initialized the Edge, Identity, and Core extensions before sending events. Missing initialization is a common reason events don’t appear in Charles.


Is there any official or community-supported example of Dart/Flutter integration with AEP Edge events that I can reference?

Yes — Adobe’s official Flutter SDK repository is available here:
https://github.com/adobe/aepsdk_flutter

It includes example usage for Edge.sendEvent, as well as packages like:

  • flutter_aepedge (for sending XDM events)

  • flutter_aepedgebridge (for bridging older trackAction or trackState calls during migration)

You can also check the package documentation on Pub.dev:
https://pub.dev/packages/flutter_aepedge

If the event fields (or some nested fields) aren’t mapped or expected in the AEP schema—will that prevent the request from being sent and visible in Charles, or will the SDK still POST the raw event?
The SDK will still attempt to send the event even if some fields don’t map. However -

  • If required schema fields are missing or invalid, the event might be rejected by the Edge Network (and won’t show in Charles or AEP).

  • If fields are simply unmapped (i.e., optional or custom), the SDK still posts the event; those fields will just be ignored upstream.

  • Make sure the mobile datastream is configured for AEP or Analytics, and that your device trusts the Charles certificate, otherwise, HTTPS interception may hide the calls.

Avatar

Level 1

 

 

Thank you for your detailed feedback and guidance!

 

Following your suggestions, I’ve restructured my XDM payload:

  • I switched to using the top-level "xdm" key (instead of "xdmData").
  • I removed SDK-generated fields like eventID and timestamp.
  • All nested objects now match my schema requirements.

Your insights on event mapping and unmapped fields have been very helpful.

However, when I use "xdm" as the key (in place of "xdmData"), I’m encountering the following exception:

The following PlatformException was thrown:

PlatformException(0, Unexpected error, null, null)

When the exception was thrown, this was the stack:

#0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:652:7)

#1 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:370:18)

<asynchronous suspension>

#2 MethodChannel.invokeListMethod (package:flutter/src/services/platform_channel.dart:556:35)

<asynchronous suspension>

#3 Edge.sendEvent.<anonymous closure> (package:flutter_aepedge/flutter_aepedge.dart:35:17)

<asynchronous suspension>

#4 ActivityTrackerHelper.trackAction (package:sunrise/core/activity_tracker/activity_tracker_helper.dart:71:5)

<asynchronous suspension>

 

 

If I use "xdmData" instead, I do not see this error.

 

Could you clarify whether "xdm" should be used as the top-level key with the Edge Mobile SDK for Flutter? Is there any additional configuration or payload structure needed when using "xdm"?

 

Also, for completeness, here’s my extension initialization process in AppDelegate.


Could you please reviewing if this part looks correct for sending Edge events and having them appear in Charles/AEP?

 

 

MobileCore.setLogLevel(.trace)

  MobileCore.setPrivacyStatus(.optedIn)

  MobileCore.setWrapperType(.flutter)

let appState = application.applicationState

let extensions = [

    Consent.self,

    Assurance.self,

    AEPEdgeIdentity.Identity.self,

    AEPIdentity.Identity.self,

    Edge.self,

    UserProfile.self,

    Lifecycle.self,

    Signal.self,

    Analytics.self

]

MobileCore.registerExtensions(extensions, {

    MobileCore.configureWith(appId: "867a1b8828a8/db***d/launch-99d7a1a16c4b-development")

    if appState != .background {

        MobileCore.lifecycleStart(additionalContextData: ["contextDataKey": "contextDataVal"])

    }

  }

)

Thank you again for your assistance!