mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-02-19 06:20:10 +00:00
Implement Impact telemetry and checkout attribution through cloud
subscription checkout flows.
This PR adds Impact.com tracking support and carries attribution context
from landing-page visits into subscription checkout requests so
conversion attribution can be validated end-to-end.
- Register a new `ImpactTelemetryProvider` during cloud telemetry
initialization.
- Initialize the Impact queue/runtime (`ire`) and load the Universal
Tracking Tag script once.
- Invoke `ire('identify', ...)` on page views with dynamic `customerId`
and SHA-1 `customerEmail` (or empty strings when unknown).
- Expand checkout attribution capture to include `im_ref`, UTM fields,
and Google click IDs, with local persistence across navigation.
- Attempt `ire('generateClickId')` with a timeout and fall back to
URL/local attribution when unavailable.
- Include attribution payloads in checkout creation requests for both:
- `/customers/cloud-subscription-checkout`
- `/customers/cloud-subscription-checkout/{tier}`
- Extend begin-checkout telemetry metadata typing to include attribution
fields.
- Add focused unit coverage for provider behavior, attribution
persistence/fallback logic, and checkout request payloads.
Tradeoffs / constraints:
- Attribution collection is treated as best-effort in tiered checkout
flow to avoid blocking purchases.
- Backend checkout handlers must accept and process the additional JSON
attribution fields.
## Screenshots
<img width="908" height="208" alt="image"
src="https://github.com/user-attachments/assets/03c16d60-ffda-40c9-9bd6-8914d841be50"/>
<img width="1144" height="460" alt="image"
src="https://github.com/user-attachments/assets/74b97fde-ce0a-43e6-838e-9a4aba484488"/>
<img width="1432" height="320" alt="image"
src="https://github.com/user-attachments/assets/30c22a9f-7bd8-409f-b0ef-e4d02343780a"/>
<img width="341" height="135" alt="image"
src="https://github.com/user-attachments/assets/f6d918ae-5f80-45e0-855a-601abea61dec"/>
45 lines
1.3 KiB
TypeScript
45 lines
1.3 KiB
TypeScript
/**
|
|
* Telemetry Provider - Cloud Initialization
|
|
*
|
|
* This module is only imported in cloud builds to keep
|
|
* cloud telemetry code out of local/desktop bundles.
|
|
*/
|
|
import { setTelemetryRegistry } from './index'
|
|
|
|
const IS_CLOUD_BUILD = __DISTRIBUTION__ === 'cloud'
|
|
|
|
let _initPromise: Promise<void> | null = null
|
|
|
|
/**
|
|
* Initialize telemetry providers for cloud builds.
|
|
* Must be called early in app startup (e.g., main.ts).
|
|
* Safe to call multiple times - only initializes once.
|
|
*/
|
|
export async function initTelemetry(): Promise<void> {
|
|
if (!IS_CLOUD_BUILD) return
|
|
if (_initPromise) return _initPromise
|
|
|
|
_initPromise = (async () => {
|
|
const [
|
|
{ TelemetryRegistry },
|
|
{ MixpanelTelemetryProvider },
|
|
{ GtmTelemetryProvider },
|
|
{ ImpactTelemetryProvider }
|
|
] = await Promise.all([
|
|
import('./TelemetryRegistry'),
|
|
import('./providers/cloud/MixpanelTelemetryProvider'),
|
|
import('./providers/cloud/GtmTelemetryProvider'),
|
|
import('./providers/cloud/ImpactTelemetryProvider')
|
|
])
|
|
|
|
const registry = new TelemetryRegistry()
|
|
registry.registerProvider(new MixpanelTelemetryProvider())
|
|
registry.registerProvider(new GtmTelemetryProvider())
|
|
registry.registerProvider(new ImpactTelemetryProvider())
|
|
|
|
setTelemetryRegistry(registry)
|
|
})()
|
|
|
|
return _initPromise
|
|
}
|