All-pay auctions and the economics of lobbying

auction-theory-deep-dive
all-pay-auction
lobbying
rent-seeking
Analyse the all-pay auction in R where all bidders pay their bids regardless of winning, derive the symmetric equilibrium with uniform values, and apply the model to lobbying, rent-seeking, and political campaigns.
Author

Raban Heller

Published

May 8, 2026

Modified

May 8, 2026

Keywords

all-pay auction, lobbying, rent-seeking, Tullock contest, political competition, bid shading

Introduction & motivation

In most auctions, only the winner pays. But in many real-world contests, all participants pay regardless of whether they win. Lobbying is the canonical example: firms spend millions on lobbying efforts, and every firm pays its lobbyists whether or not the favourable regulation is obtained. Political campaigns spend on advertising and voter mobilisation — the losing candidate’s expenditures are sunk. Patent races, R&D competitions, litigation, and military conflicts all share this “all-pay” structure: resources committed to the contest are irreversibly spent. The all-pay auction formalises these situations: \(n\) bidders submit bids, the highest bidder wins a prize of value \(V\), and every bidder pays their own bid regardless of outcome. The equilibrium is strikingly different from standard auctions. With \(n\) bidders and values \(v_i \sim U[0,1]\), the symmetric equilibrium bid function is \(b^*(v) = \frac{n-1}{n} v^n\) — bidders shade much more aggressively than in first-price auctions (\(b^*_{FP} = \frac{n-1}{n}v\)) because every bid is paid, making aggressive bidding extremely costly. A key result from the theory of contests is complete rent dissipation: in equilibrium, total expected expenditure by all bidders equals the prize value, so the social surplus from the contest is zero — all rents are consumed by the competition itself. This connects to Gordon Tullock’s rent-seeking literature: when firms compete for government-granted monopoly rights, the wasteful lobbying expenditures can consume the entire monopoly profit, making the rent-seeking game socially costly even when a monopoly is granted. This tutorial derives the all-pay equilibrium, compares it with first-price auctions, simulates rent dissipation, and applies the model to lobbying with asymmetric contestants.

Mathematical formulation

All-pay auction with \(n\) bidders, values \(v_i \sim U[0,1]\) independently. All bidders pay their bids; highest bidder wins prize \(V = 1\).

Symmetric BNE: The equilibrium bid function is:

\[b^*(v) = \frac{n-1}{n} v^n\]

Derivation: Bidder with value \(v\) maximises \((v - 0) \cdot P(\text{win}) - b = v \cdot F_{\max}(b^{-1}(b))^{n-1} - b\) where \(F_{\max}\) is the CDF of the highest competing value. With \(b^{-1}(b) = (nb/(n-1))^{1/n}\), the FOC gives \(b^*(v) = \frac{n-1}{n}v^n\).

Expected revenue (= total expenditure by all bidders): \(E[R] = n \cdot E[b^*(v)] = n \cdot \frac{n-1}{n} \cdot \frac{1}{n+1} = \frac{n-1}{n+1}\)

This equals the expected revenue of the first-price and second-price auctions — revenue equivalence holds.

Tullock contest (imperfectly discriminating): Player \(i\) with effort \(x_i\) wins with probability \(p_i = x_i^r / \sum_j x_j^r\) where \(r\) is the “decisiveness” parameter. The all-pay auction is the limit \(r \to \infty\).

R implementation

set.seed(42)

# === Equilibrium bidding ===
bid_allpay <- function(v, n) ((n - 1) / n) * v^n
bid_firstprice <- function(v, n) ((n - 1) / n) * v

