Technical writing

BLS PPI: The Producer Price Index and the Federal Inflation Dataset That Leads CPI

· AI Analytics
Federal DataBLSInflationEconomics

Every month, roughly a week before the CPI release, the Bureau of Labor Statistics publishes a number that almost no one outside of economics departments and trading desks follows closely — and that almost everyone should. The Producer Price Index measures inflation from the other end of the transaction: not what consumers pay, but what producers receive. Because production precedes consumption, PPI is a genuine leading indicator for consumer prices, often telegraphing CPI moves by two to three months before they arrive.

What the PPI Is and How It Started

The Producer Price Index measures the average change over time in the selling prices received by domestic producers for their output. Where the CPI captures prices from the buyer's perspective — what households pay at the checkout — the PPI captures prices from the seller's perspective: what a manufacturer, farmer, or service provider receives for their goods and services before they move through the distribution chain to reach consumers.

BLS has published producer price data since 1902, making it one of the oldest federal economic time series. Until 1978 it was called the Wholesale Price Index (WPI), a name that reflected its original focus on goods changing hands at the wholesale level. The rename to Producer Price Index signaled a conceptual shift: the program had expanded to cover services and construction in addition to goods, and “wholesale” no longer accurately described what was being measured.

The current PPI program collects approximately 100,000 price quotes each month from roughly 25,000 establishments spanning manufacturing, agriculture, mining, fishing, forestry, natural gas and electricity production, construction, and a broad range of service industries. That sampling footprint gives the PPI comparable depth to the CPI, though because it covers business-to-business transactions in addition to final sales, the underlying universe is substantially larger.

Three Indexing Systems

A source of confusion for anyone approaching PPI for the first time is that BLS publishes not one PPI but three distinct and largely separate indexing systems. They measure related but different things and are used for different analytical purposes.

Final Demand PPI (FD-PPI)

The Final Demand Producer Price Index, launched in January 2014, is the headline measure that BLS now leads with in its monthly release. It covers goods, services, and construction that are sold to final demand — meaning purchasers who will not resell or further transform them. Final demand is divided among personal consumption, capital investment, government, and export demand.

FD-PPI has three main subdivisions:

The FRED series for the FD-PPI headline is PPIFIS (Final Demand, not seasonally adjusted). The seasonally adjusted variant is PPIFIS with the SA suffix. Core PPI (FD less food and energy) is PPICOR.

Intermediate Demand PPI (ID)

The Intermediate Demand system tracks goods and services used as inputs in production — materials, components, and services that producers buy in order to make their own output. This is the stage-of-processing view of the supply chain. BLS organizes intermediate demand into two main tracks:

BLS also distinguishes intermediate demand for services and construction inputs, covering services purchased by businesses as production inputs rather than as final consumption.

Traditional Commodity-Based PPI

The legacy commodity-based system organizes more than 10,000 commodity indexes by type of product rather than by stage of demand. These are the oldest PPI series, many with history extending back to the early 20th century, and they remain widely used in escalation clauses, commodity contracts, and historical research. The all-commodities index (FRED: PPIACO) is the broadest single series in this system. The commodity indexes are organized by groupings such as Farm Products, Processed Foods and Feeds, Textile Products and Apparel, Hides Skins and Leather, Fuels and Related Products, Chemicals and Allied Products, Rubber and Plastic Products, Lumber and Wood Products, Pulp Paper and Allied Products, Metals and Metal Products, and so on through 15 major groupings.

The Trade Services Component: Measuring Margins, Not Prices

The most conceptually unusual element of the FD-PPI is the trade services component. Unlike every other PPI series, which measures the price of a good or service, the trade services index measures the margin between the price at which wholesale or retail trade establishments buy goods and the price at which they sell them. In other words, it captures distributor and retailer markup behavior, not the price of the goods themselves.

This matters for interpreting the headline FD-PPI because the trade services component is weighted at roughly 20% of the final demand services category, giving it meaningful influence on the aggregate index. When wholesale and retail margins are compressing — as they did in early 2023 when goods demand softened and retailers cut prices to clear inventory — trade services PPI falls even if underlying goods prices are flat or rising. When margins expand, trade services PPI rises independent of supplier costs. The divergence between trade services PPI and CPI goods prices is therefore a direct measure of retailer margin behavior, which can be analytically useful in tracking who in the supply chain is absorbing or passing through cost shocks.

The Stage-of-Processing Pipeline

One of the most powerful analytical uses of PPI is tracing how price pressures propagate through the production chain from raw inputs toward consumer prices. The pipeline runs: unprocessed raw materials → processed intermediate materials → finished goods for intermediate demand → final demand goods → consumer prices (CPI).

