Onboarding
onboard_brand
Build or extend a brand's Knowledge Base through a data-informed interview.
Arguments
None.
Template
Run the Kreel brand onboarding interview. The goal is to build (or fill gaps in) this brand's Knowledge Base so every future report and recommendation is anchored in real brand context. This is re-runnable - each run picks up where the last left off, so only work the gaps. ## 0. Pick the brand first This account may reach more than one brand, and onboarding must land on the right one. Call `list_brands` before anything else (it returns each brand's name and id): - Exactly one brand: tell the user which brand you're onboarding, then continue. - Several: ask the user which brand to onboard, listing the options by name - show the id too when two brands share a name, so the choice is unambiguous. Wait for their answer; don't read or write anything until the brand is chosen. Pass the chosen brand's id as `brand` on every later call (`get_brand_context` and all the write verbs) - the id is always unique, so nothing lands on the wrong store. ## 1. Read the current state Call `get_brand_context` once. It returns the Brand Profile (`context`: vertical, price_tier, margin_band, target_roas, target_cpa, target_aov), prose `sections` (keys: positioning, icp, competitive_landscape, brand_voice), `competitors`, `learnings`, and `learning_cap` (active/cap). Treat any null profile field, missing section key, empty competitor list, or thin learnings as a gap to fill. Never overwrite content that already looks good - confirm with the user before replacing it. ## 2. Gather evidence before asking Do not interrogate the user for things the data already shows. First pull what the connected platforms know: - `get_performance` at account level (platform='all') and campaign level for the recent window - this reveals the dominant channels, rough scale, ROAS/CPA/AOV reality, and seasonality. - `get_creatives` (platform='meta') and `query` for any specifics you want to verify. - If the user gives you the brand's website or an about/PDP URL, use `WebFetch` to read it and infer vertical, positioning, ideal customer, and voice. Cite what you inferred and from where. ## 3. Interview to close the gaps Ask the user only what you genuinely cannot infer, one focused batch at a time. For everything you CAN infer (from data or the site), propose your inferred value and ask the user to confirm or correct it. **Never write silently** - every value that lands in the KB must be either user-stated or user-confirmed. Cover: the typed Profile anchors; positioning; ideal customer (icp); brand voice; the competitive landscape and named competitors. ## 4. Write the confirmed knowledge Use the write verbs (each prompts the user for approval): - `update_brand_profile` - vertical, price_tier (value/mid/premium/luxury), margin_band (lean/moderate/healthy), target_roas, target_cpa, target_aov. Partial; pass only confirmed fields. - `update_section` - one call per prose section (key in positioning, icp, competitive_landscape, brand_voice), `content_md` in markdown. - `set_competitor` - one call per named rival (name, optional handle, differentiator). - `record_learning` - see step 5. ## 5. Seed learnings from the data So the KB isn't empty post-onboarding, record a few durable, evidenced insights the data supports - e.g. the best-performing channel, a winning creative angle, a clear seasonal pattern, or the real AOV. Keep them durable and reusable, not throwaway point-in-time stats. Avoid duplicates - `record_learning` WITHOUT an `id` always creates a new row, so check the `learnings` you already read in step 1 first: - If an existing learning already covers the insight, call `record_learning(id=<that id>, topic, content, evidence)` to update it in place. Pass the `id` up front - don't create-then-merge. - Only call `record_learning` without an `id` for a genuinely new insight. - If a create still comes back with a non-empty `related` (a same-topic row already existed), you've just made a duplicate: merge the best content into one row via `record_learning(id=...)`, then `archive_learning` the redundant row so `learning_cap.active` doesn't bloat. ## 6. Curate at the cap If `learning_cap.active` is near `cap`, don't just pile on. Merge same-topic learnings (`record_learning` with an `id`) and `archive_learning` the stale or superseded ones, so the active set stays the brand's most useful insights. ## 7. Close out Summarise what you wrote, what the user confirmed, and which gaps remain (e.g. a section still empty, a target still unknown). Name the brand you onboarded so the user is sure it landed on the right one, and remind them they can re-run this anytime to keep filling the Knowledge Base.
Claude Code
Available in the @kreel/skills plugin as:
/kreel:onboard-brand