Composway Docs
Cookbook

Get the brand and competitor sets right

Two small lists that silently decide what several other tools report - worth checking before you trust a branded split or a share of voice.

Use this when a branded/non-branded split looks wrong, a competitor is missing from an AI-visibility answer, or you are setting a workspace up for the first time. Neither list is cosmetic: brand terms decide which queries count as branded and which ones find_low_hanging_keywords excludes, and they are the same term set the AI-answer mention monitor scans for. The competitor set decides every competitive metric there is.

list_workspaces - both tools here take a workspaceId, not a site. list_sites also carries the mapping if you only know the domain.

get_workspace_brand_terms

  • brandTerms is the effective list (title plus confirmed aliases) and is what the other tools actually use. aliases is the editable set behind it; candidates are proposals awaiting confirmation, and are matched against nothing until promoted.

analyze_branded_vs_nonbranded

  • check the classification rather than assuming it. The terms applied come back in brandTerms and the biggest branded queries in sampleBrandedQueries, which is where a missing former name or a stray generic word shows up.

set_workspace_brand_terms, then re-run the split. replace sets the list outright and cannot be combined with add/remove; removals apply before additions, so a rename is one call. An alias that fails vetting - too short, longer than four words, duplicate, or over the eight-alias cap - comes back in rejected while the rest of the write still applies. Aliases need not resemble the workspace title; a former name or an acronym is exactly what this is for.

get_workspace_competitors

  • the tracked brands plus your own for reference (isSelf: true), each with the facts the detectors match on (aliases in answer text, domains and socialUrls in cited sources) and measuredDays, which says whether the brand has any history at all.

set_workspace_competitors

  • edit from what the previous step returned, because update replaces each list you pass wholesale (send the full list; [] clears one) and leaves omitted lists alone. Facts are vetted per value: a shared platform host such as linkedin.com is refused as a domain, since it would credit the brand with every citation of that platform - pass the profile URL, path included, in socialUrls instead.

Adding a competitor is not backfilled; removing one is permanent

A brand added today reads 0 until the next monitoring run, and measurement starts from that run onward. remove also discards the brand's recorded visibility history - check measuredDays and say what is being given up before running it.

One reading caveat on the branded split itself: the shares are shares of the rows each engine returned, not of the property. Brand queries are high-volume and sit inside Google's top ~5,000 while the non-branded long tail is exactly what the ceiling cuts, so on a truncated window the branded share is overstated. The response says whether that applies in unsupportedInputs. And total.avgPosition is always null by design - the engines define and report position differently, so read the per-engine figures.