Skip to content
Recipe API

One Cart, Many Eaters: The Preference Ledger Behind Grocery Agents

Instacart and Shipt launched grocery assistants on the same day. Their household, history, and collaboration features point to a harder API problem: compiling scoped preference evidence into a safe, versioned planning context.

personalizationgroceryfood-aimeal-planningapi-design

Two launches move the boundary from prompts to memory

On September 9, Instacart and Shipt separately launched AI shopping assistants that turn broad intent into grocery carts. Instacart introduced Clementine with generated or publisher-sourced recipes, household preferences, order-history-based restocking, deals, store inventory, and an expanded preference center. Instacart says customers can set choices once and have the assistant apply them across the experience.

Shipt introduced Ask Shipt for prompt-, recipe-, and photo-to-cart workflows. Its announcement emphasizes review, swaps, and edits before checkout, and also previews Shared Lists, where family members, roommates, or friends can contribute to one list in real time.

These are company announcements, not independent evaluations of recommendation accuracy. Their value as signals is architectural: one launch combines explicit settings with behavior learned from past orders, while the other places multiple contributors near the same cart.

Fresh primary source Date What it contributes
Instacart, Clementine announcement September 9, 2026 Persistent preference settings, shopping-history signals, household language, recipes, current inventory, promotions, and repeat-order behavior in one assistant
Shipt, Ask Shipt announcement September 9, 2026 Prompt/photo/recipe-to-cart input, user review and swaps, plus an announced collaborative-list surface involving several people

This blog has already covered the versioned proposal between a meal prompt and cart commit, dietary evidence, allergen unknowns, and privacy risks in grocery histories. Repeating “chat should not write directly to a cart” would add little. The new issue is the state that exists before a proposal: who a preference belongs to, how it was learned, when it applies, and whether it may govern a shared meal.

The thesis: when grocery agents learn from orders and let several people shape shopping, they should compile each planning request from a versioned ledger of scoped, attributable preference assertions—not treat a household as one mutable diet profile.

The shopper is not necessarily the eater

A purchase account may represent one shopper, several eaters, guests, children, or a caregiver buying for someone elsewhere. The person adding an item may not consume it. A repeated purchase may indicate preference, convenience, a standing request from another person, or an item bought for work.

That makes common shortcuts unsafe:

  • past purchase does not equal personal preference;
  • no past purchase does not equal dislike;
  • one household member's choice does not automatically bind everyone;
  • a shared-list addition is not consent to infer a health condition;
  • “nut-free” in one prompt may describe an event, a school rule, or a lasting allergy constraint;
  • an account-level setting cannot prove that a specific product or recipe satisfies it.

The data model therefore needs both a subject and a scope. vegetarian might apply to one member, every shared dinner, or only a visiting guest this weekend. prefer_brand:x may belong to the purchaser but be irrelevant when planning meals for another member. A strict budget can govern the cart while cuisine variety governs recipe ranking. Flattening all of these into preferences: ["vegetarian", "budget"] loses the information needed to resolve conflicts.

Keep four layers separate

A robust personalization service can separate four kinds of state:

  1. Evidence events record what happened: a user selected a preference, wrote a prompt, removed a suggestion, purchased an item, or added something to a shared list.
  2. Preference assertions interpret evidence for a named subject and scope: “member A explicitly avoids peanuts” or “the household may prefer this brand, inferred from repeat orders.”
  3. Planning-context snapshots select the assertions that apply to one meal, event, retailer, date, and group of eaters.
  4. Decisions record how recipes and products were included, excluded, ranked, or left unresolved under that snapshot.

This separation lets an inference change without rewriting history. A new model can reinterpret repeat orders, while the original purchase events remain intact. A member can revoke an explicit setting without deleting old meal plans. A support team can reproduce why yesterday's cart differed from today's without reading an entire chat transcript.

A preference assertion needs more than a tag

One internal representation could look like this:

{
  "assertionId": "pa_01K4...",
  "subject": {"type": "household_member", "id": "member_2"},
  "concept": {"type": "ingredient", "id": "ingredient:peanut"},
  "stance": "exclude",
  "strength": "hard",
  "scope": {
    "mealTypes": ["shared_dinner"],
    "validFrom": "2026-09-09T00:00:00Z",
    "validUntil": null
  },
  "provenance": {
    "kind": "explicit_setting",
    "actorId": "member_2",
    "evidenceEventIds": ["evt_731"],
    "recordedAt": "2026-09-09T18:05:00Z"
  },
  "confidence": 1.0,
  "consent": {"personalizationUse": "allowed"},
  "status": "active"
}

Do not expose all internal identity or consent fields to every recipe client. The structural distinctions still matter. subject prevents a preference from silently becoming household-wide. provenance.kind distinguishes a setting from an inference. scope prevents a party request from becoming permanent. strength controls whether the planner may trade it off. status supports revocation and supersession instead of destructive updates.

For inferred preferences, add the inference model version, supporting event interval, confidence, and a conservative use policy. An inference such as “often buys oat milk” can boost ranking. It should not establish a milk allergy, exclude every dairy recipe, or produce a health explanation.

