Supplier Finance Obligations in Consumer Staples
Reverse factoring in accounts payable: supplier finance obligations for 34 XLP consumer staples, pulled from SEC XBRL via API, with filing receipts.

26 of the 34 operating companies in the Consumer Staples Select Sector SPDR Fund (XLP) return supplier finance program data for their latest fiscal year in the endpoint. For the 20 with a ratio, the median obligation is 17.1% of accounts payable, and the range runs from 1.3% at Sysco to 46% at Keurig Dr Pepper.
Supplier finance, also called reverse factoring, covers supplier invoices a company has confirmed to a bank or other finance provider, which can then pay the supplier early. The amount still owed sits inside accounts payable, not debt, so the balance sheet does not show it on its own line. Since ASU 2022-04 (ASC 405-50), filers must disclose the outstanding amount, and from the following year a roll-forward of what was added and paid. The disclosure is tagged in XBRL, so you can measure it across companies with an API instead of reading notes one 10-K at a time. Below: the count, the distribution, the receipts, the code that reproduces it, and the three traps we hit on the way.
26 of 34 consumer staples companies return supplier finance data
We asked /api/footnotes/supplier-finance for the latest annual period of every operating company in XLP. Each request came back in one of three shapes, and none failed:
| Outcome | Companies | What it means |
|---|---|---|
totals.obligation present | 17 | The filer tagged the whole outstanding obligation. |
obligationCurrent only | 9 | The filer tagged the current portion and nothing else. |
| Empty array | 8 | None of the standard supplier finance elements found: COST, MNST, CASY, CHD, KHC, BG, HRL, BF-B. |
| Error | 0 | Every ticker resolved. |
So 26 of 34, about three in four, tag the standard supplier finance elements. That is a statement about one sector's index fund, not about all filers: grocers, beverage makers and packaged food companies buy a lot from a lot of suppliers, which is where these programs live.
An empty array means the endpoint found none of the standard us-gaap supplier finance elements. It does not mean the company has no program. Kraft Heinz is the example in this set: the endpoint returns an empty array, yet its 10-K for the fiscal year ended 2025-12-27 (accession 0001637459-26-000009) describes supplier finance programs in its financing arrangements note and tags the amounts with elements outside the supplier finance family: a general trade payables element for the balance and company-specific elements for the flows. So the number of companies with a program is at least 27, and an empty array should be read as "not tagged with the standard elements", nothing more.
The universe is 34 operating companies you can re-pull
The list comes from XLP's Form N-PORT report for 2026-06-30, via /api/fund/holdings. The report has 40 rows. We kept the 34 with asset category EC (equity, common) and dropped six: 4 State Street short-term cash vehicle rows (3 money market, 1 securities lending), one "CONTRA WALGREENS BOOTS" row with no ticker, and one consumer staples futures contract. Bunge is domiciled in Switzerland but files with the SEC, so it stays in.
The rules, fixed before looking at any ratio:
- Numerator: the latest annual period from the supplier finance endpoint,
totals.obligation, ortotals.obligationCurrentwhen that is the only key. - Denominator:
accountsPayablefrom /api/financials/balance-sheet for the samefiscalYear. Trade payables, not the widertotalPayable(more on that below). - Join on
fiscalYear, never on the period string. - All values in US dollars (the default), pulled 2026-11-07.
20 of the 26 companies that return data have a ratio. The other 6 are held out. For five of them (PG, WMT, MDLZ, TGT, KMB), the latest annual value the API returns today is rounded to the nearest $0.1 billion and dated to a later 10-Q rather than the 10-K. For Colgate-Palmolive (CL), the only annual row comes from a 10-Q: its 10-K says the amount was not material and gives no figure. We are checking all six against their filings, and they stay out of the distribution until that is done. They still count among the 26 that return data.
Obligations run from 1.3% to 46% of accounts payable
Across the 20 companies with a ratio, the median is 17.1%, halfway between PepsiCo (14.4%) and Dollar Tree (19.9%). A quarter sit at or below 5.7% and a quarter at or above 24.4%. 9 of the 20 are above 20%: for those companies, at least one dollar in five of trade payables runs through a supplier finance program.
Gray bars mark companies that tag only the current portion, so their ratios may understate the full obligation.
| Company | Period end | Field | Obligation | Accounts payable | Share of AP |
|---|---|---|---|---|---|
| Keurig Dr Pepper KDP | 2025-12-31 | obligationCurrent only | $1,378M | $2,996M | 46.0% |
| General Mills GIS | 2026-05-31 | both keys | $1,399.6M | $3,729.5M | 37.5% |
| J M Smucker SJM | 2026-04-30 | both keys | $325.1M | $1,175.1M | 27.7% |
| McCormick MKC | 2025-11-30 | obligation | $332.1M | $1,259.4M | 26.4% |
| Philip Morris International PM | 2025-12-31 | obligationCurrent only | $1,112M | $4,407M | 25.2% |
| Coca-Cola KO | 2025-12-31 | obligation | $1,363M | $5,649M | 24.1% |
| Hershey HSY | 2025-12-31 | obligationCurrent only | $300.3M | $1,255.7M | 23.9% |
| Clorox CLX | 2026-06-30 | obligationCurrent only | $229M | $996M | 23.0% |
| Altria MO | 2025-12-31 | obligation | $159M | $750M | 21.2% |
| Dollar Tree DLTR | 2026-01-31 | obligation | $305.1M | $1,530.7M | 19.9% |
| PepsiCo PEP | 2025-12-27 | obligationCurrent only | $1,681M | $11,704M | 14.4% |
| Kenvue KVUE | 2025-12-28 | obligationCurrent only | $314M | $2,473M | 12.7% |
| Dollar General DG | 2025-01-31 | obligationCurrent only | $399.7M | $3,833.1M | 10.4% |
| Molson Coors TAP | 2025-12-31 | obligation | $157.7M | $1,822.8M | 8.7% |
| Archer-Daniels-Midland ADM | 2025-12-31 | obligation | $301M | $5,195M | 5.8% |
| Estee Lauder EL | 2026-06-30 | obligationCurrent only | $87M | $1,578M | 5.5% |
| Constellation Brands STZ | 2026-02-28 | obligation | $50.7M | $960.2M | 5.3% |
| Kroger KR | 2026-01-31 | obligationCurrent only | $277M | $10,488M | 2.6% |
| Tyson Foods TSN | 2025-09-27 | obligation | $52M | $2,601M | 2.0% |
| Sysco SYY | 2026-06-27 | obligation | $83M | $6,640M | 1.3% |
Period ends span 2025-01-31 to 2026-06-30 because fiscal years differ. Dollar General's row is its fiscal year ended 2025-01-31: the endpoint has no later annual row for it yet, although its next 10-K is filed, so treat that row as one year older than the rest.
The outliers
Keurig Dr Pepper, 46%. $1,378M tagged as obligationCurrent against $2,996M of accounts payable (10-K accession 0001418135-26-000016). The balance is falling: the same endpoint returns $1,740M a year earlier and $2,389M the year before that.
Sysco, 1.3%. $83M against $6,640M of payables (accession 0000096021-26-000033). Sysco still ran $1,072M of invoices through the program in the year, so a small ending balance does not mean a small program. It means invoices leave it quickly.
Kroger, 2.6%. The second largest payables book in the table ($10,488M, behind PepsiCo) and one of the smallest ratios. Kroger is also the cleanest receipt, so it gets its own section below.
The denominator moves the answer: Coca-Cola is 24.1% or 9.2%
The balance sheet endpoint returns two payables fields. accountsPayable is trade payables. totalPayable is the wider line many companies present, with accrued expenses folded in. For 15 of the 20 companies they are the same number. For 5 they are not, and the ratio changes a lot:
| Ticker | accountsPayable | totalPayable | Ratio on AP | Ratio on total |
|---|---|---|---|---|
| KO | $5,649M | $14,813M | 24.1% | 9.2% |
| PEP | $11,704M | $25,903M | 14.4% | 6.5% |
| CLX | $996M | $1,600M | 23.0% | 14.3% |
| TAP | $1,822.8M | $2,876.7M | 8.7% | 5.5% |
| EL | $1,578M | $1,783M | 5.5% | 4.9% |
Coca-Cola's $1,363M obligation is 24.1% of its $5,649M of trade payables, or 9.2% of the $14,813M "accounts payable and accrued expenses" line on its balance sheet. PepsiCo moves from 14.4% to 6.5%, Clorox from 23% to 14.3%. Neither number is wrong. They answer different questions, so pick one rule, apply it to every company and print it next to the result. We use trade payables because the supplier invoices in a program are trade payables.
Kroger's 10-K tags match the API to the million
A ratio is only as good as the two facts behind it, so here is one company traced from filing to field. Kroger's 10-K for the fiscal year ended 2026-01-31 (accession 0001104659-26-037723, filed 2026-03-31) says the amounts tied to its supplier arrangement are included in accounts payable. These are the XBRL facts in that filing and where they land in the API:
| Filing line | XBRL element | API field | Value |
|---|---|---|---|
| Balance at the end of the year | us-gaap:SupplierFinanceProgramObligationCurrent | totals.obligationCurrent | $277M |
| Invoices confirmed during the year | us-gaap:SupplierFinanceProgramObligationIncrease | totals.additions | $1,473M |
| Confirmed invoices paid during the year | us-gaap:SupplierFinanceProgramObligationDecreaseSettlement | totals.settlements | $1,490M |
| Accounts payable (balance sheet) | us-gaap:AccountsPayableCurrent | accountsPayable (balance sheet) | $10,488M |
The roll-forward closes: $294M at 2025-02-01, plus $1,473M confirmed, minus $1,490M paid, is $277M. Kroger tags the balance with the current element only, which is why its row reads obligationCurrent. Filers that tag the whole balance use us-gaap:SupplierFinanceProgramObligation: Altria's 10-K (accession 0000764180-26-000017) carries $159M on that element, which the API returns as totals.obligation.
Do not assume every roll-forward closes. 19 of the 20 companies have all three parts for the latest year. Computed from API values, 13 close exactly and 6 leave a residual. Coca-Cola is one: $1,330M opening plus $5,019M confirmed minus $4,974M paid gives $1,375M, against a reported $1,363M. A residual can come from foreign exchange, reclassifications or a rounded opening balance, and the filing note is where you find out which. Compute it, flag it, do not hide it.
Outside the index, FMC shows how much these balances can move. Its obligation went $307.5M (2022-12-31), $71.9M (2023-12-31), $227.4M (2024-12-31), $109.5M (2025-12-31), and the roll-forward closes exactly for 2023, 2024 and 2025, matching its 10-Ks (accessions 0000037785-25-000030 and 0000037785-26-000041). A single-year snapshot of a balance like that tells you little; the series and the flows tell you more.
One Pro request returns the balance and the roll-forward
curl "https://api.stockfit.io/v1/api/footnotes/supplier-finance?symbol=KR&period=annual&limit=2" \
-H "Authorization: Bearer YOUR_API_KEY"[
{
"period": "2026-01-31",
"fiscalYear": 2026,
"fiscalPeriod": "FY",
"totals": {
"currency": "USD",
"obligationCurrent": 277000000,
"additions": 1473000000,
"settlements": 1490000000
},
"programs": [],
"dateFiled": "2026-03-31"
},
{
"period": "2025-02-01",
"fiscalYear": 2025,
"fiscalPeriod": "FY",
"totals": {
"currency": "USD",
"obligationCurrent": 294000000,
"additions": 1797000000,
"settlements": 1828000000
},
"programs": [],
"dateFiled": "2025-04-01"
}
]totals carries the whole-company figures. programs carries per-program figures for the few filers that break them out; the two overlap, so never add them together. Philip Morris returns totals.obligationCurrent of $1,112M and a single program entry of $1,100M; adding them would count the same obligation twice.
The script below rebuilds the study: universe from N-PORT, numerator from the supplier finance endpoint, denominator from the free balance sheet endpoint, joined on fiscalYear.
import statistics
import requests
BASE = "https://api.stockfit.io/v1/api"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}
def get(path, **params):
r = requests.get(f"{BASE}{path}", headers=HEADERS, params=params, timeout=30)
r.raise_for_status()
return r.json()
holdings = get("/fund/holdings", symbol="XLP", reportDate="2026-06-30", pageSize=100)
tickers = [h["mappedSymbol"] for h in holdings["data"] if h["assetCat"] == "EC"]
rows = []
for t in tickers:
periods = get("/footnotes/supplier-finance", symbol=t, period="annual", limit=3)
if not periods:
rows.append({"ticker": t, "shape": "empty"})
continue
latest = periods[0]
totals = latest["totals"]
value = totals.get("obligation", totals.get("obligationCurrent"))
shape = "total" if "obligation" in totals else "current-only"
# Join on fiscalYear: period strings differ between endpoints for many filers.
sheets = get("/financials/balance-sheet", symbol=t, period="annual", limit=3)
ap = next((s["facts"].get("accountsPayable") for s in sheets
if s["fiscalYear"] == latest["fiscalYear"]), None)
ratio = value / ap if value is not None and ap else None
rows.append({"ticker": t, "shape": shape, "period": latest["period"],
"dateFiled": latest["dateFiled"], "ratio": ratio})
ratios = sorted(r["ratio"] for r in rows if r.get("ratio") is not None)
print(len(rows), "companies,", sum(r["shape"] != "empty" for r in rows), "return data")
print("median", statistics.median(ratios))
print("quartiles", statistics.quantiles(ratios, n=4, method="inclusive"))The script keeps the six held-out companies; drop them to match our table. Two more notes before you trust the output. First, keep dateFiled in every row: it shows which filing supplied the value, and it is how we spotted the five rounded rows held out above. Second, the join. For 7 of the 20 companies (KR, PEP, KVUE, GIS, TSN, DLTR, DG) the two endpoints print different period strings for the same fiscal year. Kroger is 2026-01-31 in the footnote and 2026-01-30 on the balance sheet. A join on period silently drops a third of the table.
To check any row against the filing, pass the accession number to /api/filings/search-by-accession-number, which returns the filing URL, form type and dates. The same dataset is available to AI assistants through the StockFit MCP server as the tool footnotes_supplier_finance, so an agent can run this sweep and check every number against its filing instead of guessing; setup is on the MCP page.
An empty array, a current-only value and a total are three different answers
Code that reads only totals.obligation would have reported 9 of these companies as having no balance. The shapes we saw across the 26 companies that return data:
- Total only. Coca-Cola, Altria, Archer-Daniels-Midland and others:
obligationplus the roll-forward. - Current only. Kroger, PepsiCo, Keurig Dr Pepper, Hershey, Clorox and four more. Kroger's filing says the current amount is the amount in accounts payable, so treat it as the obligation and keep the shape in your output.
- Both keys, same value. General Mills and J M Smucker tag the balance twice. Take one, never sum.
- Partial roll-forward. McCormick returns additions with no settlements; Colgate-Palmolive returns a balance with no flows.
- No roll-forward in the first year. The roll-forward became required a year after the balance, so for many filers the earliest annual period returns the balance only.
- Empty array. 8 companies. No standard elements is not the same as no program: Kraft Heinz discloses its programs under other tags.
What this count cannot tell you
- It is one sector. 34 companies in one consumer staples fund. Do not read 26 of 34 as a rate for the market.
- Six large companies are missing from the ratio. Procter & Gamble, Walmart, Mondelez, Target, Kimberly-Clark and Colgate-Palmolive return data, but their latest values are held out until they are reconciled against their filings.
- Precision follows the tagged value. The ratio uses whatever precision the XBRL value carries, so read the filing note before quoting a decimal.
- Periods differ. The 20 latest fiscal years end in eight different months, so the table is a set of latest annual snapshots, not one date.
- It is not a distress signal. A supplier finance program is a payables arrangement, and a high share says how a company pays its suppliers, not whether it will pay its lenders. This is data, not investment advice.
To put the number in context, compare it with funded debt from the debt tranche structure API, and with the other liabilities that sit off the face of the statements: operating and finance leases and pension funded status. Because the endpoint serves the most recently filed value for each period, a later filing can replace an earlier one; the XBRL to JSON backtesting guide covers how to handle that in a backtest. The standard itself is summarized in the Journal of Accountancy's note on ASU 2022-04.
/api/footnotes/supplier-finance is on the Pro plan ($99/month, or $69/month billed annually), with the rest of the footnotes family. The balance sheet endpoint used for the denominator is free. to try the free endpoints first.
FAQ
Q.What is a supplier finance program obligation?
SupplierFinanceProgramObligation or, for the current portion, SupplierFinanceProgramObligationCurrent.Q.Where do supplier finance obligations show up on the balance sheet?
Q.How many consumer staples companies tag supplier finance obligations in XBRL?
Q.What share of accounts payable is supplier finance for consumer staples companies?
totalPayable field instead lowers the ratio for 5 companies, Coca-Cola from 24.1% to 9.2%.Q.Why does the API return an empty array or only obligationCurrent?
obligationCurrent means the filer tagged the balance with the current-portion element, as 9 of the 26 XLP companies that return data do. Read obligation first, fall back to obligationCurrent, and keep the shape in your output.Q.Does a supplier finance program mean a company is in financial trouble?
Q.Can I get supplier finance data through an MCP server?
footnotes_supplier_finance, so an AI assistant can pull the obligation, current portion and roll-forward for a ticker, with the filing date of each value. Supplier finance data is on the Pro plan.Ready to build?
Free API key, no credit card.