Greece’s Summer Economy: Who Comes, When, Where and What They Spend

What is this?

Greece is one of the most visited countries of Europe, and its tourism is squeezed into a few summer months and a few groups of islands. This story follows the tourists through the statistics of Eurostat:

  1. How many come?
  2. When do they come?
  3. Where do they go?
  4. Where do they come from?
  5. How much do they spend, against other holiday countries?
  6. How much does Greece depend on them?
  7. Where do they stay?

The data come from three places, all at Eurostat, the statistical office of the EU:

  • The statistics of tourist accommodation: the nights that guests spend in hotels, rented rooms and apartments, and campsites, each month since 1994, by region and by the country the guests live in. A night is one guest staying one night: a couple on a week’s holiday spend 14 nights. Since 2018 Eurostat also counts the nights booked through Airbnb, Booking, Expedia and Tripadvisor.
  • The survey of the trips of EU residents, which asks people in every EU country where they travelled and what they spent. It tells what a holiday in Greece costs its visitors, against a holiday in Spain, Italy or Croatia.
  • The balance of payments, which records what foreign visitors spend in each country, so it can be set against the size of its economy.

They are downloaded when the document is knitted, so the charts show the latest figures.


Packages

Code
# install.packages(c("eurostat", "plotly"))
library(eurostat)
library(plotly)

The data

Code
# a Eurostat dataset, without its missing values, in the order of the years
eurostat_values <- function(id, filters) {
  x <- get_eurostat(id, filters = filters, time_format = "num", cache = FALSE)
  x <- as.data.frame(x[!is.na(x$values), ])
  x[order(x$time), ]
}
# a monthly Eurostat dataset, the same way, with the year and the month of each value
eurostat_months <- function(id, filters) {
  x <- get_eurostat(id, filters = filters, time_format = "date", cache = FALSE)
  x <- as.data.frame(x[!is.na(x$values), ])
  x$year <- as.integer(format(x$time, "%Y"))
  x$month <- as.integer(format(x$time, "%m"))
  x[order(x$time), ]
}
eu <- eu_countries$code
eu_name <- c(setNames(eu_countries$name, eu_countries$code), EU27_2020 = "EU-27", TR = "Türkiye")

# Greece every year: the nights at all tourist accommodation (I551-I553), in hotels (I551), in rented
# rooms, apartments and holiday homes (I552, counted from 2009) and in campsites (I553), of all
# guests, of guests from abroad and of Greeks
kinds <- c(I551 = "Hotels", I552 = "Rented rooms and apartments", I553 = "Campsites")
annual <- eurostat_values("tour_occ_ninat", list(
  geo = "EL", unit = "NR", c_resid = c("TOTAL", "FOR", "DOM"), nace_r2 = c("I551-I553", names(kinds))
))
nights <- function(year, kind = "I551-I553", resid = "TOTAL") {
  annual$values[annual$time == year & annual$nace_r2 == kind & annual$c_resid == resid]
}
years <- annual$time[annual$nace_r2 == "I551-I553" & annual$c_resid == "TOTAL"]
year_now <- max(years)

# the nights of each month at all tourist accommodation, every EU country
monthly <- eurostat_months("tour_occ_nim", list(geo = c(eu, "EU27_2020"), unit = "NR", c_resid = "TOTAL", nace_r2 = "I551-I553"))
greece <- monthly[monthly$geo == "EL", ]
month_now <- max(greece$time)   # the latest month
full_year <- max(as.integer(names(which(table(greece$year) == 12))))   # the latest year with all twelve months

# the regions of Greece (NUTS 2): the nights of each month since 2020, also per thousand inhabitants,
# of all guests and of guests from abroad
regions <- c(
  EL30 = "Attica", EL41 = "North Aegean", EL42 = "South Aegean", EL43 = "Crete",
  EL51 = "Eastern Macedonia and Thrace", EL52 = "Central Macedonia", EL53 = "Western Macedonia",
  EL54 = "Epirus", EL61 = "Thessaly", EL62 = "Ionian Islands", EL63 = "Western Greece",
  EL64 = "Central Greece", EL65 = "Peloponnese"
)
regional <- eurostat_values("tour_occ_nin2m", list(geo = names(regions), unit = c("NR", "P_THAB"), c_resid = c("TOTAL", "FOR"), nace_r2 = "I551-I553"))
region_year <- max(regional$time)

