How it works

Where Studio's pricing data comes from. And how we keep it accurate.

Seven sources, in priority order. Three weekly jobs that keep the data fresh. One commitment: every price you see is sourced, dated, and one tap from override.

The resolution cascade

For every ingredient, Studio walks seven sources in order.

  1. 1

    Menu cost override

    A price you explicitly set for one menu. Highest priority because it's your intent — Studio never second-guesses an override.

    As fresh as the day you set it.

  2. 2

    Your pricebook

    Your personal price library, built up automatically every time you confirm a price during costing. Every entry is timestamped with last_verified_at — produce expires after 14 days, everything else after 90, and you'll see a yellow badge nagging you to verify when an entry ages out.

    You control it. We nag you when it goes stale.

  3. 3

    Network median (chefs in your area)

    The median price paid by other SERVD chefs in your 3-digit zip area over the last 4 weeks. We aggregate this every Sunday morning. Auto-deprecated after 60 days so a long-stale bucket doesn't poison the cascade. Fires only when there are at least 3 chefs in the bucket.

    Refreshed every Sunday 03:00 UTC. Auto-deprecates at 60 days.

  4. 4

    Live retail (Kroger)

    If you marked Kroger as your primary market and set your store location, Studio hits the live Kroger Products API for real-time shelf prices. Returns the lower of regular and promo pricing. Low-confidence matches get a 'confirm before relying on it' badge.

    Real-time. Pulled the moment you cost a menu.

  5. 5

    Spoonacular estimate × your tier

    Generic NLP-aided estimate, multiplied by your primary-market tier (premium = 1.4×, wholesale = 0.65×). Always labeled 'estimate' in the UI so you know to verify before locking margin.

    Refreshed on-demand. Treat as a ballpark.

  6. 6

    SERVD catalog baseline

    The seeded catalog price for the ingredient. Last-resort fallback. Refreshed weekly across the top 200 most-used ingredients via Kroger + Spoonacular sweeps so even the fallback layer is never more than 7 days old.

    Refreshed every Sunday 04:00 UTC.

  7. 7

    Unpriced

    If nothing fires, Studio refuses to make up a number. The line is flagged 'unpriced' and the UI prompts you to set it before generating a proposal.

    N/A — we don't guess.

What runs every week

Three jobs that refresh the data so you don't have to think about it.

Sunday 03:00 UTC

Network median aggregation

Walks every chef's pricebook entries verified in the last 4 weeks, groups by ingredient × zip3 × unit, computes median + p25 + p75, writes to aggregated_prices.

Sunday 04:00 UTC

Catalog baseline refresh

Walks the top 200 most-used ingredients across the SERVD network. For each, hits Kroger Products API (Denver baseline location) and Spoonacular, blends the result, and updates the catalog baseline. Skips any update where the new price is >5× or <0.2× the existing one (almost certainly an API mismatch).

Sunday morning

Stale-price digest emails

Every chef whose pricebook has stale entries gets a personal email listing them, ranked by usage. One tap to update each.

The promise

Studio doesn't pretend to know prices. It learns yours. Day one, we use what other chefs near you are paying — refreshed weekly — as your starting truth. Day thirty, your pricebook is the truth. Either way, every price is sourced, dated, and one tap from override.