Docs
Set up server-side conversion tracking in six steps.
EndFrame collects visits and actions first-party through one snippet, turns them into conversion goals, and forwards each conversion server-side to Meta, GA4, TikTok, or a webhook with a shared event ID for deduplication. The setup is designed to take about twenty minutes, with no server-side GTM container to host.
Quickstart
Step 01
Connect a domain
Add the hostname you want to measure. Every campaign, goal, and destination is scoped to it, so multi-brand and agency setups stay separate.
Step 02
Create a campaign and install the snippet
Create a campaign with the inline editor, copy the generated snippet, and paste it into your site template. Traffic starts arriving in seconds.
Step 03
Map your UTM and query parameters
Tell EndFrame how utm_source, utm_medium, and custom parameters should normalize into clean reporting dimensions. Validation flags unmapped values early.
Step 04
Define a conversion goal
Choose an event match (a signup or purchase event) or a URL match (a thank-you page). Each conversion is credited to the campaign and source that earned it.
Step 05
Toggle a server-side destination
Turn on Meta Conversions API, GA4 Measurement Protocol, TikTok Events API, or a webhook. EndFrame forwards each conversion with hashed identifiers and a shared event ID for deduplication.
Step 06
Verify in real time
Watch live visitors and conversions, confirm deliveries per destination, then check the platform's test-events view to see server events land and deduplicate.
Server-side destinations: what you need from each platform
Each destination is a toggle in the dashboard. Paste the credentials below, choose what to forward, and EndFrame handles hashing, event IDs, retries, and delivery logs.
Facebook & Instagram ads
Meta Conversions API
- Pixel (dataset) ID from Meta Events Manager
- Conversions API access token generated for that dataset
- Optional test event code to preview deliveries in Test Events
Events carry SHA-256 hashed identifiers and a shared event ID, so Meta deduplicates them against your browser pixel.
Google Analytics 4
GA4 Measurement Protocol
- Measurement ID of the GA4 web data stream (G-XXXXXXX)
- Measurement Protocol API secret created under that stream
Conversions arrive as events on the GA4 property; mark them as key events in GA4 to report on them.
TikTok ads
TikTok Events API
- Pixel code from TikTok Events Manager
- Events API access token for that pixel
- Optional test event code for TikTok's test events view
Hashed email and phone plus the shared event ID give TikTok what it needs to match and deduplicate.
CRM, warehouse, or any endpoint
Custom webhook
- An HTTPS endpoint URL (private and loopback addresses are rejected)
- Optional custom headers and a signing secret
The same conversion payload fans out to your own systems, so a CRM or warehouse sees exactly what the ad platforms see.
Options available on every destination
- Label — a name for the destination shown in reporting and delivery logs.
- Test mode — deliveries are tagged with the platform's test event code so you can verify without polluting production data.
- Forward page views — also send page-view events, not only conversions.
- Forward conversions — send goal conversions (on by default).
- Active — pause a destination without deleting its credentials.
How deduplication and hashing work
- 1Every server-side event carries an event ID. If your site passes an event_id in the action's metadata (the same value you give the browser pixel), EndFrame reuses it; otherwise it derives a stable ID from the recorded action.
- 2Meta and TikTok collapse a browser event and a server event that share an event ID and event name into one conversion, so running both paths recovers lost events without double counting.
- 3GA4 does not deduplicate on event IDs. EndFrame reuses the visitor's GA client ID when it is available so server-side events join the right session, and you should forward each conversion to GA4 from one source only.
- 4Email and phone identifiers are normalized and SHA-256 hashed per platform before they leave EndFrame. Browser-scoped values such as fbp and fbc are passed as-is, as Meta's specification requires.
- 5Deliveries are queued with automatic retries and exponential backoff, and every attempt is logged with its status per destination, so a rejected event is visible in the dashboard instead of silently dropped.
For the reasoning behind event IDs and match keys, read the server-side conversion tracking guide.
REST API and MCP server
Enable the REST API or MCP server add-on from the marketplace, create a workspace-scoped API key, and authenticate with either an Authorization: Bearer header or an X-Api-Key header. Responses are JSON.
| Method | Endpoint | Returns |
|---|---|---|
| GET | /api/v1/external/analytics/overview | Visits, actions, conversions, and engagement KPIs for a date range |
| GET | /api/v1/external/campaigns | List campaigns in the workspace |
| GET | /api/v1/external/campaigns/:id | One campaign with its mapping and activity summary |
| GET | /api/v1/external/domains | Connected domains |
| GET | /api/v1/external/goals | Conversion goals |
| GET | /api/v1/external/goals/:id | One goal with its configuration |
| GET | /api/v1/external/goals/:id/conversions | Conversions recorded for a goal |
MCP server tools
The MCP server speaks JSON-RPC 2.0 at POST /api/v1/mcp and answers tools/list and tools/call, so Claude, ChatGPT, or any Model Context Protocol client can query your attribution data with the same API key.
get_analytics_overview
Get analytics overview metrics for the workspace including total visits, unique visitors, conversions, and campaign performance for a date range.
list_campaigns
List all campaigns in the workspace with their name, status, UTM parameters, and visit counts.
get_campaign
Get detailed information about a specific campaign including its configuration, domains, and performance metrics.
list_domains
List all tracked domains in the workspace with their hostname, display name, and verification status.
list_goals
List all conversion goals in the workspace with their trigger type, configuration, and conversion counts.
get_goal
Get detailed information about a specific conversion goal including recent conversions.
query_visits
Query website visits with optional filters for date range, domain, and campaign. Returns paginated visit data with referrer, page URL, and UTM parameters.
get_conversions
Get conversion data for a specific goal within a date range, including visitor details and conversion timestamps.
Where things live in the dashboard
Reporting
Monitor visit and action volume, compare activity over time, and see which campaigns and sources are actually moving — with engagement time, scroll depth, language, and screen resolution breakdowns built in.
Use this area to spot movement, verify traffic quality, and understand audience engagement at a glance.
Conversion Goals
Define what counts as a win — a key event or a URL match — and EndFrame records each conversion against the campaign and source that earned it, with a per-campaign breakdown.
Use this area to measure what campaigns actually produce — signups, demos, purchases — instead of stopping at clicks.
Conversions API
Forward conversions and page views server-side to Meta, GA4, and TikTok — or any custom webhook — with hashed first-party data and browser↔server event-ID dedup that recovers the events client pixels lose.
Use this area to restore the match rates that signal loss erodes and feed ad platforms cleaner conversion data.
Real-time Reporting
Watch active visitors and conversions as they happen, then slice volume freely by geo, device, path, referrer, and UTM with sub-second aggregations that never strain your primary database.
Use this area to catch a launch spike, a tracking break, or a conversion drop the moment it happens.
Campaigns
Create, search, and maintain campaign entries with an inline editor, embed snippet preview with copy button, mapped parameters, activity signals, and one-click duplication.
Use this area to launch new campaigns, duplicate winning setups, and troubleshoot live activity.
Domains
See which domains are connected, how many campaigns they carry, and how much traffic and action volume each hostname is supporting.
Use this area to keep hostname setup clean before a launch and understand domain-level activity after it.
Attribution
Inspect how incoming parameters are transformed, which identifiers need attention, and which validation signals are healthy or noisy.
Use this area to tighten naming, standardize source inputs, and make campaign reporting trustworthy.
Leads
Capture qualified inbound interest from the marketing site and review it in the dashboard with filters, notes, and follow-up status.
Use this area to review incoming requests without splitting lead intake into another tool on day one.
Roles & Users
Manage workspace users, custom roles, per-resource access policies, and API keys without turning governance into a separate admin product.
Use this area to keep admin control tight while giving operators access to the parts of the workspace they actually need.
Marketplace
Browse and toggle add-ons that extend your workspace: MCP server for AI agents, a tracking pixel for lightweight collection, and a REST API for external integrations.
Use this area to connect EndFrame to the rest of your stack — BI tools, AI workflows, and custom dashboards.
Setup questions
Do I need engineering help to set up tracking?
Usually not. Installing the tracking snippet is similar to adding a standard analytics tag, parameter mapping and conversion goals are configured in the dashboard, and server-side destinations are toggles that take platform credentials. There is no server-side GTM container to host, so most teams get started without an engineering project.
How do I confirm that my tracking is working?
After installing the snippet, use the reporting overview and campaign activity views to confirm visits and actions are arriving, and check the attribution validation surfaces to make sure source identifiers look correct.
What is parameter mapping?
Parameter mapping defines how incoming query parameters are captured and normalized into clean, report-ready dimensions. It is what turns inconsistent raw inputs into source data you can actually trust in reporting.
Can I track multiple domains and brands?
Yes. You can connect multiple domains and run campaigns across them, with domain-level visibility into coverage and activity, which is helpful for teams and agencies managing several brands.
How do I use the REST API?
Enable the REST API add-on from the marketplace, create a named API key from the settings panel, and start making HTTP requests. The API returns JSON and covers campaigns, visits, analytics breakdowns, and engagement KPIs.
How do API keys work?
API keys are created and managed from the dashboard settings panel. You can name each key, enable or disable it without deleting, and revoke it permanently. Keys are workspace-scoped, so they only access data within your workspace.
Next Step