# the nights in Greece by the country the guests live in; countries only, not groups such as EUR
origins <- eurostat_values("tour_occ_ninraw", list(geo = "EL", unit = "NR", nace_r2 = "I551-I553"))
origins <- origins[nchar(origins$c_resid) == 2, ]
origin_nights <- function(country, year) origins$values[match(paste(country, year), paste(origins$c_resid, origins$time))]

# the survey of trips: what EU residents spend on holidays (trips for personal purposes of one night or
# more) in each country, by kind of spending, and the number of those trips and of their nights
destinations <- c("EL", "ES", "IT", "PT", "HR", "CY", "MT", "FR", "AT", "BG", "TR")
parts <- c(TRA = "Getting there and around", ACCOM = "Accommodation", OTHER = "Food, drinks and everything else")
survey <- list(geo = c("EU27_2020", setdiff(destinations, "TR")), c_dest = c(destinations, "DOM"), purpose = "PER", duration = "N_GE1")
# all spending (TOTXDUR, without durable goods), on transport and on accommodation; the rest is
# "everything else", as some countries count cafés and restaurants apart and others do not
per_trip <- eurostat_values("tour_dem_extotw", c(survey, list(statinfo = "AVG_TRP", expend = c("TOTXDUR", "TRA", "ACCOM"))))
trips <- eurostat_values("tour_dem_ttw", survey)
trip_nights <- eurostat_values("tour_dem_tnw", survey)
# Eurostat gives the totals of each kind of spending only for the trips at home; for the others they
# are the spending per trip times the trips
spent <- merge(per_trip[c("geo", "c_dest", "time", "expend", "values")], trips[c("geo", "c_dest", "time", "values")],
  by = c("geo", "c_dest", "time"), suffixes = c("_per_trip", "_trips"))
spent$values <- spent$values_per_trip * spent$values_trips

# consumer prices, 2015 = 100, in Greece and in the EU
prices <- eurostat_values("prc_hicp_aind", list(geo = c("EL", "EU27_2020"), coicop = "CP00", unit = "INX_A_AVG"))

# what foreign visitors spend in each country (travel, in the balance of payments) and GDP, million euros
receipts <- eurostat_values("bop_its6_det", list(geo = c(eu, "TR"), bop_item = "SD", stk_flow = "CRE", partner = "WRL_REST", currency = "MIO_EUR"))
gdp <- eurostat_values("nama_10_gdp", list(geo = c(eu, "TR"), na_item = "B1GQ", unit = "CP_MEUR"))

# the nights booked through Airbnb, Booking, Expedia and Tripadvisor, Greece and its regions
platforms <- eurostat_values("tour_ce_omn12", list(geo = c("EL", names(regions)), indic_to = "NGT_SP", c_resid = "TOTAL", month = "TOTAL"))
platform_year <- max(platforms$time)
on_platforms <- function(geo, year = platform_year) platforms$values[platforms$geo == geo & platforms$time == year]
Code
greek_red <- "#d62728"
blue <- "#1f77b4"
gray <- "#9e9e9e"
dark_gray <- "#6b6b6b"   # also the color of the notes and the labels
amber <- "#c97b1e"
# the three parts of a stacked bar, told apart also with colour blindness: light blue, amber, dark blue
stack_colors <- c("#5b8fd6", amber, "#1c5cab")
# a scale from few nights (white) to many (dark blue)
blues <- list(c(0, "#f4f8fd"), c(0.5, "#3987e5"), c(1, "#0d366b"))

# the source of a chart, as a note under it, and the common layout
chart <- function(p, title, source, y_title = "", y_axis = list(), x_axis = list(), annotations = list(), margin = list(t = 70, b = 90), note_y = -0.16, ...) {
  note <- list(
    text = paste("Source:", source), xref = "paper", yref = "paper", x = 0, y = note_y,
    xanchor = "left", yanchor = "top", showarrow = FALSE, font = list(size = 11, color = dark_gray)
  )
  layout(p,
    # at the top, so that a legend of two or three rows fits under it in a larger top margin
    title = list(text = title, x = 0.02, xanchor = "left", y = 0.97, yanchor = "top"),
    yaxis = c(list(title = y_title), y_axis),
    xaxis = c(list(title = ""), x_axis),
    margin = margin,
    annotations = c(annotations, list(note)),
    ...
  ) %>% config(displaylogo = FALSE)
}
legend_top <- list(orientation = "h", x = 0, y = 1.02, yanchor = "bottom")
months <- factor(month.abb, levels = month.abb)   # in this order on an axis
# a horizontal bar chart of countries or regions, from the highest at the top: by default one of
# them in red, the EU in blue and the others in gray
ranking_bars <- function(x, value, highlight, hover,
                         colors = function(x) ifelse(x$geo == highlight, greek_red, ifelse(x$geo == "EU27_2020", blue, gray))) {
  x <- x[order(x[[value]]), ]
  plot_ly(
    y = factor(x$name, levels = x$name), x = x[[value]], type = "bar", orientation = "h",
    marker = list(color = colors(x)), hovertext = hover(x), hovertemplate = "%{hovertext}<extra></extra>"
  )
}

