pixellint

Analytics · engineers · marketers

An Adobe hit is not a GA4 event

If your mental model is gtag('event', ...), Adobe will feel like a query-string novel. Campaign variables, eVars, and events occupy fixed slots. A missing s.events on purchase is a revenue hole.

Host and path are the report suite

Adobe Analytics collection beacons live on omtrdc.net and 2o7.net. The report suite rides on the path after /b/ss/. Pixellint reads report_suite from that segment: vendor.adobe-analytics.param.report_suite.missing. A comma-separated list of suites is legal. An empty segment is not. This is not google-analytics.com/mp/collect and not /g/collect.

mid is the Experience Cloud ID that ties the hit to a visitor. When present, it must not be empty: vendor.adobe-analytics.param.mid.empty. A hit with no mid still collects; it just does not join the people you paid Adobe to stitch. AppMeasurement sets it when VisitorAPI ran. A handwritten image pixel often forgets it.

https://example.sc.omtrdc.net/b/ss/reportSuite/1/JS-2.22.0/s123456?mid=XXXX&pageName=Thank%20you&events=purchase&v1=T12345&g=https%3A%2F%2Fshop.example%2Fthank-you

Image versus AppMeasurement

The 1x1 is the wire format. JS still builds it. Do not hand-edit production query strings to fix an eVar; fix the s object and let AppMeasurement serialize. s.t() is a page view. s.tl() is a link / custom link that does not increment page view. Calling s.t() on every button is how a single thank-you inflates pages. Calling only s.tl() on route change is how a SPA never records a page.

Query length still applies. Browsers truncate. A novel of eVars plus a product list is how you mint a silent 414. Launch / Tags should keep the beacon under the cap. Pixellint validates the URL it sees, not the Launch UI.

pixellint validate url 'https://example.sc.omtrdc.net/b/ss/reportSuite/1/JS-2.22.0/s1?mid=XXXX&pageName=Home' --rulepack vendor/adobe-analytics

SPA route changes need a new pageName

A single s.t() on DOMContentLoaded is a one-page site to Adobe. Fire a page view on route change with the new pageName (and a new URL in g / page URL). The same history problem as gtag config on a SPA. If finance lives in Workspace and only sees the first path, this is why.

Virtual page views still need the report suite in the path. A fetch to your own /analytics proxy that never hits omtrdc.net is not an Adobe hit. Network filter: omtrdc.net or 2o7.net.

Campaigns are not utm_source

cid / Adobe campaign tracking is not utm_source. Keep both if finance lives in GA4 and media lives in Adobe, and write the map. s.campaign, campaign variables, and eVar allocation (most recent versus original) will not match GA4 default session attribution. Arguing about the screenshot without the map is a meeting, not a pixel bug.

Purchase still needs s.events with a purchase event and a value in the documented currency slot. A missing s.events on thank-you is a revenue hole. Adobe will happily store a page view named Thank you.

This pack is the beacon, not AA processing

vendor/adobe-analytics checks host, /b/ss/{report_suite}/, and mid when present. It does not compile your processing rules, classification tables, or Attribution IQ. A valid beacon can still vanish after a processing rule drops internal IP. Staging hits on the production report suite are how QA trains Workspace. Use a staging suite.

Pixellint is not affiliated with Adobe. The pack cites Experience League tracking-server and report-suite docs. If you also send Web SDK / AEP, that is a different edge. Do not assume this pack covers alloy.js.

Check the artifact

Paste the pixel URL or JSON body into the playground. Same engine as pixellint validate. Nothing leaves the tab.