Country Expansion Analysis

growth
expansion
international
Author

Julian Winternheimer

Published

February 2, 2026

Overview

This analysis attempts to identify the most promising international markets for Buffer to target after the US.

We’ll examine the country-level funnel from website traffic through signups and paid conversions to find markets that combine sufficient scale with strong conversion performance. We’ll also look at the current makeup of MAU and paying customers and factor those into a composite score that we’ll use to rank opportunities.

What We Found

The UK stands out as a top expansion opportunity when we factor in both funnel performance and existing user base. The UK accounts for around 12% of Buffer’s paying customers and 12% of MAU outside the US, which represents a significant base from which to grow.

Canada and Australia rank second and third, and Germany and France round out the top five, with solid conversion rates for each of these countries.

The composite score balances five factors: traffic volume, signup rate, conversion rate, MAU proportion, and paying customer proportion. Countries with high traffic volume but low conversion rates, such as India and Bangladesh, score lower, but are still worth considering.

On the flip side, countries with higher conversion rates but less traffic, like smaller European markets, are also pushed down the list a bit.

US Baseline

Before diving into international markets, let’s establish the US baseline to use as a reference point. The data spans 25 months from February 2024 through February 2026. Conversions and conversion rate refer to paid conversions that occurred within 60 days of signing up.

Code
funnel <- readRDS("country_funnel_data.rds")

us_data <- funnel %>%
  filter(country_iso_code == "US") %>%
  summarise(
    total_visitors = sum(visitors),
    total_signups = sum(signups),
    total_activations = sum(activations),
    total_conversions = sum(conversions)
  ) %>%
  mutate(
    signup_rate = total_signups / total_visitors,
    activation_rate = total_activations / total_signups,
    conversion_rate = total_conversions / total_signups
  )

cat("US Baseline Metrics:\n")
US Baseline Metrics:
Code
cat("  Visitors:", comma(us_data$total_visitors), "\n")
  Visitors: 11,245,681 
Code
cat("  Signups:", comma(us_data$total_signups), "\n")
  Signups: 408,945 
Code
cat("  Conversions:", comma(us_data$total_conversions), "\n")
  Conversions: 24,182 
Code
cat("  Signup Rate:", percent(us_data$signup_rate, accuracy = 0.1), "\n")
  Signup Rate: 3.6% 
Code
cat("  Conversion Rate:", percent(us_data$conversion_rate, accuracy = 0.01), "\n")
  Conversion Rate: 5.91% 

The US has a 3.6% signup rate and 5.9% conversion rate. These metrics will serve as our benchmarks when evaluating other potential markets.

Data Collection

The data comes from the dbt_buffer.country_expansion_funnel table, which tracks the full funnel from website sessions through paid conversions by country and month. The data spans from February 2024 to February 2026. and includes 109 countries.

Code
sql <- "
select
  month
  , country_iso_code
  , country_name
  , continent_code
  , continent_name
  , sessions
  , visitors
  , signups
  , activations
  , conversions
  , traffic_to_signup_rate
  , signup_to_activation_rate
  , signup_to_conversion_rate
  , activation_to_conversion_rate
  , mau_proportion
  , paying_customer_proportion
from dbt_buffer.country_expansion_funnel
order by month desc, visitors desc
"

funnel <- bq_query(sql = sql)
saveRDS(funnel, "country_funnel_data.rds")

Data Aggregation

We aggregate across all available months to get more reliable conversion rate estimates. We exclude the US because it’s already Buffer’s primary market. We also filter to markets with at least 1,000 visitors to make sure that the sample sizes are meaningful.

Code
# get the most recent non-null mau and paying customer proportions for each country
latest_mau <- funnel %>%
  filter(country_iso_code != "US",
         country_iso_code != "Unknown",
         !is.na(mau_proportion)) %>%
  group_by(country_iso_code) %>%
  filter(month == max(month)) %>%
  ungroup() %>%
  select(country_iso_code, mau_proportion)

latest_paying <- funnel %>%
  filter(country_iso_code != "US",
         country_iso_code != "Unknown",
         !is.na(paying_customer_proportion)) %>%
  group_by(country_iso_code) %>%
  filter(month == max(month)) %>%
  ungroup() %>%
  select(country_iso_code, paying_customer_proportion)

latest_proportions <- latest_mau %>%
  full_join(latest_paying, by = "country_iso_code")