# short labels of numbers
million <- function(x, digits = 1) paste(format(round(x / 1e6, digits), nsmall = digits, trim = TRUE), "million")
euros <- function(x) paste0("€", format(round(x), big.mark = ",", trim = TRUE))
billion_euros <- function(x) paste0("€", format(round(x / 1000, 1), nsmall = 1, trim = TRUE), " billion")   # from million euros
percent <- function(x, digits = 0) paste0(format(round(x, digits), nsmall = digits, trim = TRUE), "%")
one <- function(x) format(round(x, 1), nsmall = 1, trim = TRUE)
# "A", "A and B", "A, B and C"
and_list <- function(x) if (length(x) < 2) x else paste(paste(x[-length(x)], collapse = ", "), "and", x[length(x)])
# the place of a country counted from the highest: 1 is the highest
highest <- function(k) {
  if (k > 8) return(paste0("the ", k, "th highest"))
  paste0("the ", c("", "second ", "third ", "fourth ", "fifth ", "sixth ", "seventh ", "eighth ")[k], "highest")
}

1. How many come?

Code
record <- years[which.max(sapply(years, nights))]
foreign_share <- function(year) 100 * nights(year, resid = "FOR") / nights(year)
hotels_growth <- 100 * (nights(year_now, "I551") / nights(min(years), "I551") - 1)
covid_fall <- 100 * (1 - nights(2020) / nights(2019))
recovered <- min(years[years > 2020 & sapply(years, nights) > nights(2019)])
# this year so far, against the same months of last year
latest_year <- as.integer(format(month_now, "%Y"))
latest_month <- as.integer(format(month_now, "%m"))
so_far <- function(year) sum(greece$values[greece$year == year & greece$month <= latest_month])

156.3 million nights in 2025, more than ever.

In 2025, guests spent 156.3 million nights in the hotels, rented rooms and apartments, and campsites of Greece, 84% of them guests from abroad. Hotels alone had 119.0 million nights, 129% more than in 1994. In the first 8 months of 2026 there were 1.8% more nights than in the same months of 2025.

Until 2008 Greece counted only the nights in hotels and campsites; from 2009 it counts those in rented rooms, apartments and holiday homes too, so the bars jump in 2009. Since then the nights fell twice: in the debt crisis, to 80.6 million in 2012, and in 2020, when COVID closed the borders, by 73%. By 2023 there were more than in 2019.

Code
kind_colors <- c(I551 = stack_colors[3], I552 = stack_colors[2], I553 = stack_colors[1])
p <- plot_ly()
for (k in names(kinds)) {
  x <- annual[annual$nace_r2 == k & annual$c_resid == "TOTAL", ]
  p <- add_trace(p,
    x = x$time, y = x$values / 1e6, type = "bar", name = kinds[[k]],
    marker = list(color = kind_colors[[k]], line = list(color = "white", width = 1)),
    hovertemplate = paste0("%{x}: %{y:.1f} million nights<extra>", kinds[[k]], "</extra>")
  )
}
p %>% chart("Nights at tourist accommodation in Greece, million", "Eurostat, tour_occ_ninat", "Million",
  barmode = "stack", bargap = 0.15, legend = c(legend_top, traceorder = "normal"), margin = list(t = 100, b = 90),
  annotations = list(list(x = 2009, y = nights(2009) / 1e6, text = "2009: rented rooms and<br>apartments counted too",
    showarrow = TRUE, ax = -70, ay = -45, font = list(color = dark_gray))))

More and more of the guests come from abroad: 69% of the nights in 2010, 84% in 2025. In 2020, with few foreigners able to travel, the share fell to 68%.


2. When do they come?