Each stage typically displays greater volatility than the next, because raw material prices respond immediately to commodity markets, while finished goods prices reflect months of cumulative hedging, inventory management, and contract adjustment. Under normal conditions, a sustained move in crude materials PPI takes six to nine months to work fully through to finished goods prices and another one to three months beyond that to appear in CPI.

The 2021–2022 supply chain inflation episode made this pipeline unusually visible. Starting in mid-2020, unprocessed goods PPI began rising sharply as commodity demand rebounded from pandemic lows. By early 2021, processed intermediate materials were accelerating. By mid-2021, finished goods and final demand indexes were moving. CPI for goods followed in late 2021 and peaked in early 2022 — the textbook pipeline sequence, compressed into an unusual time frame because every stage was hit simultaneously by the same supply disruptions. The PPI for crude goods peaked at over +35% year-over-year in mid-2021, nine months before the CPI for goods peaked.

PPI vs. CPI: The Leading Indicator Relationship

The relationship between PPI and CPI is well-established empirically for the goods component of the economy, less clear for services, and essentially absent for housing.

For goods, the transmission mechanism is direct. A manufacturer pays more for steel or plastic resin (intermediate PPI rises), passes the increase through to wholesale prices (finished goods PPI rises), and the retailer eventually adjusts shelf prices (CPI goods rises). The lag reflects contract length, inventory buffering, and the time it takes retailers to reprice. Empirical studies typically find a two-to-three-month median lag between PPI for finished goods and CPI for goods, with the relationship strongest for commodity-intensive categories like food and energy.

The 2021–2022 episode confirmed this at scale. PPI for final demand goods peaked at +22.9% year-over-year in June 2022. CPI for goods had already been rising sharply, but its peak came several months earlier in terms of breadth, even though the energy component pushed the CPI headline higher into mid-2022. Core goods CPI peaked and then rolled over as goods supply chains normalized in late 2022, while PPI had already signaled the turn.

For services, the relationship is weaker. PPI for services (FRED: WPSFD) measures margins and service-sector producer revenues, while CPI for services measures what consumers pay. The two are correlated in the long run but can diverge significantly in the short run because service prices are heavily influenced by labor costs (which are measured in BLS payroll data, not PPI) and because service-sector pricing is often sticky and contract- driven rather than market-driven. Healthcare is the clearest example: PPI hospital services measures what insurers and Medicare pay hospitals, while CPI medical care measures what consumers pay for insurance premiums and out-of-pocket costs. The gap between the two captures the role of insurer and government intermediation — a quantity that moves on its own dynamics.

The spread between PPI and CPI for the same goods category is itself analytically useful as a measure of retailer margin behavior. When PPI for food rises faster than CPI for food, grocery retailers are absorbing margin compression. When CPI for food rises faster than PPI for food, retailers are expanding margins. During the 2021–2022 episode, retail food margins were initially squeezed before retailers caught up; during the 2023 normalization, the pattern reversed in some categories.

Key PPI Subindexes and FRED Series

Economists and analysts tracking specific inflation pipelines typically monitor a handful of PPI subindexes alongside the headline:

Accessing PPI Data: BLS API

PPI data is available through the same BLS Public Data API endpoint as CPI: api.bls.gov/publicAPI/v2/timeseries/data/. The key differences are the series ID formats and the available history.

FD-PPI series IDs begin with WPS or PPI prefixes. The FRED series IDs (PPIFIS, PPIFAF, PPIFAE, PPICOR) map directly to BLS series IDs of the same name. For more granular commodity-based series, BLS uses a structured format: series IDs beginning with WPS followed by the commodity code — for example, WPS101 for Farm Products. For industry-based service PPI series, the format is PCU followed by two NAICS industry codes (the producing industry and the purchasing industry), making it possible to query producer prices for any specific NAICS industry that BLS covers.

Unregistered API access allows 25 series per day and up to 10 years of history. Registering for a free API key at bls.gov raises the limit to 500 series per day, 20 years of history, and enables the calculations parameter for server-side percent change computation. For the PPI commodity catalog — which contains thousands of series — bulk flat-file downloads are available at download.bls.gov/pub/time.series/wp/ for the traditional commodity system and at download.bls.gov/pub/time.series/fd/ for the Final Demand system.

PPI for Services: Healthcare, Airlines, and Portfolio Management

The expansion of PPI into services — which began in 1985 and has continued in waves since — is one of the less-discussed but analytically important developments in the program. Service-sector PPI series now cover a substantial share of the US economy and track producer revenues in industries where the CPI has historically struggled to capture cost dynamics.

