Subsequent orders

How every later order flows

CustomerMTM MerchantTruemed1You ask what this customer may put on their HSA/FSA card, and badge yourmenu accordingly. Refresh the answer whenever your menu changes.GET /api/v1/eligibility/token/{token_id}returns eligibility_status + items + lmn_expires_at2Customer comes back, typicallyonce a week, and picks themeals for the next box, skipsthe week, or leaves it as itstands.3You charge the final basket against the stored token. This worksidentically whether the customer is on the site or the week rolls overunattended.POST /payments/v1/create_payment_session4Truemed classifies each line,splits the total across thetwo cards, authorizes, andreturns the outcome, with theexpiry date echoed again.5Box ships. Itemized receipt goes out. No new survey and no new card entry.

Two calls per order. This is the steady state for the life of the LMN.

The split: how a charge lands on two cards

Every charge in this flow splits. Because food is only partially eligible for HSA/FSA spend, even a meal the LMN covers puts only part of its price on the benefits card, and the rest goes to the regular credit or debit card. On top of that, some meals fall outside what the LMN covers, and those lines go entirely to the regular card. Truemed does not block an order for an uncovered line, and does not ask the customer to take another survey. One call, one order, two cards.

Comparable meals: why the split is fixed per meal

The eligible portion of a meal is not a percentage. HSA/FSA rules let a customer pay for the added cost of a medically tailored meal over an ordinary one, so every meal carries a comparable amount: the price of an equivalent grocery-store meal, which is the part that is never HSA/FSA-eligible and always lands on the regular card. The HSA/FSA-eligible amount is the meal price minus that comparable amount.

Two consequences follow, and both matter for what you show the customer:

  • Every order is a split, always. The comparable amount is greater than zero, so the regular card always carries at least the comparable amount times the number of meals. There is no all-HSA/FSA order in this flow.
  • The comparable amount is a fixed dollar figure per meal, not per dish. A meal is a meal, so one comparable amount typically applies across your whole menu regardless of which eligibility category a dish falls in. A distinct product line can carry its own comparable amount (a higher-cost line such as high-protein meals, for example), but within a line it is a single number.

That makes the estimate simple to build. If the comparable amount is, say, $3.34 per meal, the regular card carries about $3.34 × meal_count and the HSA/FSA card carries the rest. Your Truemed contact gives you the exact comparable amount for your menu. Truemed has no screen that shows this split to the customer, so if you want to show an estimate at selection or confirmation, you compute it from that figure and the meal count on your side.

Your Truemed contact can also confirm the comparable amount before you hardcode it, and will tell you if it changes.

That routing is what makes unattended charging possible:

CartWhat happensWhy it matters
Attended: customer is on your site choosing mealsYou already know which items are covered from the eligibility read, so you can badge the menu and show the customer which lines will land on which card before they confirm.No surprises at confirmation. The split you display and the split Truemed charges are computed from the same eligibility data.
Unattended: weekly rollover, no browser sessionExactly the same call, exactly the same split. Uncovered lines go to the regular card automatically.Because an uncovered item routes rather than blocks, a recurring charge never needs to bounce the customer into a browser to fix something.

When the HSA/FSA card cannot cover the eligible portion

A separate case, and the one you cannot see coming: the items are covered, but the account is short. If the HSA/FSA card partially authorizes or declines for insufficient funds, the unfunded remainder folds onto the regular card inside the same authorization, with no second call, no orphaned hold, and no customer action. From your side the charge succeeds; the receipt shows where each dollar went.

The trade-off is that the customer needs to be told before it happens rather than discovering it on their statement. Per-item disclosure at selection and at confirmation, plus the itemized receipt Truemed sends, covers it. Exact customer-facing wording is out of scope for this guide. Your Truemed contact will share a short messaging guide that specifies the phrasing for each of these moments.

Cards expire, get reissued, and get replaced after fraud. When both stored cards fail to authorize, the charge has nowhere to fold, and this is the one recurring-flow case where the customer has to act. The design absorbs it with timing rather than interruptions: charge each box at order cutoff, before it ships. The first order already works this way for a different reason (it waits for the token); every later order should be charged synchronously at cutoff too, while there is still lead time in the week.

When a charge fails this way, the same create_payment_session response tells you what to do next: next_action: UPDATE_PAYMENT_METHOD plus a redirect_url for the card-replacement page. It is the same Truemed-hosted page family as signup, embedded the same way, so card data never touches your servers. Getting the customer in front of that frame is your side of the loop, and it works in both of your worlds:

  • Customer is on your site: open it in a frame right there in the session, exactly as at signup.
  • Meals were picked for them, with no browser session: email them the link. You hold the current address, and this is exactly the nudge your lifecycle messaging already does well.

Once the customer saves a new card, Truemed fires payment_token.updated again, with the same token and refreshed payment_methods. That is your signal to re-submit the same create_payment_session: Truemed never retries a charge on its own. Re-using the original idempotency key is safe and correct, because it re-attempts the held charge rather than creating a second one.

The cutoff-to-ship window is your retry budget. Because the decline surfaces synchronously at cutoff, you know days before the box must ship. That window is how long the customer has to fix the card before you decide what to do with the box: ship on whatever authorized, hold it, or skip the week. That policy is yours, and the loop above supports all three.

The payment_methods snapshot on every token webhook carries each card’s expiry date, so you can also see an expiring card coming and prompt the customer before the first failure. Ask us for the on-demand update link if you want to build that.

Requalification: an annual event

Between annual renewals, your customers should not need to requalify.

The health survey a customer takes at signup qualifies them against your whole eligible catalog, meaning every meal Truemed’s clinical team has classified as potentially HSA/FSA-eligible, rather than against the basket they happen to be holding at that moment. Meals outside that set always charge to the regular card. Concretely, none of the following triggers a new survey:

  • Choosing different meals this week than last week
  • Adding a meal they have never ordered before
  • Skipping weeks, pausing, or resuming
  • Ordering a meal that turns out not to be covered, which simply routes to the regular card

There is one case where an existing customer would need to take a survey again: you add meals that address a dietary need the original health survey never asked about, and you want existing customers to be covered for them. New clinical ground means new survey questions, and there is no way to answer them retroactively. Even then it is your call: you can also let the new meals route to the regular card for existing customers, and let the next cohort pick them up automatically at signup.

Worth flagging early: the smaller and more stable the clinical ground your menu spans, the simpler this stays for everyone. Our clinical guidance is to keep it as small as the catalog honestly allows.

lmn_expires_at: how long the decision holds

An LMN is valid for 12 months. Truemed returns the expiry date on the eligibility read and echoes the same date on every payment session response, so you have it on the one call you make every week even if you never call the eligibility endpoint.

It does two jobs:

  • It bounds how long the decision holds. The practitioner’s decision for this customer stands until this date, after which coverage lapses and charges route to the regular card.
  • It is your renewal trigger. Use it to prompt the customer to requalify ahead of expiry, on whatever lead time suits your lifecycle messaging: 30 days, 14 days, two nudges, your call. You know your customers’ cadence better than we do.

Do not cache items until lmn_expires_at. The decision holds until that date, and the item list does not: a meal you add to the menu next month can be relevant to a customer who qualified last month, and a cached list would keep badging only the old menu. Refresh the eligibility read whenever your menu changes, and re-badge from the response. A short cache between menu changes is fine.

If an LMN does lapse, nothing breaks: the customer’s orders keep shipping and simply charge to the regular card until a new LMN is in place.