Code
in_month <- function(year, month) greece$values[greece$year == year & greece$month == month]
in_months <- function(year, months) sum(greece$values[greece$year == year & greece$month %in% months])
summer <- 6:9
winter <- c(1:3, 11:12)
summer_share <- 100 * in_months(full_year, summer) / in_months(full_year, 1:12)
summer_growth <- in_months(full_year, summer) - in_months(2010, summer)
winter_growth <- in_months(full_year, winter) - in_months(2010, winter)

In August, 21 times as many nights as in January.

In 2025, guests spent 1.6 million nights in Greece in January and 34.0 million in August. 72% of the nights of the year fell in the four months from June to September. Each row of the chart is a year and each cell a month: the darker the cell, the more nights. Greece has added summer, not winter: from 2010 to 2025, the nights from June to September grew by 49.5 million, those from November to March by 4.2 million.

Code
heat <- greece[greece$year >= 2009, ]
z <- tapply(heat$values / 1e6, list(heat$year, factor(heat$month, levels = 1:12)), sum)   # years in rows, months in columns
plot_ly(
  x = months, y = rownames(z), z = z, type = "heatmap", colorscale = blues, xgap = 2, ygap = 2,
  colorbar = list(title = list(text = "Million<br>nights"), thickness = 12),
  hovertemplate = "%{x} %{y}: %{z:.1f} million nights<extra></extra>"
) %>%
  chart("Nights in Greece each month, million",
    paste0("Eurostat, tour_occ_nim, January 2009 to ", month.name[latest_month], " ", latest_year, "; blank: no data"), y_axis = list(type = "category", autorange = "reversed"), note_y = -0.08)
Code
season <- monthly[monthly$year == full_year, ]
complete <- names(which(table(season$geo) == 12))
by_season <- data.frame(geo = complete, name = eu_name[complete])
by_season$share <- sapply(complete, function(k) {
  x <- season[season$geo == k, ]
  100 * sum(x$values[x$month %in% summer]) / sum(x$values)
})
season_order <- by_season$geo[by_season$geo != "EU27_2020"][order(-by_season$share[by_season$geo != "EU27_2020"])]
more_seasonal <- season_order[seq_len(match("EL", season_order) - 1)]
eu_share <- by_season$share[by_season$geo == "EU27_2020"]

One of the most seasonal in the EU. In the EU as a whole, 52% of the nights at tourist accommodation fall from June to September; in Greece, 72%. Only Croatia packs more of its tourism into them. Hotels, restaurants and the people who work in them have to earn the year’s living in a few months.

Code
ranking_bars(by_season, "share", "EL", function(x) paste0(x$name, ": ", percent(x$share, 1), " of the year's nights")) %>%
  chart(paste0("Share of the nights of ", full_year, " spent from June to September, %"), "Eurostat, tour_occ_nim",
    margin = list(l = 130, t = 70, b = 90), note_y = -0.1)

3. Where do they go?

Code
year_total <- regional[regional$time == region_year & regional$month == "TOTAL", ]
region_value <- function(unit, resid) {
  year_total$values[match(paste(names(regions), unit, resid), paste(year_total$geo, year_total$unit, year_total$c_resid))]
}
by_region <- data.frame(geo = names(regions), name = regions)
by_region$nights <- region_value("NR", "TOTAL")
by_region$per_person <- region_value("P_THAB", "TOTAL") / 1000
by_region$foreign <- 100 * region_value("NR", "FOR") / by_region$nights
islands <- c("EL42", "EL43", "EL62")
islands_foreign <- min(by_region$foreign[by_region$geo %in% islands])
islands_share <- 100 * sum(by_region$nights[by_region$geo %in% islands]) / sum(by_region$nights)
in_region <- function(geo, column) by_region[[column]][by_region$geo == geo]
# the share of the nights of the year that a region has in each month
m <- regional[regional$time == region_year & regional$unit == "NR" & regional$c_resid == "TOTAL" & regional$month != "TOTAL", ]
m$month <- as.integer(sub("M", "", m$month))
by_month <- function(geo) {
  x <- m[m$geo == geo, ]
  x <- x[order(x$month), ]
  100 * x$values / sum(x$values)
}
summer_of <- function(geo) sum(by_month(geo)[summer])