# aggregate funnel metrics across all months
country_totals <- funnel %>%
  filter(country_iso_code != "US",
         country_iso_code != "Unknown") %>%
  group_by(country_iso_code, country_name, continent_code, continent_name) %>%
  summarise(
    total_sessions = sum(sessions, na.rm = TRUE),
    total_visitors = sum(visitors, na.rm = TRUE),
    total_signups = sum(signups, na.rm = TRUE),
    total_activations = sum(activations, na.rm = TRUE),
    total_conversions = sum(conversions, na.rm = TRUE),
    n_months = n_distinct(month),
    .groups = "drop"
  ) %>%
  mutate(
    signup_rate = total_signups / total_visitors,
    activation_rate = ifelse(total_signups > 0, total_activations / total_signups, 0),
    conversion_rate = ifelse(total_signups > 0, total_conversions / total_signups, 0)
  ) %>%
  # join the latest proportions

  left_join(latest_proportions, by = "country_iso_code")

country_totals <- country_totals %>%
  filter(total_visitors >= 1000)

cat("Countries with 1,000+ visitors:", nrow(country_totals), "\n")
Countries with 1,000+ visitors: 98 
Code
cat("Total visitors (excl. US):", comma(sum(country_totals$total_visitors)), "\n")
Total visitors (excl. US): 20,089,357 
Code
cat("Total signups (excl. US):", comma(sum(country_totals$total_signups)), "\n")
Total signups (excl. US): 1,195,899 
Code
cat("Total conversions (excl. US):", comma(sum(country_totals$total_conversions)), "\n")
Total conversions (excl. US): 28,810 

Ranking Countries by Opportunity

To find the best expansion markets, we balance five factors:

  1. Traffic volume, which tells us if the market is big enough to be worth investing in.
  2. Signup rate, which measures how often visitors from this country sign up for Buffer.
  3. Conversion rate, which measures how often those signups become paying customers.
  4. MAU proportion, which tells us what share of Buffer’s monthly active users are from this country.
  5. Paying customer proportion, which tells us what share of Buffer’s paying customers are from this country.

The first three factors tell us about the funnel efficiency. The last two tell us about the current user/customer base. Countries with more existing users and paying customers may be easier to expand since there’s already word-of-mouth and market awareness.

We weight these factors as follows: 15% volume, 20% signup rate, 25% conversion rate, 15% MAU proportion, and 25% paying customer proportion. Each metric is scaled from 0-100 before combining. For volume, we use a logarithmic scale so huge markets like India don’t completely dominate.

Code
# function to scale any metric from 0-100
normalize <- function(x) {
  (x - min(x, na.rm = TRUE)) / (max(x, na.rm = TRUE) - min(x, na.rm = TRUE)) * 100
}

country_scored <- country_totals %>%
  filter(!is.na(mau_proportion), !is.na(paying_customer_proportion)) %>%
  mutate(
    # use log scale for visitors so huge markets don't dominate
    log_visitors = log10(total_visitors),
    # scale each component 0-100
    volume_score = normalize(log_visitors),
    signup_score = normalize(signup_rate),
    conversion_score = normalize(conversion_rate),
    mau_score = normalize(mau_proportion),
    paying_score = normalize(paying_customer_proportion),
    # weighted average
    opportunity_score = (0.15 * volume_score) +
                        (0.20 * signup_score) +
                        (0.25 * conversion_score) +
                        (0.15 * mau_score) +
                        (0.25 * paying_score)
  ) %>%
  arrange(desc(opportunity_score))

Top Expansion Opportunities

The table below ranks countries by their composite opportunity score using data from 2025 onwards. Markets at the top combine meaningful traffic volume, strong conversion performance, and an existing user base.

