Pulls the last 30 days of performance by country, computes clicks, conversions, CVR, and revenue per geo, compares each country’s CVR to your network average, and highlights the countries converting well but barely getting any traffic. The output is a ranked opportunity table: countries where the data says “this works” but nobody’s scaling it yet. Ten minutes, one prompt, no manual spreadsheet work.
"The only countries that get optimized are the very best and the very worst. Everything in the middle just runs on autopilot."
Country-level performance comes up constantly. The question is always some version of "which countries are working" or "where should we be spending more." But when you're running campaigns across 20, 30, 50 countries, the economics of manual optimization don't pencil out. You optimize your top 2 geos because that's where the money is. You cut your worst 2 because that's where the losses are. Everything between ranks 3 and 48 just runs on autopilot. The result is a portfolio with hidden winners that never get scaled and quiet losers that keep bleeding budget unnoticed.
Everflow's Reporting page can filter by country. What it doesn't do is compute "above-average CVR + below-average traffic" in one view. That comparison is the gap. It's the difference between knowing that Peru has a 4.2% CVR (nice) and knowing that Peru has a 4.2% CVR against your 1.8% network average but only 200 clicks last month (actionable).
Geo-level reporting is our biggest pain. We're running campaigns across countries with completely different player values. When you blend those together, the numbers just don't make any sense.
One universal foundation prompt that loads Everflow's API context into any AI.
# Everflow API Foundation Prompt
## Role & Objective
You are an Everflow API specialist. Your job is to write
robust, accurate scripts and answer questions about
Everflow's partner marketing platform.
## Foundational Knowledge Base
Before writing any code, ingest the official LLM docs:
https://developers.everflow.io/llms.txtSame prompt across Claude, ChatGPT, and Gemini. Pulls one month of performance grouped by country, computes CVR per geo, and flags the countries worth investigating.
# role
You are an Everflow geographic performance analyst.
# inputs
api_key = {API_KEY}
network_id = {NETWORK_ID}
threshold = {THRESHOLD} # minimum clicks to count as "scaled" (default 500)
window_days = 30 # default last 30 days
timezone = {TIMEZONE} # e.g. America/New_York
currency = {CURRENCY} # default USD
# task
1. Compute the date range: today minus {window_days} through yesterday.
2. POST /v1/networks/reporting/entity
body: {
from: "{from}", to: "{to}",
columns: [{ column: "country" }],
query: { filters: [], exclusions: [] },
sort_columns: [{ column: "revenue", direction: "desc" }],
timezone_id: 80,
currency_id: "USD"
}
3. From the response, extract per-country:
- country name
- clicks
- conversions (total_conversions)
- revenue
- payout
- CVR = conversions / clicks * 100
4. Compute network-wide averages:
- avg_cvr = total conversions across all countries / total clicks * 100
- median_clicks = median of per-country click counts (excluding 0-click countries)
5. Classify each country:
- "Opportunity" = CVR > avg_cvr AND clicks < {threshold}
- "Scaled" = CVR > avg_cvr AND clicks >= {threshold}
- "Underperforming" = CVR <= avg_cvr AND clicks >= {threshold}
- "Low signal" = CVR <= avg_cvr AND clicks < {threshold}
6. Build two tables:
TABLE 1: OPPORTUNITY COUNTRIES (sorted by CVR descending)
| Country | Clicks | Conversions | CVR | vs Avg | Revenue | Classification |
TABLE 2: FULL COUNTRY BREAKDOWN (sorted by revenue descending)
| Country | Clicks | Conversions | CVR | Revenue | Payout | Classification |
7. Summary block:
- Total countries with traffic: {N}
- Network average CVR: {avg_cvr}%
- Opportunity countries found: {count}
- Top 3 opportunities by CVR gap (CVR minus avg_cvr)
- Estimated revenue upside: for each opportunity country,
compute "if clicks scaled to {threshold}, revenue would be ~${projected}"
using that country's current revenue-per-click.
8. Return the full analysis as Markdown.
# guardrails
- Exclude countries with fewer than 10 clicks from the Opportunity list.
A 50% CVR on 2 clicks is noise, not signal.
- Round CVR to 1 decimal place, currency to whole dollars.
- If a country has 0 clicks, skip it entirely.
- Any country with fewer than 50 clicks gets a "small sample" flag.
- Use the API's native currency conversion (currency_id parameter)
so all revenue figures are in one currency.
- Don't count test traffic (affiliate_id = 1) in the country totals.# role
You are an Everflow geographic performance analyst.
# inputs
api_key = {API_KEY}
network_id = {NETWORK_ID}
threshold = {THRESHOLD} # minimum clicks to count as "scaled" (default 500)
window_days = 30 # default last 30 days
timezone = {TIMEZONE} # e.g. America/New_York
currency = {CURRENCY} # default USD
# task
1. Compute the date range: today minus {window_days} through yesterday.
2. POST /v1/networks/reporting/entity
body: {
from: "{from}", to: "{to}",
columns: [{ column: "country" }],
query: { filters: [], exclusions: [] },
sort_columns: [{ column: "revenue", direction: "desc" }],
timezone_id: 80,
currency_id: "USD"
}
3. From the response, extract per-country:
- country name
- clicks
- conversions (total_conversions)
- revenue
- payout
- CVR = conversions / clicks * 100
4. Compute network-wide averages:
- avg_cvr = total conversions across all countries / total clicks * 100
- median_clicks = median of per-country click counts (excluding 0-click countries)
5. Classify each country:
- "Opportunity" = CVR > avg_cvr AND clicks < {threshold}
- "Scaled" = CVR > avg_cvr AND clicks >= {threshold}
- "Underperforming" = CVR <= avg_cvr AND clicks >= {threshold}
- "Low signal" = CVR <= avg_cvr AND clicks < {threshold}
6. Build two tables:
TABLE 1: OPPORTUNITY COUNTRIES (sorted by CVR descending)
| Country | Clicks | Conversions | CVR | vs Avg | Revenue | Classification |
TABLE 2: FULL COUNTRY BREAKDOWN (sorted by revenue descending)
| Country | Clicks | Conversions | CVR | Revenue | Payout | Classification |
7. Summary block:
- Total countries with traffic: {N}
- Network average CVR: {avg_cvr}%
- Opportunity countries found: {count}
- Top 3 opportunities by CVR gap
- Estimated revenue upside per opportunity country
8. Return the full analysis as Markdown.
# guardrails
- Exclude countries with fewer than 10 clicks from the Opportunity list.
- Round CVR to 1 decimal place, currency to whole dollars.
- If a country has 0 clicks, skip it entirely.
- Any country with fewer than 50 clicks gets a "small sample" flag.
- Use the API's native currency conversion so all figures are in one currency.
- Don't count test traffic (affiliate_id = 1) in the country totals.# role
You are an Everflow geographic performance analyst.
# inputs
api_key = {API_KEY}
network_id = {NETWORK_ID}
threshold = {THRESHOLD} # minimum clicks to count as "scaled" (default 500)
window_days = 30 # default last 30 days
timezone = {TIMEZONE} # e.g. America/New_York
currency = {CURRENCY} # default USD
# task
1. Compute the date range: today minus {window_days} through yesterday.
2. POST /v1/networks/reporting/entity
body: {
from: "{from}", to: "{to}",
columns: [{ column: "country" }],
query: { filters: [], exclusions: [] },
sort_columns: [{ column: "revenue", direction: "desc" }],
timezone_id: 80,
currency_id: "USD"
}
3. From the response, extract per-country:
- country name, clicks, conversions, revenue, payout
- CVR = conversions / clicks * 100
4. Compute network-wide averages:
- avg_cvr = total conversions / total clicks * 100
- median_clicks = median of per-country click counts (excluding 0-click)
5. Classify each country:
- "Opportunity" = CVR > avg_cvr AND clicks < {threshold}
- "Scaled" = CVR > avg_cvr AND clicks >= {threshold}
- "Underperforming" = CVR <= avg_cvr AND clicks >= {threshold}
- "Low signal" = CVR <= avg_cvr AND clicks < {threshold}
6. Build two tables:
TABLE 1: OPPORTUNITY COUNTRIES (CVR desc)
TABLE 2: FULL COUNTRY BREAKDOWN (revenue desc)
7. Summary: total countries, avg CVR, opportunity count, top 3 by CVR gap,
revenue upside estimates.
8. Return as Markdown.
# guardrails
- Exclude countries with <10 clicks from Opportunity.
- Round CVR to 1 decimal, currency to whole dollars.
- Skip 0-click countries. Flag <50-click countries as "small sample."
- Use currency_id for unified currency. Skip test traffic (affiliate_id=1).MCP mode: the agent calls Everflow directly, no API key to paste. (MCP is a connector that lets your AI tool talk to Everflow on its own.) The MCP pulls per-country clicks, conversions, and CVR so the agent can compare each geo against a fair baseline; it exposes no per-conversion revenue value, so dollar upside only appears if you supply your own number.
You've got an Everflow MCP server connected (read-only Reporting access is enough). Run the "Geographic Opportunity Map" recipe below EXACTLY as written. It is calibrated to the live Everflow MCP tool set and arg formats — follow the tool names and string formats verbatim or the first call will fail.
# role
You are an Everflow geographic performance analyst. You find countries that convert well but get very little traffic — untapped geos worth scaling — by comparing each country's conversion rate (CVR) against a fair network baseline, then classifying every country as Opportunity / Scaled / Underperforming / Low Signal. You output a Slack-ready digest.
# inputs (USER-SUPPLIED — set these before running; sensible defaults given)
- WINDOW: last 30 days. Compute FROM = today − 30 days, TO = today, both as YYYY-MM-DD.
- SCALED_CLICK_THRESHOLD = 500 (a country at/above this is "already scaled," not an opportunity). If you prefer a data-driven bar, set it to 25% of the median clicks across qualifying countries after Step 4.
- MIN_CLICKS_OPPORTUNITY = 10 (hard guardrail: never call anything with <10 clicks an opportunity — too little signal).
- SMALL_SAMPLE_FLAG = 50 (countries with 10–49 clicks are opportunities but get a "small sample" flag).
- REV_PER_CONVERSION (optional): your average revenue or margin per conversion in your currency. ONLY set this if YOU know it. The MCP does not expose a per-conversion revenue/margin value, so projected upside is only meaningful if you pass your own number. If unset, skip the dollar projection and rank on conversions instead.
# critical MCP arg formats (verbatim — the #1 cause of failed runs)
- `dimensions` and `metrics` MUST be COMMA-SEPARATED STRINGS, never JSON arrays. Use `dimensions: "country"` and `metrics: "clicks,conversions,cvr"`. Passing `["country"]` returns INVALID_ARGUMENT.
- Percent metrics (cvr) come back as ACTUAL PERCENTAGES (e.g. 39.4 means 39.4%), not 0–1 fractions.
- The performance report is capped at 100 rows/page and 500 rows total. You MUST paginate with the `cursor` token until `next_cursor` is empty / `has_more` is false BEFORE computing anything. A single un-paginated call returns a non-deterministic subset and will corrupt the baseline and the country count. If a response shows `result_capped: true`, the full set exceeded 500 rows — narrow with a date range or `filters` clause and note it.
- If you touch any list_* / count_entities tool, its `filters` argument must be a JSON STRING (e.g. `filters: "{\"network_affiliate_id\":123}"`). A nested object or top-level args are silently ignored and return everything. (This recipe doesn't require those tools; noted so you don't misuse them.)
# steps
1) Confirm identity and currency.
Call `get_account_info`. Note the network name, network ID, default timezone, and currency to label the digest. Read-only access is sufficient.
2) Confirm the exact dimension + metric keys (don't guess).
Call `get_report_schema`. Verify `country` exists as a dimension and `clicks`, `conversions`, `cvr` exist as metrics. (`country_code` also exists if you prefer ISO codes.) If a key differs on your network, use the schema's exact spelling below.
3) Pull the network baseline (headline totals).
Call `run_network_summary` with `from: FROM`, `to: TO`. Record total clicks, total conversions, and the network CVR. SKEW TRAP: this CVR is CLICK-WEIGHTED, so one dominant geo or test offer can drag it far from the typical country. Do not use it as the opportunity bar — compute a fairer baseline in Step 5. Keep it only as a reference line.
4) Pull the per-country breakdown, paginated to completion.
Call `run_performance_report` with:
from: FROM
to: TO
dimensions: "country"
metrics: "clicks,conversions,cvr"
sort_by: "clicks"
sort_direction: "desc"
page_size: 100
Then loop: while the response returns a `next_cursor`, call again with the same args plus `cursor: <next_cursor>` and append rows. Stop when `next_cursor` is empty. (Optional: add `metric_filters: "clicks>0"` to drop zero-click rows server-side.) You should end with the full country list. Confirm you did NOT hit `result_capped: true`; if you did, split the window and merge.
5) Compute a FAIR baseline (the analytical heart — don't skip).
From the full country list:
a. Drop countries with 0 clicks (test/noise).
b. Identify dominant-outlier geos: any single country holding >40% of all clicks. EXCLUDE these from the baseline and flag them separately — including them makes the average meaningless.
c. BASELINE_CVR = the UNWEIGHTED MEAN of the per-country CVRs across the remaining qualifying countries (each country counts once, regardless of size). Also record the median clicks across these countries. State the baseline explicitly, e.g. "Baseline = unweighted mean country CVR = 18.0% ({dominant country} excluded as a 90%-of-clicks outlier; network click-weighted CVR was 39.4%)."
6) Classify every country.
- OPPORTUNITY → CVR > BASELINE_CVR AND clicks >= MIN_CLICKS_OPPORTUNITY AND clicks < SCALED_CLICK_THRESHOLD. (Add "small sample" tag if clicks < SMALL_SAMPLE_FLAG.)
- SCALED → clicks >= SCALED_CLICK_THRESHOLD. Sub-label "scaled, high-CVR" if CVR > BASELINE_CVR, else "scaled, underperforming."
- UNDERPERFORMING → clicks >= MIN_CLICKS_OPPORTUNITY but CVR <= BASELINE_CVR and below the scaled threshold.
- LOW SIGNAL → clicks < MIN_CLICKS_OPPORTUNITY (excluded from opportunities regardless of CVR — e.g. a 1-click 100% CVR country).
7) Rank and estimate upside.
- Opportunity Countries table: sort by CVR descending.
- Full Country Breakdown: sort by CONVERSIONS descending. Revenue can come back 0 or unpopulated on some networks, in which case a revenue sort is empty — conversions is the honest volume proxy. Sort by revenue ONLY if the report actually returned non-zero revenue for your network.
- Upside: if REV_PER_CONVERSION was supplied, per opportunity country estimate an illustrative added-revenue figure = (intended added clicks you plan to send) × (country CVR / 100) × REV_PER_CONVERSION. Label it "illustrative, based on your supplied per-conversion value." If REV_PER_CONVERSION is unset, express upside as "conversions currently captured at high CVR on low traffic" and skip dollars — never fabricate a revenue number.
# output format (Slack-ready digest)
*🌍 Geographic Opportunity Map — {network name} (NID {id})*
_Window: {FROM} → {TO} · {timezone} · {currency}_
*Baseline*
• Network CVR (click-weighted, reference only): {network CVR}%
• Fair baseline (unweighted mean country CVR, outliers excluded): {BASELINE_CVR}%
• Dominant outlier(s) excluded: {country(s) + share of clicks}
• Countries analyzed: {N qualifying} · Opportunities found: {count}
*🚀 Opportunity Countries* (CVR above baseline, {MIN_CLICKS_OPPORTUNITY}–{SCALED_CLICK_THRESHOLD-1} clicks, sorted by CVR)
| Country | Clicks | Conv | CVR | Flag |
|---|---|---|---|---|
| … one row per opportunity; add "small sample" flag when clicks < {SMALL_SAMPLE_FLAG} … |
*📊 Full Country Breakdown* (sorted by conversions)
| Country | Clicks | Conv | CVR | Class |
|---|---|---|---|---|
| … Opportunity / Scaled (hi or under) / Underperforming / Low Signal … |
*Top CVR gaps* (opportunity CVR minus baseline, top 3): {country: +X.Xpp}, …
*Projected upside*: {dollar estimate if REV_PER_CONVERSION supplied, else "N conversions at high CVR waiting on traffic — supply a per-conversion value to dollarize"}
# guardrails recap
- Paginate to completion before any math (Step 4).
- Exclude >40%-of-clicks outliers from the baseline (Step 5b).
- Never label <10-click countries as opportunities (Low Signal instead).
- Tag 10–49-click opportunities "small sample."
- Comma-string `dimensions`/`metrics`; JSON-string filters if you ever call list_/count_ tools.
- Don't sort by or project revenue unless the report actually returned non-zero revenue.Connect the Everflow MCP, or grab an API key
If you have the Everflow MCP connected, you can skip the key entirely. MCP is a connector that lets your AI tool talk to Everflow on its own, so there is nothing to paste. No MCP yet? Generate a read-only key in Core Platform → Control Center → Security → API Keys → click the + API key button. Read-only on Reporting is enough.
Set your traffic threshold
What counts as low traffic depends on your program. A good starting point: any country below 25% of your median click volume. If your median country gets 2,000 clicks/month, the threshold is 500.
Run the prompt
With MCP connected, just run the prompt as written. On the API tab, first replace {API_KEY}, {NETWORK_ID}, and {THRESHOLD}, then run it. Default window is the last 30 days.
Read it in Claude, ChatGPT, or Gemini
The output is a country table with an Opportunity column highlighting geos that convert above your network average but sit below your traffic threshold. Takes 1 to 2 minutes. The same prompt works in any of the three.
Act on the top 3 opportunity countries
Start with the countries showing the highest CVR gap vs your network average. Ask your partners: can you send traffic here? If the CVR holds after 200+ clicks, scale it.
The interactive map above shows your country performance breakdown with opportunity countries highlighted. Hover over any dot for the full breakdown. The UK drill-down shows your top 5 affiliates by clicks, CVR, revenue, and month-over-month trend.
Not particularly. This recipe is designed for programs running in 3+ countries. If you're single-country, the same prompt can pivot by state or region (swap country for sub1 or sub2 if you're passing geo data in sub-parameters), but the "hidden geo opportunity" thesis works best with a portfolio of countries where the middle ones get ignored.
The prompt flags any country with fewer than 50 clicks as "small sample." A 4% CVR on 15 clicks could easily be 0% next month. The rule of thumb: use the opportunity list as a conversation starter with your partners ("can you send traffic to Peru?"), not as a guarantee. If the CVR holds after 200+ clicks, it's real.
Yes. The API returns revenue and payout in a single currency (converted via the currency_id parameter). The CVR comparison is conversion-rate based, not revenue-based, so payout differences per geo don't affect the opportunity classification. The revenue column gives you the dollar context, but the signal comes from CVR vs. the network average.
This recipe is most valuable for programs running in 3+ countries. Single-country operations won't find actionable opportunities here.
The strongest signal comes from iGaming, fintech, and multi-country e-commerce, where player or customer value differs dramatically by country. DTC brands with localized stores also benefit. Single-vertical programs in one region will see fewer "hidden" geos.
CVR on small samples is volatile. The prompt's 10-click floor and 50-click "small sample" flag exist to prevent false positives. Treat any opportunity country with under 200 clicks as a hypothesis, not a conclusion.
Multi-currency programs: the API normalizes to a single currency via currency_id, but revenue-per-click in a high-value market (Switzerland) and a low-value market (Turkey) are not directly comparable. The CVR signal is clean; the revenue upside estimate is approximate.
A caution on scale: this kind of optimization often yields marginal gains per country. The value of this recipe is in the discovery of the blind spot, not the size of each individual optimization. The countries you find may each contribute only a few thousand dollars, but the portfolio effect across 4-5 opportunity geos adds up.
Drop us the question you wish had a prompt. We'll write it, test it against real Everflow data, and ship it as the next recipe — usually within two weeks.
One Tuesday email. Latest industry news plus new recipes the day they ship. Unsubscribe in one click.
Share what's working with the Everflow API. Our team will reach out about details, timelines, and next steps.