Skip to content
Dashboard

Everflow

Use the Everflow connector to sync conversion events, click-level data, aggregated entity reports, and dimension tables (affiliates, offers, advertisers, campaigns) into your Athena lakehouse. This is a Blotout custom connector built on the Airbyte Connector Builder (declarative manifest).

  • A tag with Blotout Cloud set up (green checkmark in the Tags table)
  • An Everflow Network API key — generate it in Everflow under Control Center → Security → API keys. Must be a Network key (not affiliate, advertiser, or marketplace). The key is shown once at creation.
  • Know your region — standard networks use https://api.eflow.team/v1; EU-hosted networks use https://api-eu.eflow.team/v1

Follow the shared Create a pipeline steps until the source catalogue appears, then select Everflow.

On the Source step, configure the connector:

FieldPurpose
Schedule TypeHow the pipeline runs — typically Scheduled
Sync FrequencyHow often Airbyte syncs (for example, Every 24 hours)
Source NameName for this pipeline — used in the Athena schema <SOURCE_NAME>_<ENV>

Every request carries a single header — X-Eflow-API-Key. No OAuth flow is available for the Network API; API keys over HTTPS are the documented mechanism. Keys are long-lived with no documented expiry. Rotating a key means creating a new one in Everflow and editing the source — cursor state is untouched, no re-sync is needed.

  1. Under Everflow Configuration, paste your Network API Key into the API Key field.
FieldTypeRequiredDefaultDescription
api_keysecret stringYesEverflow Network API key. Sent as the X-Eflow-API-Key header. Generate under Control Center → Security → API keys.
start_datestringYesEarliest date to pull (YYYY-MM-DD). Conversion and click reporting is limited to the prior 365 days — an earlier start date returns nothing for out-of-range slices.
end_datestringNoLatest date to pull (YYYY-MM-DD). Leave blank to always pull through now (recommended for scheduled syncs). Set only for a bounded historical backfill.
timezone_idintegerNo67Everflow timezone id for the report window. 67 = UTC. Response timestamps are always UTC epoch seconds, so non-UTC values make the cursor and request window disagree by the offset. Change only to match the network’s reporting timezone, and raise lookback_days to compensate. Full list: GET /meta/timezones.
currency_idstringNo"USD"Currency for payout/revenue amounts in conversions and entity_report (ISO code). Full list: GET /meta/currencies.
page_sizeintegerNo500Page size for conversions and the affiliates/offers/advertisers table endpoints (max 2000). Ignored by clicks and entity_report, which are unpaginated.
report_step_daysintegerNo7Size of each conversions time slice. Smaller windows mean more requests but smaller responses; the API allows up to a 1-year range per call.
clicks_step_hoursintegerNo24Size of each clicks time slice. The click endpoint returns at most 10,000 rows per request and truncates silently beyond that. If a network does more than 10k clicks/day, lower this to 6 or 1 and re-backfill.
lookback_daysintegerNo1Days to rewind before the stored cursor on each incremental sync. Covers conversions that are approved, scrubbed, or adjusted after the fact. Records are appended — deduplicate latest-per-key downstream.
entity_columnsarrayNo["date", "offer", "affiliate"]Columns to group the aggregated entity_report by. Common values: date, hour, offer, affiliate, advertiser, campaign, sub1sub10, source_id, country, platform, device_type. High-cardinality columns count against a separate 1,000 queries/hour granular-report quota.
include_eventsbooleanNofalseWhen true, sets show_events on the conversion report. Events arrive in the same array as conversions with is_event = true — filter on that downstream.
base_urlstringNo"https://api.eflow.team/v1"Override for EU-hosted networks. Default is https://api.eflow.team/v1 — EU networks use https://api-eu.eflow.team/v1.

The Everflow source connector supports the following sync modes:

  • Incremental Sync — Append
