How to connect your Kroger feed and show live store availability
From a developer.kroger.com application to live shelf status on your Where to Buy map: credentials, seed ZIPs, radius, freshness, and the daily call budget.
Kroger publishes a public API that answers, store by store, whether a product is carried, what it costs and which aisle it's in. Connect it to ProvisionSync and two things happen. Your Where to Buy locator starts showing live shelf status for every Kroger banner store in your footprint, and the Retailer Discrepancy report starts comparing what Kroger publishes about your products against your own label.
The banners covered are the ones Kroger runs on that API: Kroger, Baker's, City Market, Dillons, Food 4 Less, Foods Co, Fred Meyer, Fry's, Gerbes, Harris Teeter, Jay C, King Soopers, Mariano's, Metro Market, Pay Less, Pick 'n Save, QFC, Ralphs and Smith's. This guide takes you from a Kroger developer account to a locator with live answers on it.
Before you start
You need the Admin role, because feed settings and sync runs are admin-only actions. You need the Kroger Feed pack on your plan; without it the feed shows as Locked with a note to add it from your plan. And every retail product you want matched needs its UPC or GTIN entered on its packaging format, because the feed matches your catalog to Kroger's shelves by that number and nothing else. A product without one is never asked about.
Once the pack is on, Feed Sources appears in the sidebar. The page is a rail of feeds grouped by the question each one answers. Kroger sits under Store availability.
Step 1: get API credentials from Kroger
Register at developer.kroger.com and sign in. On the portal's Applications page, add an application and give it the Product scope, which Kroger calls product.compact. Both of this feed's reads run on that one scope. There is no redirect URI to supply, because nothing here signs a shopper in; the app only needs the client-credentials grant.
Copy the Client ID and the Client Secret. Kroger shows the secret once, so paste it somewhere safe before you leave the page.
Step 2: enter the settings
Open Feed Sources, pick Kroger in the rail, and open the Settings tab. Paste the Client ID and Client secret. Fill in the three settings below them, tick Enabled, and click Save. The credentials are encrypted the moment you save and are never shown again; afterwards the page can only tell you that a source is set up, not what's in it.
The three settings are Seed ZIPs, Radius (miles) and Data freshness (minutes). They decide which stores the feed asks about and how often, and they deserve a moment's thought.
How to choose seed ZIPs and a radius
Seed ZIPs are the footprint. The feed enumerates the stores around each ZIP you list, and a store that no seed ZIP reaches is never asked about. You can list up to 100 five-digit ZIPs, comma-separated. Kroger returns at most 200 stores per ZIP, nearest first, so a dense metro can hit that cap; a run notes which ZIPs did, and the ring that got cut off needs a neighbouring ZIP of its own.
Radius is how far around each seed ZIP to look, from 1 to 100 miles, default 25. Data freshness is how long an answer is trusted before the feed asks again, from 5 to 1,440 minutes, default 45. The footprint itself is enumerated once a day, or at once when you change the ZIPs or the radius; runs in between work from the held stores without a store call.
Start with the ZIPs of your strongest markets rather than the whole country. You can widen later, and the budget section below explains why you'd want to.
Step 3: test, then run
Click Test connection at the top of the feed. It takes a token through the same client the syncs use, so wrong credentials come back as rejected rather than as a vague "Kroger is down".
Then click Refresh availability. One click spends a slice of the day's budget: 40 product calls, which covers roughly 40 stores for a catalog of up to 50 retail SKUs. The hourly job carries on from wherever that click stopped, so you don't need to keep clicking. The Setup guide tab keeps a checklist while you go: Settings saved, Enabled, Has run, Last run succeeded. The feed's health word in the rail moves from Not set up to Connected, and if a run fails it reads Last run failed and the History tab says why.
The daily budget, and why freshness matters more than store count
Kroger allows 1,600 store calls and 10,000 product calls a day per app. Store calls cost one per seed ZIP per day, so those are rarely the constraint. Product calls are the ones to watch, and the unit of spend is a store, not a product: one call covers up to 50 of your UPCs at one store.
At the default 45-minute freshness, the daily spend is roughly 24 times the number of stores times the number of 50-SKU groups in your catalog. A 9-SKU catalog across 400 stores is about 9,600 product calls a day, right under the ceiling. At 1,440 minutes (once a day), the entire Kroger footprint of around 2,740 stores costs about 2,740 calls. So if you're about to add stores, widen the freshness first.
A run that stops early is not a failed run. "Stopped at Kroger's remaining quota" and "stopped at the API budget" both mean the rows already written are real, and the next run resumes where this one left off.
The other read: scanning Kroger's catalog
The second action on the feed is "Scan Kroger's catalog". It needs no ZIPs. It asks what Kroger publishes about your products (brand, ingredients, allergens, nutrition, images) and feeds the answers to the Retailer Discrepancy report, at one call per 50 SKUs for the whole catalog.
That report compares each source's published content against the label you author here, ranked worst first: Safety for an allergen difference, Material for different ingredients or a Nutrition Facts value, Gap for content a source is missing, Info for the cosmetic stuff. Your label is the source of truth and nothing on that page changes it; the scan can never alter one of your labels. The FAQ explains what standard the comparison uses.
What "carried" means on the locator
Carriage here means Kroger answered for that product at that store with a price or a stock level. That's what puts the store on your Where to Buy map with that product in its row. Kroger publishes no unit quantity anywhere, so the locator never claims how many are on a shelf, only In stock, Low stock or Out of stock, and only while the answer is fresh.
What to do when something looks wrong
Test connection is rejected: the Client ID or secret is wrong, or the application on developer.kroger.com doesn't have the Product scope. Re-copy both and save again.
The feed says Not set up after saving: it has no seed ZIPs, or Enabled isn't ticked. Refresh availability needs at least one ZIP and the source enabled.
A run notes a ZIP hit the 200-store cap: add a neighbouring ZIP so the stores past the cut-off get their own ring.
Stores are showing but no stock chips appear: there is no fresh answer for that store yet. Wait for the next hourly run, or shorten the freshness if the budget allows, so the feed asks again sooner.
Once Kroger is answering, the same rail has UNFI, KeHE and Crisp for the distributor placements you already receive as exports. Each is its own pack, so you add only the ones your products flow through. And if you're not on ProvisionSync yet, start with a free account, enter your products with their UPCs, and the feed has something to match against.
Questions
How many Kroger API calls does the feed use?
Kroger allows 1,600 store calls and 10,000 product calls a day per app. One product call covers up to 50 of your UPCs at one store, so at the default 45-minute freshness a 9-SKU catalog across 400 stores uses about 9,600 product calls a day.
Which Kroger banners does the feed cover?
Kroger, Baker's, City Market, Dillons, Food 4 Less, Foods Co, Fred Meyer, Fry's, Gerbes, Harris Teeter, Jay C, King Soopers, Mariano's, Metro Market, Pay Less, Pick 'n Save, QFC, Ralphs and Smith's.
Can the Kroger feed change my label?
No. The catalog scan reads what Kroger publishes about your products for the Retailer Discrepancy report. Your label is the source of truth, and nothing in the feed or the report writes to it.