cat("=== All-Pay Auction vs First-Price Auction ===\n\n")
=== All-Pay Auction vs First-Price Auction ===
# Compare bid functions
cat("--- Bid functions at v = 0.5, 0.8, 1.0 ---\n")
--- Bid functions at v = 0.5, 0.8, 1.0 ---
for (v in c(0.5, 0.8, 1.0)) {
  for (n in c(2, 5, 10)) {
    cat(sprintf("  v=%.1f, n=%2d: all-pay b=%.4f, FPA b=%.4f, ratio=%.3f\n",
                v, n, bid_allpay(v, n), bid_firstprice(v, n),
                bid_allpay(v, n) / bid_firstprice(v, n)))
  }
}
  v=0.5, n= 2: all-pay b=0.1250, FPA b=0.2500, ratio=0.500
  v=0.5, n= 5: all-pay b=0.0250, FPA b=0.4000, ratio=0.062
  v=0.5, n=10: all-pay b=0.0009, FPA b=0.4500, ratio=0.002
  v=0.8, n= 2: all-pay b=0.3200, FPA b=0.4000, ratio=0.800
  v=0.8, n= 5: all-pay b=0.2621, FPA b=0.6400, ratio=0.410
  v=0.8, n=10: all-pay b=0.0966, FPA b=0.7200, ratio=0.134
  v=1.0, n= 2: all-pay b=0.5000, FPA b=0.5000, ratio=1.000
  v=1.0, n= 5: all-pay b=0.8000, FPA b=0.8000, ratio=1.000
  v=1.0, n=10: all-pay b=0.9000, FPA b=0.9000, ratio=1.000
# === Simulate and verify revenue equivalence ===
n_sims <- 20000
sim_results <- lapply(c(2, 3, 5, 10), function(n) {
  values <- matrix(runif(n * n_sims), nrow = n_sims)

  # All-pay: everyone pays
  bids_ap <- bid_allpay(values, n)
  rev_ap <- rowSums(bids_ap)  # total expenditure

  # First-price: only winner pays
  bids_fp <- bid_firstprice(values, n)
  winners_fp <- apply(bids_fp, 1, which.max)
  rev_fp <- bids_fp[cbind(1:n_sims, winners_fp)]

  tibble(n = n, rev_ap = mean(rev_ap), rev_fp = mean(rev_fp),
         theoretical = (n - 1) / (n + 1),
         rent_dissipation = mean(rev_ap) / 1.0)  # prize = 1
}) |> bind_rows()

cat("\n--- Revenue Equivalence Verification ---\n")

--- Revenue Equivalence Verification ---
cat(sprintf("  %-4s %-12s %-12s %-12s\n", "n", "All-pay", "First-price", "Theoretical"))
  n    All-pay      First-price  Theoretical 
for (i in 1:nrow(sim_results)) {
  cat(sprintf("  %-4d %-12.4f %-12.4f %-12.4f\n",
              sim_results$n[i], sim_results$rev_ap[i],
              sim_results$rev_fp[i], sim_results$theoretical[i]))
}
  2    0.3338       0.3338       0.3333      
  3    0.5033       0.5017       0.5000      
  5    0.6656       0.6665       0.6667      
  10   0.8157       0.8180       0.8182      
# === Tullock contest ===
cat("\n--- Tullock Contest (2 symmetric players, V=1) ---\n")

--- Tullock Contest (2 symmetric players, V=1) ---
# NE: x* = V*r/(4) for 2 players with linear cost
for (r in c(0.5, 1, 2, 5)) {
  x_star <- r / 4  # symmetric NE effort
  total_effort <- 2 * x_star
  cat(sprintf("  r = %.1f: x* = %.3f, total effort = %.3f, dissipation = %.0f%%\n",
              r, x_star, total_effort, 100 * total_effort))
}
  r = 0.5: x* = 0.125, total effort = 0.250, dissipation = 25%
  r = 1.0: x* = 0.250, total effort = 0.500, dissipation = 50%
  r = 2.0: x* = 0.500, total effort = 1.000, dissipation = 100%
  r = 5.0: x* = 1.250, total effort = 2.500, dissipation = 250%
cat("  (r → ∞ = all-pay auction: 100% dissipation)\n")
  (r → ∞ = all-pay auction: 100% dissipation)

Static publication-ready figure

v_seq <- seq(0, 1, 0.01)
bid_df <- expand.grid(v = v_seq, n = c(2, 5, 10)) |>
  mutate(
    allpay = bid_allpay(v, n),
    firstprice = bid_firstprice(v, n),
    n_label = paste0("n = ", n)
  ) |>
  pivot_longer(c(allpay, firstprice), names_to = "format", values_to = "bid") |>
  mutate(format = ifelse(format == "allpay", "All-pay", "First-price"))