Compile a context; do not merge profiles

At planning time, the application should request an effective context for named eaters and an occasion:

{
  "contextId": "pc_01K4...",
  "profileVersion": 18,
  "participants": ["member_1", "member_2", "guest_temp_4"],
  "occasion": "shared_dinner",
  "constraints": [
    {
      "conceptId": "ingredient:peanut",
      "effect": "exclude",
      "policy": "block_on_unknown",
      "sourceAssertionIds": ["pa_01K4..."]
    }
  ],
  "rankingSignals": [
    {
      "conceptId": "cuisine:mexican",
      "effect": "prefer",
      "sourceAssertionIds": ["pa_01JZ...", "pa_01K1..."]
    }
  ],
  "conflicts": [],
  "expiresAt": "2026-09-10T00:00:00Z"
}

This is compilation, not averaging. If one participant has a hard exclusion and another prefers a conflicting ingredient, the result is not a medium-strength preference. The shared plan should preserve the exclusion, split the meal into explicitly separated options if policy allows, or return a conflict requiring a person to decide.

A useful resolution order is:

Situation Safe default
Explicit safety-relevant exclusion conflicts with inferred affinity Preserve the exclusion; suppress the inference and verify recipe and SKU evidence
Two soft cuisine preferences conflict Rank for variety or ask; record the chosen trade-off
Temporary event constraint conflicts with a persistent personal preference Apply event scope only to that context; do not rewrite the persistent assertion
Household setting conflicts with a member's explicit setting Return a scoped conflict; do not silently let account ownership decide authority
Product evidence cannot confirm a hard constraint Mark the item unresolved or block it; a preference ledger is not product verification

Recipe APIs sit in the middle of the decision

A personalization layer cannot work safely if the recipe API returns only prose and diet booleans. To evaluate a compiled context, clients need stable recipe versions, canonical ingredient identities, structured quantities, substitution relationships, and dietary decisions with supporting ingredient paths and unknown states.

The boundary should remain clear:

  • the preference service says what this planning context requests;
  • the recipe API says what the recipe contains or can substantiate;
  • the retailer catalog says what a selected SKU declares and whether it is available;
  • the orchestration layer says whether the combined evidence satisfies policy.

That separation matters when a recipe appears suitable but a chosen sauce has an unresolved compound ingredient, or when a substitution changes the dietary result. A persistent household exclusion should trigger re-evaluation after every recipe edit and SKU swap; it should not be copied into the recipe as if it were an intrinsic property.

Useful interfaces might include POST /preference-assertions, POST /planning-contexts:compile, and GET /planning-contexts/{id}/decisions. Writes should be idempotent and attributable. Context responses should include the profile version and assertion IDs used, so a meal proposal can pin its inputs. When a member changes a preference, existing proposals can become context_stale rather than changing invisibly.

Failure modes to test before launch

Failure What it reveals
A guest's request affects recommendations weeks later Temporary scope was persisted as a household rule
A child's explicit exclusion is overridden by repeat-order history Inference and explicit authority were flattened
Removing an item from one cart creates a permanent dislike One ambiguous event was promoted without threshold or confirmation
Two collaborators keep undoing each other's edits List operations lack actor identity, intent, and conflict handling
“Usuals” includes an item bought for someone outside the household Purchaser, recipient, and eater roles were conflated
A profile change silently alters an approved cart The proposal did not pin a planning-context version
An assistant calls a meal safe because a profile says “nut-free” Requested constraints were confused with recipe and product evidence

Operational metrics should also be scoped. Track explicit-setting retention, inferred-signal acceptance, conflict rate, stale-context invalidations, hard-constraint unknowns, recommendation overrides, and profile reversions. A high click-through rate can conceal a system that repeatedly makes users correct the same household misunderstanding.

A buyer's checklist for personalized food infrastructure

Before relying on a recipe or grocery platform for household personalization, ask:

  • Can one account represent multiple shoppers, eaters, and temporary guests?
  • Are explicit, inferred, imported, and event-only preferences distinguishable?
  • Does every assertion identify its subject, scope, provenance, status, and validity window?
  • Can users inspect, correct, revoke, and limit the use of inferred signals?
  • Are hard constraints kept separate from ranking preferences?
  • Does context compilation return conflicts instead of silently averaging them?
  • Are recipe, product, and substitution checks rerun against the same pinned context?
  • Can an approved proposal detect that its preference context became stale?
  • Are shopping histories minimized and access-controlled rather than copied into recipe requests?
  • Can the system explain a decision without exposing another household member's private evidence?

The September 9 launches show that grocery agents are becoming both persistent and collaborative. That combination is more consequential than another chat box. Once history, saved settings, photos, recipes, lists, and several people can shape one cart, personalization becomes a data-governance and API-design problem.

The durable design is a preference ledger feeding a versioned planning context. It preserves who said what, distinguishes behavior from instruction, contains temporary intent, and gives recipe and product services a precise constraint set to evaluate. One cart may serve many eaters, but the system should never pretend they are one user.

Sources

Start Building

One consistent schema on every response. Get a free key and ship in minutes.