62% of the nights on three groups of islands. In 2025, the South Aegean, the Cyclades and the Dodecanese with Santorini, Mykonos, Rhodes and Kos, had 41.8 million nights; Crete 35.2 million; the Ionian Islands, with Corfu, Zakynthos and Kefalonia, 20.4 million. Attica, with Athens, had 12.8 million. Against the people who live there, the islands are full: 128 nights a year for each inhabitant of the South Aegean and 103 in the Ionian Islands, against 3.4 in Attica. On the islands, 91% or more of the nights are those of guests from abroad.

Code
by_region$million_nights <- by_region$nights / 1e6
ranking_bars(by_region, "million_nights", "", function(x) {
  paste0(x$name, ": ", million(x$nights), " nights, ", round(x$per_person, 1), " per inhabitant, ", percent(x$foreign), " from abroad")
}, colors = function(x) ifelse(x$geo %in% islands, blue, gray)) %>%
  chart(paste0("Nights at tourist accommodation by region, ", region_year, ", million"), "Eurostat, tour_occ_nin2m",
    margin = list(l = 200, t = 70, b = 90))

Athens works all year, the islands in the summer. 80% of the nights of the Ionian Islands and 74% of those of the South Aegean fall from June to September, against 49% in Attica, where city breaks, business and conferences fill the hotels in spring and autumn too.

Code
shown <- c(EL62 = amber, EL42 = stack_colors[3], EL43 = stack_colors[1], EL30 = gray)
p <- plot_ly()
for (k in names(shown)) {
  p <- add_trace(p,
    x = months, y = by_month(k), type = "scatter", mode = "lines+markers", name = regions[[k]],
    line = list(color = shown[[k]], width = if (k == "EL30") 2 else 3, dash = if (k == "EL30") "dash" else "solid"),
    marker = list(color = shown[[k]], size = 8),
    hovertemplate = paste0("%{x}: %{y:.1f}% of the year<extra>", regions[[k]], "</extra>")
  )
}
p %>% chart(paste0("Share of the nights of ", region_year, " in each month, %"), "Eurostat, tour_occ_nin2m", "% of the year",
  y_axis = list(rangemode = "tozero"), legend = legend_top, margin = list(t = 100, b = 90))

4. Where do they come from?

Code
origin_year <- max(origins$time)
latest <- origins[origins$time == origin_year, ]
latest <- latest[order(-latest$values), ]
latest$name <- as.character(label_eurostat(latest$c_resid, dic = "c_resid"))
latest$name[latest$c_resid == "EL"] <- "Greece (Greeks at home)"
abroad <- latest[latest$c_resid != "EL", ]
# a country's name in a sentence: "the United Kingdom"
in_text <- function(name) ifelse(name %in% c("United Kingdom", "United States", "Netherlands"), paste("the", name), name)
share_of_foreign <- function(country) 100 * origin_nights(country, origin_year) / nights(origin_year, resid = "FOR")
change <- function(country, from = 2019) origin_nights(country, origin_year) - origin_nights(country, from)

Most come from the United Kingdom and Germany. In 2025, guests from the United Kingdom spent 25.4 million nights in Greece and those from Germany 21.0 million: together 35% of the nights of guests from abroad. Greeks on holiday in their own country spent 25.3 million.

The list has changed since 2019. The Russians, who spent 6.6 million nights in Greece in 2019, have almost gone since the EU closed its skies to Russian planes in 2022: 0.36 million in 2025. The Americans came in their place: 6.1 million nights, against 3.9 million in 2019. Poland and Romania grew too, by 1.3 million and 1.9 million nights.

Code
top <- head(latest, 12)
top <- top[order(top$values), ]
plot_ly(
  y = factor(top$name, levels = top$name), x = top$values / 1e6, type = "bar", orientation = "h",
  marker = list(color = ifelse(top$c_resid == "EL", gray, blue)),
  hovertext = paste0(top$name, ": ", million(top$values), " nights in ", origin_year, ", ",
    million(origin_nights(top$c_resid, 2019)), " in 2019"),
  hovertemplate = "%{hovertext}<extra></extra>"
) %>%
  chart(paste0("Nights in Greece by the country of the guests, ", origin_year, ", million"),
    "Eurostat, tour_occ_ninraw", margin = list(l = 190, t = 70, b = 90))

5. How much do they spend, against other holiday countries?

Eurostat’s survey of trips asks people in every EU country where they went on holiday and what it cost them. The trips to a country include those of its own people on holiday at home, which are cheaper, as there is no long journey: so they are taken out here, and what remains are the visitors from the other EU countries. Türkiye, outside the EU, is in the comparison as Greece’s nearest competitor; all its visitors in the survey come from abroad.