Key service-sector PPI series and their analytical uses:

PPI in Economic Modeling and Contracts

Beyond its role as a leading inflation indicator, PPI data serves specific structural functions in economic measurement and in contract law.

The Bureau of Economic Analysis uses PPI data as a key source input in constructing the GDP implicit price deflator and the Personal Consumption Expenditures price index. Specifically, BEA incorporates PPI for various goods categories into the deflators used to convert nominal output measures into real (inflation-adjusted) terms for the National Income and Product Accounts. When PPI data is revised after an initial release — which happens as BLS incorporates additional survey responses — those revisions can propagate into subsequent GDP vintages.

In contract law, PPI commodity indexes are widely embedded in escalation clauses for long-term supply agreements. A steel fabricator selling components to an automaker on a multi-year contract may include a clause adjusting the contract price quarterly by the change in the PPI for steel mill products. Construction contracts routinely reference PPI indexes for lumber, concrete, copper, and other materials to share commodity price risk between contractor and owner. Davis-Bacon wage determinations for federally funded construction also reference regional construction cost data that partially draws on PPI construction inputs.

For monetary policy analysis, the Federal Reserve monitors PPI as a leading indicator for the PCE deflator, which is the Fed's official inflation target measure. Because BEA uses PPI source data in constructing PCE, movements in PPI that precede the PCE release are genuine signals about what PCE will show, not just correlated data. Fed economists studying the 2021–2022 inflation episode used PPI pipeline data extensively to assess whether the inflation surge was likely to prove transitory (a supply-chain unwind that PPI would reverse) or persistent (a demand-driven phenomenon that would show up in services and wages, which PPI does not capture well).

Notable Episodes in PPI History

Several episodes in recent history illustrate how PPI functions as an early-warning system for broader inflation dynamics.

2021–2022 supply chain surge. The Final Demand PPI for goods peaked at +22.9% year-over-year in June 2022, driven by energy (+55% at its peak), metals, and food. Intermediate demand PPI peaked even earlier and at higher magnitudes for specific categories: steel mill products exceeded +100% year-over-year in mid-2021 as automotive demand surged against constrained production. The pipeline view — tracking the sequence from crude materials through intermediate to final demand — showed the inflation surge building in every stage simultaneously, which was itself diagnostic. Normal supply shocks typically propagate gradually; the simultaneous surge at all stages indicated a demand shock overwhelming the pipeline rather than a localized supply disruption.

April 2020 energy collapse. When WTI crude oil futures went negative on April 20, 2020 — the first time in history that a major futures contract traded below zero — the energy PPI for April 2020 recorded a historic deflationary reading. The PPI for crude petroleum fell more than 60% year-over-year. This was purely a demand collapse (aviation grounded, driving stopped) combined with storage capacity constraints. The energy PPI recovered sharply beginning in early 2021 as demand returned before supply did, starting the commodity portion of the inflation pipeline.

2007–2008 commodity super-cycle. The PPI for all commodities (PPIACO) peaked in July 2008 at +27% year-over-year, driven by crude oil reaching $147/barrel and grain prices reaching multi-decade highs. The surge was abruptly reversed by the financial crisis, with PPIACO falling to –18% by mid-2009 as commodity demand collapsed. The episode illustrated both the leading-indicator property of PPI (CPI followed the surge and the collapse, with a lag) and the limits of that relationship during financial crises where demand destruction can overwhelm supply factors.

Python: Pulling and Plotting PPI Components

The following script uses the BLS Public Data API to retrieve five years of monthly data for the four key PPI series — Final Demand total, Foods, Energy, and core (less food and energy) — requests 12-month percent changes from the API, and plots all four on a single chart. The resulting chart shows the 2021–2022 surge across components and the asymmetric recovery, with energy reversing sharply while core PPI remained elevated.

import requests
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker as mtick
from datetime import datetime

API_URL = "https://api.bls.gov/publicAPI/v2/timeseries/data/"

# Series IDs
# PPIFIS  - Final Demand total (headline PPI)
# PPIFAF  - Final Demand Foods
# PPIFAE  - Final Demand Energy
# PPICOR  - Final Demand Less Foods and Energy (core PPI)
SERIES = {
    "PPI Final Demand (headline)": "PPIFIS",
    "PPI Foods": "PPIFAF",
    "PPI Energy": "PPIFAE",
    "Core PPI (ex food & energy)": "PPICOR",
}

end_year = datetime.now().year
start_year = end_year - 5

