Placement GuideNavigation & Checkout

Navigation & Checkout

Placements 07 and 08 — pin an Ask AI entry to the navigation menu, and answer delivery and returns questions in the cart with the shopper's real basket in context.

AI shopping one tap away in the nav menu — and reassurance at the moment of highest hesitation: checkout.

07 · Menu

AI shopping, always one tap away. An Ask AI item pinned to the navigation menu reaches shoppers who navigate rather than search — it sits beside the category links on both desktop and mobile instead of competing with them, and turns a browse into a conversation.

Interactive demo

Press Ask AI in the nav — on Mobile it is pinned as the drawer's first row

SOPHI

The nav item carries no product or query context, so it only needs to open the widget:

menu-entry.js
// The nav item just shows the widget — no context to pass
navAskAi.addEventListener('click', () => widget.show());

SDK reference

  • widget.show() — the nav item simply opens the assistant.
  • widget.sendToggleHistory()toggles the history panel, so a "Continue shopping with AI" entry should call it once on open, not on every press.
Best for

Navigation-first shopping flows. On mobile, pin Ask AI as the first row of the drawer so it never competes with category links for attention.

Checkout Widget

08 · Checkout

Catch the objection that empties the basket. Placement 04 answers these questions on arrival; this one answers them with the basket already filled, at the step where an unanswered doubt becomes an abandoned cart. Because the widget knows the cart, "when will it arrive?" gets an answer about these items — and the shopper never leaves the checkout flow to find it.

Interactive demo

Press a question chip — the assistant answers against the real basket

SOPHIShopping bag (2)
Secure checkout
Merino Roll-Neck JumperSize S · Slate blue$55.00
Qty 1
Lightweight Hooded Rain JacketSize M · Stone$68.00$85.00
Qty 1
Questions before you check out?
Order summary
Subtotal$123.00
DeliveryFree
Total$123.00
Checkout

Keep the widget's copy of the basket current, or the answers will describe a cart the shopper no longer has:

checkout-widget.js
// Sync on load and after every cart mutation.
// cartId is required; every item needs a non-empty productId AND variantId
// (quantity is optional). updateUserCart THROWS on an invalid shape — map your
// lines before calling it, and give single-variant products a stable variantId.
widget.updateUserCart({
  cartId,
  items: cartItems.map((line) => ({
    productId: String(line.productId),
    variantId: String(line.variantId ?? line.productId),
    quantity: line.quantity,
  })),
});

checkoutChips.addEventListener('click', (event) => {
  const chip = event.target.closest('[data-sophi-prompt]');
  if (!chip || !widget.isReady()) return;

  widget.show();
  widget.sendTextMessage(chip.dataset.sophiPrompt);
});

SDK reference

  • widget.updateUserCart(cart)required. Call it on initial load and after every add, remove, quantity change and cart restore.
  • on("add_to_cart")required handler. Apply widget-initiated additions to your cart, then call updateUserCart again.
  • on("send_to_checkout")required handler. Route the shopper to your checkout page.
This placement depends on cart sync

Without updateUserCart, delivery and return answers are based on stale basket state — which is worse than no answer at a moment when the shopper is already hesitating. Treat the cart sync as part of shipping this placement, not as a follow-up.

Best for

Reducing abandonment at checkout. Scope the chips to what is actually in the bag ("Can I return the jumper?") — a generic returns question is a help-centre link, not a reason to stay.

That is all eight placements — back to the overview and strategy table.

On this page