DEV Community

Bhargav Bhatt
Bhargav Bhatt

Posted on Fully Autonomous

Launching Open Source: TikTok Pixel & Server-Side Events API Extension for Adobe Experience Platform Tags!

πŸš€ Launching Open Source: TikTok Pixel & Server-Side Events API Extension for Adobe Experience Platform Tags!

Tracking online conversions reliably in 2026 isn't as simple as dropping a JavaScript snippet into the <head> of a site anymore. With browser privacy restrictions, ad blockers, and ITP, relying solely on client-side tracking leads to missing data, inaccurate attribution, and wasted ad spend.

To bridge this gap, I’ve built an open-source Adobe Experience Platform (AEP) Tags extension that combines TikTok Client-Side Pixel tracking with the TikTok Events API (Server-Side Conversion API)β€”and today, I'm opening up the project for community contributions and funding!


πŸ’‘ What Makes This Extension Unique?

Building a production-ready tag management extension requires handling client-side execution, data transformation, privacy, and server API calls seamlessly.

  1. Dual-Track Client & Server Sync: Fires both ttq.track in the browser and a server-side payload to TikTok’s Business API concurrently.
  2. Built-in Event Deduplication: Automatically generates RFC 4122 v4 UUID event_ids shared between client and server hits so TikTok never double-counts conversions.
  3. Privacy-First PII Normalization: Uses the browser's native Web Crypto API (crypto.subtle) to normalize and SHA-256 hash sensitive user identifiers (email, phone, external ID) client-side before sending.
  4. Single Page Application (SPA) Support: Built-in History API observers (pushState/replaceState/popstate) to handle modern JS framework route changes out of the box.
  5. Non-Blocking Execution & Fail-safes: Built-in script loading timeouts (5s) and API request timeouts (10s) ensuring your Adobe Tags rule execution chain never halts if a network issue occurs.
  6. On-Screen Visual Debugger: An interactive debug badge and detailed console logger when running in debugMode.

πŸ—οΈ Architecture at a Glance

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                                ADOBE LAUNCH RUNTIME                              β”‚
β”‚                                                                                  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                        β”‚
β”‚  β”‚ Global Extension     β”‚        β”‚ Event / Rule Trigger β”‚                        β”‚
β”‚  β”‚ Settings             β”‚        β”‚ (e.g. AddToCart)     β”‚                        β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                        β”‚
β”‚             β”‚                               β”‚                                    β”‚
β”‚             β–Ό                               β–Ό                                    β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                        β”‚
β”‚  β”‚ loadPixel.js         β”‚        β”‚ trackEvent.js        β”‚                        β”‚
β”‚  β”‚ Inject ttq snippet   β”‚        β”‚ Resolve Data Elementsβ”‚                        β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                        β”‚
β”‚             β”‚                               β”‚                                    β”‚
β”‚             β”‚                     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                         β”‚
β”‚             β”‚                     β”‚ Generate UUID v4   β”‚                         β”‚
β”‚             β”‚                     β”‚ Shared Event ID    β”‚                         β”‚
β”‚             β”‚                     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                         β”‚
β”‚             β”‚                               β”‚                                    β”‚
β”‚             β”‚          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”               β”‚
β”‚             β”‚          β”‚                                         β”‚               β”‚
β”‚             β–Ό          β–Ό                                         β–Ό               β”‚
β”‚     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚     β”‚ CLIENT-SIDE DISPATCH β”‚                        β”‚ SERVER-SIDE PREPARATION β”‚  β”‚
β”‚     β”‚  ttq.track(...)      β”‚                        β”‚  sha256(email/phone)    β”‚  β”‚
β”‚     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ordering               β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                β”‚                                                 β”‚               β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                 β”‚                                                 β”‚
                 β–Ό                                                 β–Ό
      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
      β”‚ TikTok Pixel SDK     β”‚                        β”‚ TikTok Events API       β”‚
      β”‚ (analytics.tiktok)   β”‚                        β”‚ (business-api.tiktok)   β”‚
      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Enter fullscreen mode Exit fullscreen mode

πŸ’– Why We are Seeking Funding & Community Support

Maintaining enterprise-grade analytics software requires continuous updates to stay compliant with privacy laws (GDPR/CCPA), changes in TikTok’s API specifications, and updates to Adobe Experience Platform SDKs.

We are opening up GitHub Sponsors / Open Collective funding to help achieve the following roadmap goals:

  • πŸ“‘ Official Adobe Exchange Listing: Submitting and verifying the extension on the Adobe Exchange App Marketplace.
  • ⚑ Server-Side AEP Tags Support: Developing an official server-side AEP Tags extension version running natively on Adobe Edge Network / Event Forwarding.
  • πŸ§ͺ E2E Testing Pipeline: Expanding our Jest test suite to include automated browser integration tests.
  • 🌐 Documentation & Guides: Creating step-by-step setup tutorials and video walkthroughs for martech and tracking engineers.

πŸ› οΈ How You Can Help

  1. Star the Repository: Show your support on GitHub!
  2. Try it Out: Test the extension in your Adobe Tags Sandbox environment using @adobe/reactor-sandbox.
  3. Sponsor the Project: Become a backer on GitHub Sponsors or Open Collective to support ongoing maintenance and feature development.
  4. Contribute: Check out our open issues for feature requests, bug reports, or docs improvements!

Links & Resources:


What challenges are you facing with server-side event tracking? Let's discuss in the comments below!

Top comments (0)