Code
# the value for the visitors to a country from the other EU countries: all EU residents, minus its
# own residents on holiday at home (Türkiye has none in the survey)
from_abroad <- function(x, country, year) {
  everyone <- x$values[x$geo == "EU27_2020" & x$c_dest == country & x$time == year]
  at_home <- if (country == "TR") 0 else x$values[x$geo == country & x$c_dest == "DOM" & x$time == year]
  if (length(everyone) != 1 || length(at_home) != 1) return(NA)
  everyone - at_home
}
spending <- function(year) {
  x <- data.frame(geo = destinations, name = eu_name[destinations])
  for (p in c("TOTXDUR", "TRA", "ACCOM")) x[[p]] <- sapply(destinations, function(d) from_abroad(spent[spent$expend == p, ], d, year))
  x$OTHER <- x$TOTXDUR - x$TRA - x$ACCOM
  x$trips <- sapply(destinations, function(d) from_abroad(trips, d, year))
  x$nights <- sapply(destinations, function(d) from_abroad(trip_nights, d, year))
  x$per_trip <- x$TOTXDUR / x$trips
  x$per_night <- x$per_trip * x$trips / x$nights
  x$length <- x$nights / x$trips
  x[!is.na(x$per_trip), ]
}
survey_year <- max(trips$time[trips$geo == "EU27_2020" & trips$c_dest == "EL"])
costs <- spending(survey_year)
cost <- function(geo, column = "per_trip") costs[[column]][costs$geo == geo]
part_cost <- function(geo, part) cost(geo, part) / cost(geo, "trips")
by_trip <- costs$geo[order(-costs$per_trip)]
by_night <- costs$geo[order(-costs$per_night)]
by_length <- costs$geo[order(-costs$length)]
# the countries ahead of Greece in a ranking
before_greece <- function(ranking) ranking[seq_len(match("EL", ranking) - 1)]

A holiday in Greece costs its visitors €1,256, the third highest of the 11 holiday countries in the chart.

In 2025, visitors from the other EU countries spent €1,256 on a holiday trip to Greece, against €1,152 in Spain, €970 in Italy and €888 in Croatia; only Cyprus and Türkiye cost more. The money includes the journey: €379 of it went on getting there and around, mostly on the flights; €436 on accommodation; and €441 on food, drinks and everything else.

Code
costs <- costs[order(costs$per_trip), ]
labels <- ifelse(costs$geo == "EL", "<b>Greece</b>", costs$name)
y <- factor(labels, levels = labels)
p <- plot_ly()
for (k in seq_along(parts)) {
  p <- add_trace(p,
    y = y, x = costs[[names(parts)[k]]] / costs$trips, type = "bar", orientation = "h", name = parts[[k]],
    marker = list(color = stack_colors[k], line = list(color = "white", width = 1)),
    hovertemplate = paste0("%{y}: €%{x:,.0f}<extra>", parts[[k]], "</extra>")
  )
}
p %>% chart(paste0("What a holiday trip costs, ", survey_year, ", euros"),
  "Eurostat, tour_dem_extotw and tour_dem_ttw: visitors from the other EU countries; own calculation",
  x_axis = list(range = c(0, 1.15 * max(costs$per_trip))),
  barmode = "stack", legend = c(legend_top, traceorder = "normal"), margin = list(l = 110, t = 100, b = 90),
  annotations = lapply(seq_len(nrow(costs)), function(k) {
    list(x = costs$per_trip[k], y = labels[k], text = euros(costs$per_trip[k]), xanchor = "left", xshift = 4,
      showarrow = FALSE, font = list(color = dark_gray))
  }))

Per night, too, Greece is among the dearest. Visitors stay long in Greece, 8.6 nights a trip (only in Türkiye and Spain do they stay longer), so the cost of the flight is spread over more nights. A night of holiday in Greece costs them €145, the third highest of the 11: Cyprus (€173) and Malta (€163) cost more.

Code
ranking_bars(costs, "per_night", "EL", function(x) {
  paste0(x$name, ": ", euros(x$per_night), " a night, ", one(x$length), " nights a trip")
}) %>%
  chart(paste0("What a night of holiday costs, ", survey_year, ", euros"),
    "Eurostat, tour_dem_extotw and tour_dem_tnw: visitors from the other EU countries; own calculation",
    margin = list(l = 110, t = 70, b = 90))