StreamEndpointGrainCursor FieldPrimary Key
conversionsPOST /networks/reporting/conversionsPer conversionconversion_unix_timestampconversion_id
clicksPOST /networks/reporting/clicks/streamPer clickunix_timestamptransaction_id
entity_reportPOST /networks/reporting/entity/tableDay x groupingreport_dateNone
affiliatesPOST /networks/affiliatestablePer affiliatetime_savednetwork_affiliate_id
offersPOST /networks/offerstablePer offertime_savednetwork_offer_id
advertisersPOST /networks/advertiserstablePer advertisertime_savednetwork_advertiser_id
campaignsGET /networks/campaignsPer Smart Linktime_savednetwork_campaign_id

All 7 streams support Incremental | Append sync mode. conversions, clicks, and entity_report use server-side cursors; affiliates, offers, advertisers, and campaigns use client-side cursors.

  • Server-side (conversions, clicks, entity_report): the cursor value is written into the request window, so the API only returns the slice requested.
  • Client-side (affiliates, offers, advertisers, campaigns): these endpoints have no date filter and always return the full set. The connector fetches in one pass and drops rows whose time_saved is older than the stored cursor.
  • lookback_days (default 1) rewinds the window each run so late corrections are picked up.

One row per conversion. With include_events = true, post-conversion events arrive in the same array with is_event = true. The relationship object contains offer, affiliate, advertiser, campaign, and account manager blocks — flatten in dbt.

FieldJSON TypeAthena TypeNotes
conversion_idstringvarcharPrimary key
conversion_unix_timestampintegerbigintUTC epoch seconds — cursor field
click_unix_timestampintegerbigint
transaction_idstringvarchar
order_idstringvarchar
statusstringvarchar
payoutnumberdouble
revenuenumberdouble
sale_amountnumberdouble
payout_typestringvarchar
revenue_typestringvarchar
currency_idstringvarchar
is_eventbooleanboolean
eventstringvarchar
is_scrubbooleanboolean
is_view_throughbooleanboolean
error_codeintegerbigint
error_messagestringvarchar
coupon_codestringvarchar
emailstringvarcharPII — present only if the network passes it
notesstringvarchar
refererstringvarchar
urlstringvarchar
source_idstringvarchar
network_offer_payout_revenue_idintegerbigint
previous_network_offer_idintegerbigint
conversion_user_ipstringvarcharPII
session_user_ipstringvarcharPII
http_user_agentstringvarchar
platformstringvarchar
os_versionstringvarchar
browserstringvarchar
brandstringvarchar
device_modelstringvarchar
device_typestringvarchar
carrierstringvarchar
ispstringvarchar
languagestringvarchar
countrystringvarchar
regionstringvarchar
citystringvarchar
dmaintegerbigint
app_idstringvarchar
idfastringvarcharPII — device identifier
idfa_md5stringvarchar
idfa_sha1stringvarchar
google_ad_idstringvarcharPII — device identifier
google_ad_id_md5stringvarchar
google_ad_id_sha1stringvarchar
android_idstringvarcharPII — device identifier
android_id_md5stringvarchar
android_id_sha1stringvarchar
sub1sub10stringvarcharSub-tracking parameters
adv1adv10stringvarcharAdvertiser-side tracking parameters
relationshipobjectstruct / jsonoffer / affiliate / advertiser / campaign / account_manager blocks

One row per click. No pagination — uses window sizing only. The endpoint returns at most 10,000 rows per request and truncates silently beyond that cap.