headers = {"Content-Type": "application/json"}
payload = {
    "seriesid": list(SERIES.values()),
    "startyear": str(start_year),
    "endyear": str(end_year),
    "calculations": {"output_type": 1},
}

resp = requests.post(API_URL, json=payload, headers=headers, timeout=60)
resp.raise_for_status()
data = resp.json()

if data.get("status") != "REQUEST_SUCCEEDED":
    raise RuntimeError("BLS API error: " + str(data.get("message", "")))

id_to_label = {v: k for k, v in SERIES.items()}

frames = []
for series_obj in data["Results"]["series"]:
    sid = series_obj["seriesID"]
    label = id_to_label.get(sid, sid)
    rows = []
    for obs in series_obj["data"]:
        if obs.get("period", "").startswith("M") and obs["period"] != "M13":
            pct = obs.get("calculations", {}).get("pct_changes", {}).get("1", None)
            if pct is not None:
                rows.append({
                    "date": pd.Period(obs["year"] + "-" + obs["period"][1:], freq="M").to_timestamp(),
                    "pct_change_12m": float(pct),
                    "series": label,
                })
    if rows:
        frames.append(pd.DataFrame(rows))

df = pd.concat(frames, ignore_index=True)
df = df.sort_values(["series", "date"])

fig, ax = plt.subplots(figsize=(12, 6))

line_styles = {
    "PPI Final Demand (headline)": {"color": "#0b4a8f", "linewidth": 2.2, "linestyle": "-"},
    "Core PPI (ex food & energy)": {"color": "#d97706", "linewidth": 2.0, "linestyle": "--"},
    "PPI Foods": {"color": "#059669", "linewidth": 1.6, "linestyle": "-."},
    "PPI Energy": {"color": "#dc2626", "linewidth": 1.4, "linestyle": ":"},
}

for label, grp in df.groupby("series"):
    style = line_styles.get(label, {})
    ax.plot(grp["date"], grp["pct_change_12m"], label=label, **style)

ax.axhline(0, color="#6b7280", linewidth=0.8, linestyle="-")

peak_date = pd.Timestamp("2022-06-01")
ax.axvline(peak_date, color="#9ca3af", linewidth=1.0, linestyle="--", alpha=0.7)
ax.annotate("FD Goods peak
+22.9% YoY (Jun 2022)",
            xy=(peak_date, 22),
            xytext=(pd.Timestamp("2022-09-01"), 20),
            fontsize=8, color="#6b7280",
            arrowprops={"arrowstyle": "->", "color": "#9ca3af"})

ax.yaxis.set_major_formatter(mtick.PercentFormatter(decimals=1))
ax.set_ylabel("12-Month % Change", fontsize=10)
ax.set_title("BLS Producer Price Index Components: 12-Month Percent Change", fontsize=13, fontweight="bold")
ax.legend(loc="upper left", fontsize=9)
ax.grid(axis="y", linestyle=":", alpha=0.4)
fig.tight_layout()
plt.savefig("ppi_components.png", dpi=150)
plt.show()
print("Chart saved to ppi_components.png")

The calculations field with output_type: 1 instructs the API to return percent changes alongside index levels; the 12-month change is at obs['calculations']['pct_changes']['1']in the response object. The annotation marking the June 2022 peak illustrates how to overlay historical event markers, which is useful when presenting PPI data in the context of supply chain episodes. A registered BLS API key (free, at bls.gov) raises the query limit to 500 series per day and enables requests for up to 20 years of history.

To extend the script to the intermediate demand pipeline, add WPSFD49207(processed goods for intermediate demand) and WPSID61 (intermediate demand total) to the SERIES dict. Plotting these alongside the Final Demand series on separate axes — because their magnitude during the 2021 surge was far larger than FD — reveals the full stage-of-processing sequence and makes the leading relationship visible directly.


Related writing

BLS CPI: The Consumer Price Index and the Federal Inflation Measurement Behind Every Policy Decision — the downstream counterpart to PPI: how CPI measures buyer prices, why the OER methodology lags market rents, and how CPI differs from the PCE deflator the Fed targets.

BEA GDP and National Accounts: The Federal Dataset That Measures the US Economy — the BEA NIPA accounts that use PPI source data to deflate nominal output into real GDP; covers the PCE price index and the GDP implicit price deflator.

BLS QCEW: The County-Level Employment and Wages Dataset Behind Every Local Economic Analysis — the wage-side input to service-sector inflation that PPI does not capture; county-level establishment payrolls and average weekly wages from the Quarterly Census of Employment and Wages.