Rank pages by where effort actually pays off, by crossing search ranking potential against GA4 conversion rate. When at least one candidate page has a measured GA4 conversion, every page lands in one of four groups: rank_up_now (close to page one already and converts well, push it), improve_page_first (real ranking potential but converts poorly, fix the page before chasing more traffic to it), protect (already converts well but limited further ranking room, do not break what works), deprioritise (neither), returned under quadrants with quadrants_assigned: true. The split point on each axis is that axis's own median across the pages being compared, and both medians are returned so the split is auditable rather than a hidden cutoff. When NO candidate page has a measured GA4 conversion in this window, which is the normal case for a site without conversion tracking enabled, the conversion axis carries no signal: a median of zero would put every page 'at or above median' and mislabel all of them, protect included, so quadrants are not assigned. The response instead carries quadrants_assigned: false and a ranked_by_potential_only list, pages ranked by search ranking potential alone, with a note explaining why. Only pages with both a Search Console ranking signal and a measured GA4 session count are placed; a page missing one side cannot be scored honestly and is left out rather than scored with a zero. Both limit and offset apply per quadrant, and the pagination block carries one entry per quadrant, so a quadrant holding 80 pages is never mistaken for one holding 20. PAGING: this returns one page of rows. The pagination block reports returned, total_available, truncated and next_offset for every list in the response. Check truncated before drawing a conclusion: when it is true these rows are a slice, not the whole picture, and a total or a 'none of them' claim built on them is wrong. Read the rest with offset set to next_offset, or raise limit.