FieldJSON TypeAthena TypeNotes
transaction_idstringvarcharPrimary key
unix_timestampintegerbigintUTC epoch seconds — cursor field
is_uniquebooleanboolean
has_conversionbooleanboolean
tracking_urlstringvarchar
urlstringvarchar
refererstringvarchar
source_idstringvarchar
payoutnumberdouble
revenuenumberdouble
payout_typestringvarchar
revenue_typestringvarchar
currency_idstringvarchar
coupon_codestringvarchar
error_codeintegerbigint
error_messagestringvarchar
error_filter_idintegerbigint
project_idstringvarchar
user_ipstringvarcharPII
is_view_throughbooleanboolean
is_asyncbooleanboolean
is_pass_throughbooleanboolean
is_sdk_clickbooleanboolean
is_test_modebooleanboolean
server_side_urlstringvarchar
server_side_outputstringvarchar
custom_landing_page_idintegerbigint
redirect_methodstringvarchar
creative_idintegerbigint
category_idintegerbigint
previous_network_offer_idintegerbigint
idfastringvarcharPII — device identifier
idfa_md5stringvarchar
idfa_sha1stringvarchar
google_ad_idstringvarcharPII — device identifier
google_ad_id_md5stringvarchar
google_ad_id_sha1stringvarchar
android_idstringvarcharPII — device identifier
android_id_md5stringvarchar
android_id_sha1stringvarchar
sub1sub10stringvarcharSub-tracking parameters
relationshipobjectstruct / jsonoffer / advertiser / affiliate / device_information / geolocation / campaign

The aggregated report behind the Everflow UI, one request per day. Rows are structured — columns[] holds the grouping values (in entity_columns order) and reporting{} holds the metrics. report_date is stamped by the connector because the API returns no top-level date.

FieldJSON TypeAthena TypeNotes
report_datestringvarcharYYYY-MM-DD, stamped from the request window — cursor field
columnsarray<object>arrayGrouping values in entity_columns order
custom_metric_columnsarray<object>array
usm_columnsarray<object>array
reportingobjectstruct / jsonAggregated metrics

Dimension table — the partners promoting offers. Join to conversions.relationship.affiliate or the affiliate id inside entity_report.columns.

FieldJSON TypeAthena TypeNotes
network_affiliate_idintegerbigintPrimary key
network_idintegerbigint
namestringvarchar
account_statusstringvarchar
account_manager_idintegerbigint
account_manager_namestringvarchar
account_executive_idintegerbigint
account_executive_namestringvarchar
today_revenuestringvarcharFormatted string, e.g. "$1,234.00"
balancenumberdouble
is_payablebooleanboolean
payment_typestringvarchar
payment_termsstringvarchar
network_country_codestringvarchar
network_traffic_source_idintegerbigint
global_tracking_domain_urlstringvarchar
last_loginintegerbigintUTC epoch seconds
time_createdintegerbigintUTC epoch seconds
time_savedintegerbigintUTC epoch seconds — cursor field
labelsarray<string>array
relationshipobjectstruct / json

Dimension table — what is being promoted, with payout/revenue terms and caps.

FieldJSON TypeAthena TypeNotes
network_offer_idintegerbigintPrimary key
network_idintegerbigint
network_advertiser_idintegerbigint
network_offer_group_idintegerbigint
namestringvarchar
offer_statusstringvarchar
visibilitystringvarchar
currency_idstringvarchar
payout_typestringvarchar
revenue_typestringvarchar
default_payoutnumberdouble
default_revenuenumberdouble
percent_payoutnumberdouble
percent_revenuenumberdouble
destination_urlstringvarchar
preview_urlstringvarchar
thumbnail_urlstringvarchar
categorystringvarchar
today_clicksintegerbigint
today_revenuestringvarchar
is_caps_enabledbooleanboolean
daily_conversion_capintegerbigint
weekly_conversion_capintegerbigint
monthly_conversion_capintegerbigint
global_conversion_capintegerbigint
daily_payout_capnumberdouble
weekly_payout_capnumberdouble
monthly_payout_capnumberdouble
global_payout_capnumberdouble
date_live_untilstringvarchar
time_createdintegerbigintUTC epoch seconds
time_savedintegerbigintUTC epoch seconds — cursor field
labelsarray<string>array
relationshipobjectstruct / json

Dimension table — who owns the offers. Also the stream Airbyte’s connection check hits to validate the API key.

FieldJSON TypeAthena TypeNotes
network_advertiser_idintegerbigintPrimary key
network_idintegerbigint
namestringvarchar
account_statusstringvarchar
account_manager_idintegerbigint
account_manager_namestringvarchar
sales_manager_idintegerbigint
sales_manager_namestringvarchar
today_revenuestringvarchar
verification_tokenstringvarchar
time_createdintegerbigintUTC epoch seconds
time_savedintegerbigintUTC epoch seconds — cursor field
labelsarray<string>array
relationshipobjectstruct / json

