Skip to content

The sponsored card that arrived one turn late

A two-turn test for keeping a late ad response out of the wrong conversation.

Read as Markdown

The sponsored card that arrived one turn late

At the top of the chat, the shopper asks for a headlamp. By the time the offer is ready, they have found their old one and want to know how to change its batteries. The headlamp offer was a reasonable match when the request left. Pinning it to the newest message turns it into a bad recommendation.

Perplexity described a different placement in its advertising experiment: a brand could sponsor a follow-up question. The distinction matters to an engineer. A follow-up belongs to a particular answer. So does a product card. Its position in a moving transcript is an unreliable way to identify that answer. Read Perplexity’s experiment note.

Make the race happen on demand

Here is a complete JavaScript reproduction. The user changes tasks between starting the lookup and resolving it. Run it in Node.

const slots = new Map();
let current = "headlamp";
const requestedTurn = current;
let finish;
const offer = new Promise(resolve => { finish = resolve; });

const paint = offer.then(card => {
  if (requestedTurn === current) slots.set(requestedTurn, card);
});

current = "battery repair";
finish("Sponsored headlamp");
await paint;
if (slots.size !== 0) throw Error("Stale placement");

Change the callback to slots.set(current, card) and the example fails. A fast local network can hide this bug for months. A promise you resolve by hand reproduces it every time.

This example uses a policy that drops offers once the reader moves on. If a publisher wants old answers to retain their offers, it can instead write to the original answer’s slot. Either policy starts with capturing the turn ID before the request leaves.

Your next opportunity is in the conversation.

Advertise your brand or monetize your AI app. Find your starting point.

Book a call