Composway Docs
Cookbook

Decide what to write next

Two different questions - demand you are visible for and losing, and demand you have no page for at all - asked in the order that keeps them apart.

Use this when the output is a brief rather than a fix. The order matters because the cheap half of the answer is free and the expensive half exists only because the free half is structurally blind to it.

find_content_gaps - half A, always returned and free: queries the site is already visible for (impressions above the threshold) where no page of yours ranks well. This is demand you are losing, not demand you are missing.

Read each row's cannibalizationStatus before briefing anything - confirmed re-labels the row gapType: "cannibalized" and lists the competingPages: consolidate, do not publish against yourself. possible names an unread sitemap URL in suspectedPages - open it first. none is the row this tool actually cleared. unknown means there is no usable sitemap inventory, so the row is a candidate rather than a cleared one.

find_emerging_keywords - queries being asked more often, read on impressions rather than clicks. Clicks lag by however long a page takes to rank, so rising impressions with flat clicks is exactly the row worth acting on. pattern: "accelerating" means the last rise was bigger than the one before it.

find_content_gaps with includeUncovered: true - half B: topics the workspace's confirmed products and audiences imply and the site has no page for. Half A cannot see these at all, because both engines list a query only if the site already drew an impression for it. This half costs money on every call (one LLM expansion plus one keyword-volume request per engine), is capped per workspace per day, and asks for confirmation first.

Follow recommendedAction on each half-B topic - create (nothing of yours is near it), refresh (a page of yours is adjacent, so expand pageToRefresh rather than publishing a second page against it), or verify_inventory (fewer pages were searched than the site has, so the absence is a limit, not a finding). Read coverage.nearestDistance alongside the verdict; the thresholds are declared, not calibrated.

An empty `uncovered` has three meanings

Read uncoveredStatus before concluding anything from it. not_requested means you did not ask for half B. unavailable means the workspace has no confirmed products or audiences for a topic to be implied from. failed means the expansion could not run. None of the three means the site has no uncovered demand.