Smart Links. Everflow publishes no field list for this payload, so the schema and time_saved cursor are assumed — verify on the first live run.

FieldJSON TypeAthena TypeNotes
network_campaign_idintegerbigintPrimary key
network_idintegerbigint
namestringvarchar
campaign_statusstringvarchar
time_createdintegerbigintUTC epoch seconds
time_savedintegerbigintUTC epoch seconds — cursor field (assumed)
relationshipobjectstruct / json
LimitValueHow the connector handles it
Request rate30 req/s, burst 50 (network key)429 responses carry X-RateLimit-Reset (unix ts); the connector waits until then, up to 5 retries with exponential backoff for 5xx.
Reporting concurrency10 concurrent /reporting/*Streams are read sequentially — never approached.
Click response size10,000 rows, no paginationOne clicks_step_hours window per request (default 24h). Lower to 6 or 1 for high-volume networks.
Entity report size10,000 rows / 367-day rangeOne day per request, which also makes report_date exact.
Conversion historyPrior 365 days, 1-year windowreport_step_days (default 7) per request; a start_date older than 365 days simply yields empty slices.
Granular report quota1,000 queries/hourOnly triggered by high-cardinality entity_columns (geo, device, sub1–10). Keep the default grouping unless a dashboard needs more.

from/to in the request body are interpreted as midnight in the requested timezone_id, but every *_unix_timestamp in the response is UTC epoch seconds — and that is what the incremental cursor stores. timezone_id = 67 is UTC and keeps the two aligned.

Setting a non-UTC timezone_id makes the stored cursor and the requested window disagree by the offset, which clips records at each slice boundary. If a network insists on local-time reporting, set the id and raise lookback_days to cover the offset.

conversions can carry email, conversion_user_ip, session_user_ip, http_user_agent, and raw or hashed device ids (idfa, google_ad_id, android_id) when the network passes them through. clicks carries user_ip and the same device ids. They are declared in the schema so they land typed rather than silently. Drop or hash them in dbt if the client’s agreement does not cover storing them.

  • Schema: everflow_<client>_prod.*, one table per stream
  • conversions.relationship already carries the offer / affiliate / advertiser / campaign blocks, so attribution queries work off that one table. The dimension streams add names, statuses, and payout terms.
  • Deduplication example for conversions:
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (
PARTITION BY conversion_id
ORDER BY _airbyte_extracted_at DESC
) AS rn
FROM everflow_<client>_prod.conversions
) WHERE rn = 1
TablePartition by
conversionsconversion_id
clickstransaction_id
entity_reportreport_date + the grouping ids from columns[]
affiliates / offers / advertisers / campaignsTheir network_*_id
  • Client creates a Network API key and sends it over a secure channel (shown once)
  • Confirm region — EU networks need base_url = https://api-eu.eflow.team/v1
  • Local smoke test: cd connectors/source-everflow/v1 && ./test_local.sh <key>
  • Publish the image: ./build_and_deploy.sh (or merge to main — CI builds it)
  • Airbyte → Settings → Sources → New → Add Docker Connector → blotout/source-everflow, tag 1.0.0
  • Create the source with the key + start date; run check and discover
  • Create the connection with all 7 streams on Incremental | Append
  • First sync: confirm click windows never return exactly 10,000 rows; lower clicks_step_hours if they do
  • Confirm entity_report rows carry report_date and the columns / reporting split
  • Confirm campaigns records actually contain time_saved
  • Point dbt at everflow_<client>_prod and build the dedupe views
VersionDateDescription
1.0.0Initial release with 7 streams: conversions, clicks, entity_report, affiliates, offers, advertisers, campaigns

Continue through the Schema and Summary steps to choose streams and confirm the connection. Save and run the first sync.

After a successful sync, Airflow creates an organization-scoped DAG for the pipeline, and dbt models feed downstream analytics.