Product Operations
Case 05 / 13
Automated FDA and USDA recall monitoring
A monitor that pulls live FDA and USDA recall feeds, fuzzy-matches each notice to our SKU catalog, and alerts Slack — replacing someone reading the notices by hand.
Crave Robotics · 2026 · Sole designer and builder
- Recalls are published by two agencies, in free text, with product names that rarely match ours exactly.
- The monitor pulls both feeds live, fuzzy-matches against the SKU catalog, and posts to Slack.
- Alongside lot-code traceability in the platform, a match becomes a query for which machines hold the product.
- FDA and USDA APIs
- Fuzzy matching
- Slack API
- Scheduled jobs
Match a recall to the catalog
Interactive — synthetic dataPick a notice, change the threshold, or type your own. Matches and the Slack alert update live.
Incoming notices
Catalog matches for “Chiken Alfredo Pasta meal kit, ready-to-eat”
- Chicken Alfredo Pasta1.00Name match — 3 of 3 name words: chicken, alfredo, pasta
- Chicken Fried Rice0.33Name match — 1 of 3 name words: chicken
- Teriyaki Chicken Bowl0.33Name match — 1 of 3 name words: chicken
- Beef Bolognese Pasta0.33Name match — 1 of 3 name words: pasta
- Chicken Tikka Masala Bowl0.25Name match — 1 of 4 name words: chicken
Class I · USDA FSIS — Chiken Alfredo Pasta meal kit, ready-to-eat
Reason: Possible Listeria monocytogenes
Matches 1 active SKU: Chicken Alfredo Pasta (1.00)
Try the trade-off. Select the tortilla notice, then raise the threshold to 0.70. Ingredient exposures score 0.65, so they drop out: a stricter setting means fewer false alarms and a real chance of missing an exposure. Typo-tolerant matching is what catches “Chiken” for “Chicken”.
Production reads the live FDA and USDA feeds. This demo uses synthetic notices and a synthetic catalog, with the same normalize, tokenize, fuzzy-match, and threshold logic.
How it fits together
- 1Live FDA and USDA recall feeds
- 2Normalize and tokenize notices
- 3SKU-level fuzzy matching
- 4Score against threshold
- 5Slack alert
- 6Lot-level traceability
Read the full case study Hide the case study
The problem
Food recalls are announced by the FDA and the USDA as free-text notices. Someone has to read them, work out whether a recalled product or ingredient is in our catalog, and do it fast enough to act. That is easy to do for a handful of SKUs and does not hold up as the catalog grows, or as the person responsible gets busy.
Why it mattered
For frozen food sold from machines in public places, a missed recall is the worst-case operational failure, and the cost of a slow response grows with every hour the product stays on sale.
What I built
A scheduled job that reads the live FDA and USDA recall feeds through their APIs, normalizes the text, and matches each notice against every active SKU with fuzzy matching, so a misspelled or reworded product name still lands on the right item. Matches above a threshold post to a Slack channel with the agency, recall class, reason, and the SKUs it touches.
Ingredient-level notices are handled separately from finished products, because a recall of a raw ingredient is an exposure question, not a name match. It sits alongside the lot-code traceability in the operating platform, which is what lets a confirmed match be traced to specific machines.
What I learned
The matching threshold is a business decision, not a technical one. Set it too tight and you miss an exposure; too loose and the team learns to ignore the channel. That is why the demo makes it a control instead of burying it in code.
What I would do next
Close the loop inside the platform: a confirmed match should open the recall workflow itself and pre-fill the affected lots, instead of ending at a Slack message.
Described without confidential information. The demo and any figures inside it use synthetic data.