ggplot(bid_df, aes(x = v, y = bid, color = format, linetype = n_label)) +
  geom_line(linewidth = 0.9) +
  scale_color_manual(values = c("All-pay" = okabe_ito[6], "First-price" = okabe_ito[5]),
                      name = "Auction format") +
  scale_linetype_manual(values = c("n = 2" = "solid", "n = 5" = "dashed", "n = 10" = "dotted"),
                         name = "Bidders") +
  labs(title = "All-pay vs first-price: equilibrium bidding strategies",
       subtitle = "All-pay bids are convex (v^n) — much lower for low/mid values",
       x = "Private value (v)", y = "Equilibrium bid") +
  theme_publication()
Figure 1: Figure 1. Equilibrium bidding strategies: all-pay auction vs first-price auction for different numbers of bidders. All-pay bids are dramatically lower for most values because every bid is paid — bidders shade aggressively to limit losses. The gap narrows for high values where the probability of winning is large. With more bidders, both bid functions shift but the all-pay curve remains convex (v^n) while first-price remains linear. Okabe-Ito palette.

Interactive figure

# Rent dissipation across number of bidders
n_seq <- 2:20
dissipation_df <- tibble(
  n = n_seq,
  total_expenditure = (n_seq - 1) / (n_seq + 1),
  winner_surplus = 1 / (n_seq * (n_seq + 1)),
  loser_loss = (n_seq - 1) / (n_seq * (n_seq + 1))
) |>
  pivot_longer(-n, names_to = "metric", values_to = "value") |>
  mutate(
    label = case_when(
      metric == "total_expenditure" ~ "Total expenditure (rent dissipation)",
      metric == "winner_surplus" ~ "Winner's expected surplus",
      metric == "loser_loss" ~ "Expected loss per loser"
    ),
    text = paste0("n = ", n, "\n", label, ": ", round(value, 4))
  )

p_diss <- ggplot(dissipation_df, aes(x = n, y = value, color = label, text = text)) +
  geom_line(linewidth = 1) +
  geom_point(size = 1.5) +
  scale_color_manual(values = okabe_ito[c(6, 3, 1)], name = NULL) +
  labs(title = "All-pay auction: rent dissipation increases with competition",
       subtitle = "Total expenditure → 1 (= prize value); winner surplus → 0",
       x = "Number of bidders", y = "Expected value") +
  theme_publication()

ggplotly(p_diss, tooltip = "text") |>
  config(displaylogo = FALSE, modeBarButtonsToRemove = c("select2d", "lasso2d"))
Figure 2

Interpretation

The all-pay auction provides the game-theoretic foundation for understanding wasteful competition. When all contestants must pay regardless of outcome, the equilibrium involves aggressive bid shading (the convex \(v^n\) bid function) that limits each individual’s exposure, but collectively, total expenditure still equals the prize value — rent dissipation is complete. This result explains several puzzling real-world phenomena: why lobbying expenditures in Washington often approach the value of the regulation being sought; why political campaign spending seems “excessive” relative to the value of office; and why patent races can consume most of the expected patent value in R&D costs. The comparison with first-price auctions is illuminating: at \(v = 0.5\) with 5 bidders, the first-price bid is 0.40 while the all-pay bid is only 0.025 — a factor of 16 lower. This extreme shading reflects the asymmetric risk: in an all-pay auction, bidding aggressively with a mediocre value is doubly costly (you probably lose AND you pay), while in a first-price auction you only pay if you win. The Tullock contest model shows how the “decisiveness” parameter \(r\) controls the intensity of competition: at \(r = 1\) (standard contest success function), total effort is only 50% of the prize; at \(r = 2\), it reaches 100%; and as \(r \to \infty\) (all-pay auction), all rents are dissipated. Policy implications are direct: reducing the decisiveness of contests (e.g., using lotteries instead of winner-take-all for government grants) can reduce wasteful rent-seeking while still selecting above-average contestants.

References

Back to top

Reuse

Citation

BibTeX citation:
@online{heller2026,
  author = {Heller, Raban},
  title = {All-Pay Auctions and the Economics of Lobbying},
  date = {2026-05-08},
  url = {https://r-heller.github.io/equilibria/tutorials/auction-theory-deep-dive/all-pay-auction-lobbying/},
  langid = {en}
}
For attribution, please cite this work as:
Heller, Raban. 2026. “All-Pay Auctions and the Economics of Lobbying.” May 8. https://r-heller.github.io/equilibria/tutorials/auction-theory-deep-dive/all-pay-auction-lobbying/.