pixellint

CAPI · marketers · engineers · PMs

Purchse is a custom event whether you meant it

Typos in event names do not 400. They silently become custom events with no value schema. Pixellint warns on unrecognized Meta ev values because custom is legal and Purchse is still a bug.

Use the catalog

If the vendor listed an event for your action, use it. CompleteRegistration is not Lead. Subscribe is not Purchase. AddToCart is not ViewContent. Standard events carry documented parameters (value, currency, content ids) that optimization expects.

Meta standard events are PascalCase: Purchase, Lead, AddToCart, InitiateCheckout, ViewContent, CompleteRegistration. The pixel field is ev. vendor.meta.param.ev.invalid warns on unrecognized values because custom events are legal. That warning is how Purchse ships. Fix the typo; do not 'register Purchse in Events Manager' unless you enjoy a forever alias.

Casing is per vendor

GA4 recommended events are snake_case: purchase, add_to_cart, begin_checkout, generate_lead. TikTok Events API uses names such as CompletePayment and ViewContent on the event field (not event_name). Snap CAPI event_name is a documented UPPER_CASE enum: PURCHASE, ADD_CART, START_CHECKOUT, VIEW_CONTENT, PAGE_VIEW. vendor.snapchat.body.event_name.invalid is Purchase copied from Meta.

Do not reuse one string across vendors without a map. Dedup requires the pixel event and the CAPI event to use that vendor's name, not a company-wide constant named PURCHASE that is wrong on two of three pipes.

When custom is right

A product-specific milestone the catalog cannot express: quiz_completed, recipe_saved, level_40. Name it like a function, not Event1. Put value only if it is money or a score you will optimize toward.

Pinterest allows a custom event_name up to 100 characters and does not enum-check it, so a typo will not fail the pack. Map the custom name to a standard event in Ads Manager if you want optimization. The JSON will not do that for you.

Dedup dies on a name mismatch

Meta dedups on event_id plus event_name (and Pixel ID). fbq track Purchase plus CAPI event_name purchase are two events. Snap will not even accept purchase. TikTok pixel CompletePayment plus a server event named Purchase will not collapse.

The map belongs in one function: toMeta(event), toTikTok(event), toSnap(event). Spreading the strings through GTM, a worker, and a notebook is how the pixel says Purchase and CAPI says OrderCompleted.

Custom is legal; that is the trap

Collectors accept free strings so you can extend the catalog. They will not 400 a typo. HTTP 200 / 204 with a custom name in the UI is the usual screenshot in the incident channel.

Lint known catalogs where the pack enumerates them (Snap event_name, Meta ev warning, GA4 recommended ecommerce field sets). Where custom is allowed, lint your own allowlist in CI. Pixellint will not know that OrderComplete was meant to be Purchase unless you tell a custom pack.

Purchse still 200s

The pixel warns. CAPI will take the string. Optimization will not treat it as Purchase.

pixellint validate url 'https://www.facebook.com/tr?id=123&ev=Purchse'
# warning  vendor.meta.param.ev.invalid  ev is Purchse, not Purchase

// Snap: documented upper-case enum, not Meta PascalCase
{ "event_name": "PURCHASE", "action_source": "WEB", "event_source_url": "https://shop.example/thanks" }

// Wrong Snap
{ "event_name": "Purchase", "action_source": "website" }
# vendor.snapchat.body.event_name.invalid
# vendor.snapchat.body.action_source.invalid

// TikTok Events API field is "event", not event_name
{ "pixel_code": "CXXXX", "event": "CompletePayment", "event_id": "order-1842", "timestamp": "2026-08-21T18:04:00Z" }

Check the artifact

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