Code
trip_cost <- function(year) {
  x <- spending(year)
  x$per_trip[x$geo == "EL"]
}
price_year <- min(survey_year, max(prices$time))
price_change <- function(geo) 100 * (prices$values[prices$geo == geo & prices$time == price_year] / prices$values[prices$geo == geo & prices$time == 2019] - 1)
cost_change <- 100 * (trip_cost(survey_year) / trip_cost(2019) - 1)
real_change <- c(100 * ((1 + cost_change / 100) / (1 + price_change("EL") / 100) - 1),
                 100 * ((1 + cost_change / 100) / (1 + price_change("EU27_2020") / 100) - 1))
# within 5% of 2019 after inflation, by the prices of Greece and of the EU, is "about the same"
real_spending <- if (all(abs(real_change) < 5)) "about the same" else if (all(real_change > 0)) "more" else if (all(real_change < 0)) "less" else "about the same"

More visitors, not richer ones. In 2019, a holiday trip to Greece cost visitors from the other EU countries €1,025; in 2025, €1,256, 23% more. Consumer prices rose by 20% in Greece and by 26% in the EU over the same years, so after inflation each visitor spends about what they spent in 2019: what has grown is the number of visitors. The survey asks a sample of people, so the figure of a single year can jump: it is the change over several years that counts.


6. How much does Greece depend on them?

Code
both <- merge(receipts[c("geo", "time", "values")], gdp[c("geo", "time", "values")], by = c("geo", "time"), suffixes = c("_receipts", "_gdp"))
both$share <- 100 * both$values_receipts / both$values_gdp
receipts_year <- max(both$time[both$geo == "EL"])
share_of <- function(geo, year = receipts_year) both$share[both$geo == geo & both$time == year]
earned <- function(geo, year = receipts_year) both$values_receipts[both$geo == geo & both$time == year]
dependence <- both[both$time == receipts_year, ]
dependence$name <- eu_name[dependence$geo]
by_share <- dependence$geo[order(-dependence$share)]
ahead_of_greece <- by_share[seq_len(match("EL", by_share) - 1)]

€23.6 billion in 2025, 9.5% of GDP. That is what visitors from abroad spent in Greece, on hotels, meals, transport and shopping, without the flights to get there. Of the countries in the chart, only Croatia (16.3%), Malta (12.1%) and Cyprus (10.9%) depend more on them; in Spain they spent 6.2% of GDP, in Italy 2.5%. The figure counts only what foreigners spend: the holidays of Greeks at home, and the farms, builders and shops that sell to hotels, add to what the economy owes to tourism.

Code
ranking_bars(dependence, "share", "EL", function(x) paste0(x$name, ": ", percent(x$share, 1), " of GDP, ", billion_euros(x$values_receipts))) %>%
  chart(paste0("What visitors from abroad spend, ", receipts_year, ", % of GDP"),
    "Eurostat, bop_its6_det (travel, credit) and nama_10_gdp", margin = list(l = 130, t = 70, b = 90), note_y = -0.1)

What a country depends on, it can lose. In 2020 visitors from abroad spent €4.3 billion in Greece, 2.6% of GDP, against €18.2 billion in 2019.

Code
greek <- both[both$geo == "EL", ]
plot_ly(greek,
  x = ~time, y = ~share, type = "scatter", mode = "lines+markers", name = "Greece",
  line = list(color = greek_red, width = 3), marker = list(color = greek_red, size = 8),
  hovertext = paste0(greek$time, ": ", percent(greek$share, 1), " of GDP, ", billion_euros(greek$values_receipts)),
  hovertemplate = "%{hovertext}<extra></extra>"
) %>%
  chart("What visitors from abroad spend in Greece, % of GDP", "Eurostat, bop_its6_det (travel, credit) and nama_10_gdp",
    "% of GDP", y_axis = list(rangemode = "tozero"))

7. Where do they stay?

