Sync your EventZR ad campaigns, audiences, and conversion data with external ad platforms. Manage Google Ads, Meta Ads, TikTok Ads, and LinkedIn Ads from a single unified dashboard.
EventZR's external network integration allows you to connect your existing ad accounts from major platforms and sync campaign data bidirectionally. Create campaigns in EventZR and push them to external networks, or import external campaign performance data into your unified reporting dashboard.
EventZR integrates with the following external ad networks. All integrations are routed through integration-hub-svc for centralized credential management and rate limiting.
| Platform | Auth Method | Sync Capabilities | Status |
|---|---|---|---|
| Google Ads | OAuth 2.0 | Campaigns, audiences, conversions, keywords | GA |
| Meta Ads | OAuth 2.0 | Campaigns, ad sets, audiences, conversions | GA |
| TikTok Ads | OAuth 2.0 | Campaigns, ad groups, audiences, events | GA |
| LinkedIn Ads | OAuth 2.0 | Campaigns, audiences, conversions, leads | GA |
Initiate the OAuth flow to connect an external ad account. The API returns a redirect URL that the user must visit to authorize access. After authorization, the callback stores the credentials securely.
import { AdsClient } from '@eventzr/ads-client';
const client = new AdsClient({
baseUrl: 'https://api.eventzr.com/ads/v1',
tenantId: '<your-tenant-id>',
accessToken: '<jwt>',
});
// Initiate OAuth connection
const connection = await client.external.connectAccount({
platform: 'google_ads',
redirectUri: 'https://yourapp.com/callbacks/google-ads',
scopes: ['campaigns', 'audiences', 'conversions'],
});
// Redirect the user to authorize
console.log('Authorize URL:', connection.data.authorizeUrl);
// => https://accounts.google.com/o/oauth2/v2/auth?client_id=...
// After OAuth callback, the account appears in your connected accounts
const accounts = await client.external.listAccounts();
console.log(accounts.data);
// [{ id: 'ext_abc123', platform: 'google_ads', status: 'active', accountName: 'My Google Ads' }]After connecting, configure what data to sync and in which direction. You can push EventZR campaigns to external platforms, pull external data into EventZR, or enable bidirectional sync.
// Update sync configuration for a connected account
await client.external.updateAccount('ext_abc123', {
syncDirection: 'bidirectional', // 'push' | 'pull' | 'bidirectional'
syncFrequency: 'hourly', // 'realtime' | 'hourly' | 'daily' | 'manual'
syncEntities: {
campaigns: true,
audiences: true,
conversions: true,
budgets: false, // Do not sync budget changes
},
conflictResolution: 'eventzr_wins', // 'eventzr_wins' | 'external_wins' | 'manual'
});// Sync all connected accounts
const syncResult = await client.external.triggerSync();
console.log(syncResult.data);
// {
// syncId: 'sync_xyz789',
// accountsSynced: 3,
// status: 'in_progress',
// startedAt: '2026-03-09T10:00:00Z',
// }
// Sync a specific account only
const singleSync = await client.external.triggerSync({
accountIds: ['ext_abc123'],
entities: ['campaigns', 'conversions'],
});EventZR automatically maps fields between its internal schema and each external platform. Below are the default mappings for campaign data. Custom mappings can be configured via the mapping endpoints.
| EventZR Field | Google Ads | Meta Ads | TikTok Ads | LinkedIn Ads |
|---|---|---|---|---|
| name | campaign.name | campaign.name | campaign_name | name |
| status | campaign.status | effective_status | operation_status | status |
| budgetAmount | campaign_budget.amount_micros | daily_budget | budget | dailyBudget.amount |
| startDate | campaign.start_date | start_time | schedule_start_time | runSchedule.start |
| endDate | campaign.end_date | stop_time | schedule_end_time | runSchedule.end |
| bidStrategy | campaign.bidding_strategy_type | bid_strategy | bid_type | bidStrategy |
// Customize field mapping for a specific platform
await client.external.updateMapping({
platform: 'google_ads',
mappings: [
{
eventzrField: 'metadata.eventCategory',
externalField: 'campaign.labels',
transform: 'to_label', // Apply a transform function
},
{
eventzrField: 'targetingAudienceId',
externalField: 'ad_group.audience_setting.audience_id',
transform: 'lookup', // Map internal ID to external ID
},
],
});Campaign statuses are normalized between platforms. Below shows how EventZR statuses map to each external platform.
| EventZR Status | Google Ads | Meta Ads | TikTok Ads | LinkedIn Ads |
|---|---|---|---|---|
| draft | PAUSED | PAUSED | DISABLE | DRAFT |
| active | ENABLED | ACTIVE | ENABLE | ACTIVE |
| paused | PAUSED | PAUSED | DISABLE | PAUSED |
| completed | REMOVED | ARCHIVED | DELETE | COMPLETED |
All external network integration endpoints. Requires JWT authentication and x-tenant-id header.
| Method | Path | Description | Auth |
|---|---|---|---|
| GET | /ads/v1/external/accounts | List connected external ad network accounts | Yes |
| POST | /ads/v1/external/accounts | Connect a new external ad network account via OAuth | Yes |
| GET | /ads/v1/external/accounts/:id | Get external account details and sync status | Yes |
| PATCH | /ads/v1/external/accounts/:id | Update sync configuration for a connected account | Yes |
| DELETE | /ads/v1/external/accounts/:id | Disconnect an external ad network account | Yes |
| POST | /ads/v1/external/sync | Trigger a manual sync for all or specific accounts | Yes |
| GET | /ads/v1/external/sync/status | Get the latest sync status and history | Yes |
| GET | /ads/v1/external/mapping | View field mapping between EventZR and external platforms | Yes |
| PATCH | /ads/v1/external/mapping | Customize field mapping rules for synced data | Yes |
Begin by pulling data from external platforms into EventZR for unified reporting. Only enable push sync once you are confident in your field mappings.
Realtime sync generates many API calls and may hit rate limits on external platforms. Hourly sync provides a good balance of freshness and reliability.
When the same campaign is edited on both platforms between syncs, the conflict resolution strategy determines which version wins. Default is eventzr_wins.
Use GET /ads/v1/external/sync/status to check for sync failures. OAuth tokens can expire and need re-authorization.
Avoid syncing budget changes bidirectionally to prevent accidental overspend. Pick one platform as the source of truth for budgets.