Code
# aggregate 2025+ data for the table
country_2025 <- funnel %>%
  filter(country_iso_code != "US",
         country_iso_code != "Unknown",
         month >= "2025-01-01") %>%
  group_by(country_iso_code, country_name, continent_name) %>%
  summarise(
    total_visitors = sum(visitors, na.rm = TRUE),
    total_signups = sum(signups, na.rm = TRUE),
    total_conversions = sum(conversions, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  mutate(
    signup_rate = total_signups / total_visitors,
    conversion_rate = ifelse(total_signups > 0, total_conversions / total_signups, 0)
  ) %>%
  left_join(latest_proportions, by = "country_iso_code") %>%
  filter(total_visitors >= 1000)

# score the 2025 data
country_2025_scored <- country_2025 %>%
  filter(!is.na(mau_proportion), !is.na(paying_customer_proportion)) %>%
  mutate(
    log_visitors = log10(total_visitors),
    volume_score = normalize(log_visitors),
    signup_score = normalize(signup_rate),
    conversion_score = normalize(conversion_rate),
    mau_score = normalize(mau_proportion),
    paying_score = normalize(paying_customer_proportion),
    opportunity_score = (0.15 * volume_score) +
                        (0.20 * signup_score) +
                        (0.25 * conversion_score) +
                        (0.15 * mau_score) +
                        (0.25 * paying_score)
  ) %>%
  arrange(desc(opportunity_score))

opportunity_table <- country_2025_scored %>%
  select(
    Country = country_name,
    Visitors = total_visitors,
    Signups = total_signups,
    `Signup Rate` = signup_rate,
    `Conv Rate` = conversion_rate,
    `MAU %` = mau_proportion,
    `Paying %` = paying_customer_proportion,
    Score = opportunity_score
  ) %>%
  head(100) %>%
  mutate(
    Visitors = comma(Visitors),
    Signups = comma(Signups),
    `Signup Rate` = percent(`Signup Rate`, accuracy = 0.1),
    `Conv Rate` = percent(`Conv Rate`, accuracy = 0.01),
    `MAU %` = percent(`MAU %`, accuracy = 0.1),
    `Paying %` = percent(`Paying %`, accuracy = 0.1),
    Score = round(Score, 1)
  )

kable(opportunity_table, align = "lrrrrrrr")
Country Visitors Signups Signup Rate Conv Rate MAU % Paying % Score
United Kingdom 997,483 73,356 7.4% 3.91% 11.7% 12.5% 66.2
Canada 853,941 24,438 2.9% 6.23% 4.4% 5.7% 45.6
Australia 218,662 16,117 7.4% 7.42% 2.8% 4.4% 43.2
Germany 541,680 23,445 4.3% 4.32% 3.3% 3.0% 34.6
The Netherlands 375,225 12,441 3.3% 4.81% 2.1% 2.3% 31.3
Switzerland 54,890 3,816 7.0% 7.18% 0.7% 1.1% 30.3
Kuwait 2,365 150 6.3% 11.33% 0.1% 0.1% 30.0
France 344,361 19,963 5.8% 3.00% 2.6% 1.8% 28.3
New Zealand 34,862 2,486 7.1% 7.12% 0.4% 0.5% 27.9
Japan 292,273 10,953 3.7% 3.80% 3.1% 1.1% 27.7
Denmark 32,395 1,852 5.7% 7.45% 0.3% 0.4% 27.4
India 1,690,049 97,531 5.8% 0.54% 4.1% 0.5% 25.2
Philippines 200,920 22,468 11.2% 2.08% 2.7% 0.2% 24.9
Spain 274,626 17,199 6.3% 2.35% 2.6% 0.9% 24.6
Ireland 128,298 2,364 1.8% 5.46% 0.5% 0.6% 24.4
Austria 146,840 2,661 1.8% 5.41% 0.5% 0.4% 24.1
United Arab Emirates 58,791 6,097 10.4% 3.99% 0.5% 0.6% 24.1
Saudi Arabia 50,739 5,513 10.9% 4.12% 0.4% 0.5% 23.9
Sweden 59,821 2,548 4.3% 5.30% 0.4% 0.5% 23.3
Poland 100,453 6,147 6.1% 4.03% 0.7% 0.5% 23.0
Israel 27,543 2,839 10.3% 4.54% 0.2% 0.3% 22.8
Nicaragua 1,041 10 1.0% 10.00% 0.0% 0.0% 22.4
Costa Rica 9,392 630 6.7% 6.51% 0.1% 0.0% 22.3
Belgium 149,849 3,596 2.4% 4.14% 0.5% 0.7% 22.3
Moldova 2,073 796 38.4% 0.00% 0.4% 0.0% 21.9
Brazil 157,708 18,603 11.8% 1.39% 1.4% 0.4% 21.8
Nigeria 150,099 24,107 16.1% 0.64% 1.3% 0.2% 21.8
Finland 53,603 1,651 3.1% 5.09% 0.3% 0.4% 21.7
Italy 200,687 8,335 4.2% 2.72% 1.2% 0.6% 21.5
South Korea 52,989 6,731 12.7% 2.64% 0.5% 0.2% 21.4
South Africa 91,580 8,803 9.6% 2.41% 0.9% 0.5% 21.4
Thailand 68,526 4,355 6.4% 3.81% 0.5% 0.2% 21.0
Norway 27,031 1,396 5.2% 5.09% 0.1% 0.2% 21.0
Cyprus 6,775 510 7.5% 5.88% 0.1% 0.1% 20.8
Mexico 178,089 7,537 4.2% 2.88% 0.9% 0.4% 20.6
Portugal 49,387 4,368 8.8% 3.16% 0.6% 0.3% 20.5
Albania 11,772 519 4.4% 5.78% 0.0% 0.0% 19.9
Pakistan 187,490 23,488 12.5% 0.64% 1.1% 0.1% 19.9
Kenya 49,913 8,234 16.5% 0.95% 0.5% 0.1% 19.3
Panama 110,089 413 0.4% 4.36% 0.1% 0.0% 19.2
Bangladesh 96,071 15,945 16.6% 0.31% 0.5% 0.0% 19.1
Indonesia 258,254 14,143 5.5% 1.47% 0.9% 0.3% 18.8
Singapore 265,958 4,025 1.5% 2.46% 0.7% 0.4% 18.8
Romania 65,678 3,535 5.4% 3.20% 0.3% 0.2% 18.8
Slovakia 15,728 985 6.3% 4.47% 0.1% 0.1% 18.8
Morocco 44,585 7,248 16.3% 0.99% 0.3% 0.1% 18.7
Puerto Rico 7,847 495 6.3% 5.05% 0.1% 0.1% 18.6
Argentina 38,034 4,441 11.7% 2.00% 0.4% 0.1% 18.4
Colombia 37,097 3,678 9.9% 2.50% 0.3% 0.1% 18.4
Estonia 17,172 488 2.8% 4.92% 0.1% 0.1% 18.2
Croatia 14,599 685 4.7% 4.67% 0.1% 0.1% 18.1
Hong Kong 52,092 2,559 4.9% 3.09% 0.3% 0.3% 18.1
Greece 30,194 1,983 6.6% 3.28% 0.3% 0.1% 17.9
Taiwan 23,379 2,305 9.9% 2.69% 0.2% 0.1% 17.8
Hungary 38,927 1,401 3.6% 3.43% 0.2% 0.1% 17.0
Egypt 83,626 9,278 11.1% 0.75% 0.5% 0.1% 17.0
Lebanon 10,064 943 9.4% 3.29% 0.1% 0.0% 16.7
Serbia 26,912 970 3.6% 3.71% 0.1% 0.0% 16.7
Malaysia 174,612 4,254 2.4% 1.97% 0.4% 0.2% 16.6
Lithuania 20,676 844 4.1% 3.79% 0.1% 0.1% 16.6
Bulgaria 39,939 1,084 2.7% 3.41% 0.2% 0.1% 16.5
Ukraine 43,574 4,675 10.7% 1.16% 0.2% 0.1% 16.0
Ghana 20,827 2,923 14.0% 0.89% 0.2% 0.0% 15.5
Slovenia 11,928 539 4.5% 3.71% 0.1% 0.1% 15.5
Chile 29,472 1,910 6.5% 1.94% 0.2% 0.1% 14.7
Dominican Republic 8,813 779 8.8% 2.44% 0.1% 0.0% 14.3
Luxembourg 109,290 507 0.5% 1.97% 0.0% 0.1% 14.1
Cambodia 9,219 1,004 10.9% 1.79% 0.1% 0.0% 14.0
China 196,656 917 0.5% 1.31% 0.1% 0.2% 14.0
Peru 18,977 1,869 9.8% 1.23% 0.1% 0.0% 13.8
Venezuela 10,441 1,091 10.4% 1.65% 0.1% 0.0% 13.7
Jamaica 5,254 419 8.0% 2.86% 0.1% 0.0% 13.7
Latvia 19,226 563 2.9% 2.84% 0.1% 0.0% 13.7
Uganda 8,106 1,254 15.5% 0.56% 0.2% 0.0% 13.6
Algeria 22,185 2,374 10.7% 0.76% 0.1% 0.0% 13.4
Ecuador 15,327 1,152 7.5% 1.82% 0.1% 0.0% 13.4
Qatar 7,714 602 7.8% 2.33% 0.1% 0.0% 13.3
Sri Lanka 24,036 2,180 9.1% 0.87% 0.1% 0.0% 13.1
Tanzania 3,201 347 10.8% 2.31% 0.1% 0.0% 13.0
Nepal 26,793 2,439 9.1% 0.33% 0.1% 0.0% 12.1
Russia 209,101 2,191 1.0% 0.37% 0.0% 0.0% 11.9
Jordan 6,078 430 7.1% 2.09% 0.0% 0.0% 11.8
Tunisia 10,287 1,246 12.1% 0.40% 0.1% 0.0% 11.8
Georgia 10,905 595 5.5% 1.34% 0.0% 0.0% 10.5
Iraq 18,388 1,117 6.1% 0.36% 0.0% 0.0% 9.7
Azerbaijan 3,192 226 7.1% 0.44% 0.0% 0.0% 6.8
Palestine 1,224 41 3.3% 0.00% 0.0% 0.0% 1.9
Oman 1,392 35 2.5% 0.00% 0.0% 0.0% 1.8
Kazakhstan 1,173 36 3.1% 0.00% 0.0% 0.0% 1.7
Libya 1,546 19 1.2% 0.00% 0.0% 0.0% 1.3
Guatemala 1,180 20 1.7% 0.00% 0.1% 0.0% 1.1

The UK leads the pack with the best balance of volume and conversion quality, followed by Canada, Australia, Germany, and The Netherlands. None of the other countries make up at least 2% of Buffer’s paying customer base.

Large markets like Brazil, The Philippines, and India are clustered together, mostly because of their high traffic volume and relatively low conversion rates.

Top Countries by Signups

India generates the most signups outside the US, followed by the UK.

Top Countries by Paid Conversions

The UK leads in paid conversions, followed by Canada and Australia. These three English-speaking markets account for a large share of all international conversions. Note that conversions drop to zero in recent months due to the 60-day attribution window.

Germany should be noted as the top non-English speaking market in terms of paid conversions.

Top Countries by Signup Rate

We filter to countries with at least 5,000 total visitors to ensure reliable rate estimates.

African, South Asian, and Latin American markets have the highest signup rates — often 3-5x higher than the US rate of 3.6%.

Top Countries by Paid Conversion Rate

We filter to countries with at least 500 total signups to ensure meaningful conversion rate estimates.

The conversion rate picture is almost the inverse of signup rates. Switzerland, Australia, Denmark, New Zealand, and Canada lead. These are markets with higher GDP per capita and established SaaS adoption patterns.

MAU Proportion by Country

This shows what share of Buffer’s monthly active users come from each country. Countries with a larger existing user base may be easier to expand since there’s already word-of-mouth and market awareness.

The UK has the largest share of MAU outside the US, followed by India and Canada. Japan may be one to keep an eye on, as the proportion has been growing steadily.

Paying Customer Proportion by Country

This shows what share of Buffer’s paying customers come from each country.

The UK contributes the largest share of paying customers outside the US, followed by Canada, Australia, and Germany.

Regional Summary

Code
regional_summary <- country_scored %>%
  group_by(continent_name) %>%
  summarise(
    Countries = n(),
    `Total Visitors` = sum(total_visitors),
    `Total Signups` = sum(total_signups),
    `Total Conversions` = sum(total_conversions),
    `Avg Signup Rate` = sum(total_signups) / sum(total_visitors),
    `Avg Conversion Rate` = ifelse(sum(total_signups) > 0,
                                    sum(total_conversions) / sum(total_signups), 0),
    .groups = "drop"
  ) %>%
  arrange(desc(`Total Visitors`)) %>%
  mutate(
    `Total Visitors` = comma(`Total Visitors`),
    `Total Signups` = comma(`Total Signups`),
    `Avg Signup Rate` = percent(`Avg Signup Rate`, accuracy = 0.1),
    `Avg Conversion Rate` = percent(`Avg Conversion Rate`, accuracy = 0.01)
  )

kable(regional_summary, align = "lrrrrrr")
continent_name Countries Total Visitors Total Signups Total Conversions Avg Signup Rate Avg Conversion Rate
Europe 33 8,040,308 397,818 14384 4.9% 3.62%
Asia 30 7,203,260 453,383 5704 6.3% 1.26%
North America 9 1,947,094 68,811 3329 3.5% 4.84%
Africa 11 1,073,714 131,938 1267 12.3% 0.96%
Oceania 2 619,161 34,614 2346 5.6% 6.78%
South America 7 593,121 69,880 929 11.8% 1.33%

Europe leads in both visitors (8.2M) and conversions (14.6K), with a 4.9% signup rate and 3.6% paid conversion rate.

Asia has similar traffic (7.7M visitors) but higher signup rates (6.3%) and lower conversion (1.3%).

Africa has a high signup rate at 12.3% but the lowest conversion rate at 0.95%. These markets have clear product interest but face barriers to paid plans.

Australia + New Zealand have a great combined conversion rate of 6.8%, which is higher than the US benchmark.