Code
compare_year <- min(platform_year, year_now)
platform_growth <- 100 * (on_platforms("EL", compare_year) / on_platforms("EL", 2019) - 1)
registered_growth <- 100 * (nights(compare_year) / nights(2019) - 1)
platforms_grew_more <- on_platforms("EL", compare_year) - on_platforms("EL", 2019) > nights(compare_year) - nights(2019)
stay_year <- min(platform_year, region_year)
stays <- regional[regional$time == stay_year & regional$month == "TOTAL" & regional$unit == "NR" & regional$c_resid == "TOTAL", ]
by_region$registered <- stays$values[match(by_region$geo, stays$geo)]
by_region$platforms <- sapply(by_region$geo, on_platforms, year = stay_year)
by_region$per_100 <- 100 * by_region$platforms / by_region$registered
platforms_per_100 <- function(geo) by_region$per_100[by_region$geo == geo]
more_than_attica <- by_region$name[by_region$per_100 > platforms_per_100("EL30")]

More and more of them in flats let through Airbnb and the like. In 2025, guests spent 52.1 million nights in places booked through Airbnb, Booking, Expedia or Tripadvisor, 115% more than in 2019. The nights in hotels, rented rooms and campsites grew by 9% in the same years. Some places are listed on the platforms and also counted as tourist accommodation, so the two cannot simply be added; but the platforms gained 27.8 million nights since 2019, the tourist accommodation 12.8 million: most of the growth has gone to the platforms.

Code
since <- min(platforms$time)
registered <- data.frame(time = since:year_now)
registered$values <- sapply(registered$time, nights)
greek_platforms <- platforms[platforms$geo == "EL", ]
plot_ly(registered,
  x = ~time, y = ~ values / 1e6, type = "scatter", mode = "lines+markers", name = "Hotels, rented rooms and campsites",
  line = list(color = blue, width = 3), marker = list(color = blue, size = 8),
  hovertemplate = "%{x}: %{y:.1f} million nights<extra>Tourist accommodation</extra>"
) %>%
  add_trace(data = greek_platforms, x = ~time, y = ~ values / 1e6, name = "Booked through the platforms",
    line = list(color = amber, width = 3), marker = list(color = amber, size = 8),
    hovertemplate = "%{x}: %{y:.1f} million nights<extra>Platforms</extra>", inherit = FALSE,
    type = "scatter", mode = "lines+markers") %>%
  chart("Nights in Greece, million", "Eurostat, tour_occ_ninat and tour_ce_omn12 (Airbnb, Booking, Expedia, Tripadvisor)",
    "Million", y_axis = list(rangemode = "tozero"), legend = legend_top)

In Athens, 81 nights on the platforms for every 100 in tourist accommodation. That is what Attica had in 2025, more than any other region; the South Aegean had 22 and Crete 25. Many of the flats let to visitors in Athens were once let to people who live there, which is one reason given for the rise of rents in the city; the story of Greek housing follows rents and house prices against incomes.

Code
x <- by_region[order(by_region$registered), ]
y <- factor(x$name, levels = x$name)
plot_ly(
  y = y, x = x$registered / 1e6, type = "bar", orientation = "h", name = "Hotels, rented rooms and campsites",
  marker = list(color = blue), hovertemplate = "%{y}: %{x:.1f} million nights<extra>Tourist accommodation</extra>"
) %>%
  add_trace(y = y, x = x$platforms / 1e6, name = "Booked through the platforms", marker = list(color = amber),
    hovertemplate = "%{y}: %{x:.1f} million nights<extra>Platforms</extra>") %>%
  chart(paste0("Nights by region, ", stay_year, ", million"), "Eurostat, tour_occ_nin2m and tour_ce_omn12",
    barmode = "group", legend = legend_top, margin = list(l = 200, t = 100, b = 90), note_y = -0.12)

So, what does it mean?

Tourism is one of the pillars of the Greek economy, and one of its risks. Visitors from abroad spend 9.5% of GDP in Greece, and they spend it:

  1. In the summer: 72% of the nights fall from June to September. Greece has grown its summers, not its winters, so jobs and incomes in tourism remain seasonal.
  2. On the islands: 62% of the nights are spent in the South Aegean, Crete and the Ionian Islands, where there are 128 nights for each inhabitant of the South Aegean every year, with what that means for water, roads and housing in August.
  3. On long trips: a holiday in Greece costs its visitors from the rest of the EU €1,256, the third highest of the 11 holiday countries in the chart, and a night €145, the third highest. After inflation, each visitor spends about as much as before COVID: the growth comes from more visitors.
  4. Through the platforms: since 2019, nights booked through Airbnb and the like grew by 115%, the registered tourist accommodation by 9%.

2020 showed the risk: when the visitors could not come, 73% of the nights were lost in one year. Longer seasons, more regions and more visitors from outside Europe would spread it.


Sources