All documentation

Visibility

Personas

Named buyer audiences a tracked prompt can run as, how they use prompt slots, what changes at execution, and where their results show up.

Personas settings screen showing two active persona cards, Indie writer and Procurement lead, with their variant counts, their edit, archive and suggest-prompts controls, and the Add persona button

What a persona is

Open Settings → Personas. A persona is a named buyer profile, a name and a short description, that a tracked prompt can run as, alongside or instead of the plain, unbranded "General" audience every prompt already runs as today (api/models/persona.py#Persona). A persona is not a separate prompt: it is an extra audience you attach to a prompt you already track, described below.

Creating and managing personas

Owners and editors create, edit, archive and restore personas; viewers can only read the list. A name is 1 to 60 characters after trimming, and no two active personas in a project can share a name, case-insensitively; a description is 1 to 500 characters and can hold line breaks, a name cannot. Both refuse Unicode control characters (api/services/personas.py#clean_persona_text, api/services/personas.py#NAME_MAX_LEN, api/services/personas.py#DESCRIPTION_MAX_LEN).

Editing a persona's description only changes what future runs send to the engines; a past execution keeps exactly what it actually sent, so rewriting a persona does not rewrite history (api/models/persona.py#Persona). Archiving a persona deactivates every prompt target that carries it, which frees the prompt slots those targets were using, and keeps their run history intact (api/services/personas.py#archive_persona). Restoring an archived persona does not bring those targets back: you add the restored persona to a prompt again, which reserves slots for it the same way adding a brand new persona would (api/services/personas.py#restore_persona). An archived persona stays selectable in the filter bar's persona chip, listed last and marked "Archived", because its past executions still belong to your project's history (api/services/answer_filters.py#available_filter_options).

How many personas you can have

Creating or restoring a persona past your plan's active-persona limit is refused with a message naming the limit; existing personas and their history are never affected by a plan change on their own (api/services/personas.py#persona_limit, api/services/personas.py#_enforce_limit). See Pricing for how many active personas each plan includes. Archiving a persona you can no longer create or restore is always allowed, specifically so an account that moved to a plan with a lower limit can still tidy up (api/services/personas.py#archive_persona).

Adding a persona to a prompt

On Prompts, a prompt's countries and its audiences are chosen together: General plus zero or more active personas. Only active personas can be attached, and a persona id has to belong to the current project. General starts selected on a new prompt, and stays selected on an edit unless you touch it, but it is not compulsory either way: you can deselect it as long as at least one persona is selected instead, and the same rule runs in reverse, so at least one audience always remains (api/schemas/prompt.py#PromptCreate, api/routers/prompts.py#create_prompt, #update_prompt).

Each country, audience and language combination is its own prompt target, and each one uses one prompt slot, exactly like adding a country does today. Tracking one prompt in 3 countries as General plus 2 personas, all As written, creates 3 x 3 x 1 = 9 targets and reserves 9 slots; adding a persona to a prompt that already runs in 3 countries reserves 3 more (api/services/prompt_variants.py#sync_targets, api/services/limits.py#reserve_prompt_slots). Accepting a persona-tagged suggestion (below) creates that persona's targets, in the requested countries, on top of whatever the prompt already runs; a plain CSV or Excel import, and onboarding, only ever create General targets (api/services/prompt_discovery.py#accept_candidate, api/services/prompt_import.py#apply_plan). See Languages and templates for the language dimension and engine choice this same grid now also includes.

Sending back a persona id on an edit that has since been archived does not 422 the whole request and does not reactivate that persona's targets: the archived id is simply dropped from the audiences the edit activates, and any target it already had stays exactly as inactive as it was (api/services/prompt_variants.py#only_active_persona_ids).

What changes when a persona runs

A persona variant is checked with the same schedule, on the same chat engines, as a General target, Perplexity included. It never runs on Google AI Overviews, Google AI Mode, ChatGPT (app) or Gemini (app): those engines receive only the prompt text, with no message to carry an audience, so a persona variant is left out on all four rather than run as if it were General, and prompt detail lists it as "personas are not sent to Google", "personas are not sent to ChatGPT's app" or "personas are not sent to Gemini's app" (api/services/collection.py#target_runs_on; see What reaches Google, What reaches ChatGPT and What reaches Gemini (app)). The General variant of the same prompt still runs on them, and the persona variant still uses its prompt slot for the engines it does run on. The one addition is that the rendered message sent to the model gets an audience block, after the prompt text and before the "Search context" location block, naming the persona and asking the engine to answer for that person (api/services/llm.py#render_audience_block, api/services/llm.py#render_prompt_with_location). All four chat engines receive the message built this way (see How location reaches each engine). The audience block reads:

{prompt}

Audience context:
- Asking as: {name}
- About them: {description}
Answer for this person.

request_context records the persona_id, persona_name and persona_description actually sent, and prompt_text_sent stores the whole rendered message, audience block included, exactly as the engine received it, even after the persona's own description is edited later (api/services/execution.py#execute_query_for_provider, api/services/llm.py#SearchContext).

This is one audience block added to a single user message on each call, not a logged-in consumer session, a saved profile the engine remembers, or a separate account: nothing distinguishes a persona-variant run from a General one except that block of text.

Prompt suggestions per persona

Each active persona card offers Suggest prompts: one on-demand model call that proposes up to 10 buyer-intent questions that persona would plausibly ask, without naming your brand (api/services/persona_prompts.py#suggest_persona_prompts, api/services/persona_prompts.py#INSTRUCTION). It needs write access and a plan that includes personas. Requests for the same project are limited to one per minute, whichever persona each one names: a second request inside sixty seconds of the last one starting is refused. Separately, at most one request can be running at a time: since the call itself can take up to 90 seconds, a request that started under two minutes ago and has not finished yet keeps refusing new ones for that project even past the one-minute mark. As soon as the earlier request ends, whether it produced suggestions or failed, that refusal lifts immediately and only the plain one-minute rule still applies; the two situations are refused with different messages (api/services/persona_prompts.py#RATE_LIMIT_SECONDS, api/services/persona_prompts.py#IN_FLIGHT_LOOKBACK_SECONDS, api/services/persona_prompts.py#FINISHED_ACTION).

The model is given the project's domain, name and business goal, a short summary of the project's latest accepted business profile if one exists,

the persona's name and description, and up to 50 of the project's existing active prompt texts so it does not repeat them; everything under that data is explicitly framed as untrusted, never as instructions (api/services/persona_prompts.py#_approved_profile_summary, api/services/persona_prompts.py#MAX_EXISTING_PROMPTS_IN_PAYLOAD). Each returned text is trimmed, checked against your existing prompts and any already-pending suggestion case-insensitively, and dropped if trimming leaves it shorter than 5 characters or it is still over 300; survivors are saved as pending suggestions tagged with that persona, never tracked automatically (api/services/persona_prompts.py#_clean). Suggestions shows the persona tag on a card that came from this flow and offers a persona filter alongside its other filters.

Reporting by persona

  • The filter bar: its persona chip narrows to one persona or to General only on every screen that takes it, the prompt list included, where it lists the prompts with an active target for that audience; see The filter bar. Each row of the prompt list shows a chip for every active audience currently tracking it (api/routers/prompts.py#list_prompts).
  • Sentiment trends and Brand reasons both follow the persona chip, and both offer a View by persona breakdown: one row per audience, General included only when it has at least one answer naming the brand, plus every persona in the same position, archived personas included (api/services/sentiment_population.py#by_persona_rows). See Sentiment trends and Brand reasons for what that view shows.
  • Explorer: persona is one of its dimensions, so any of its metrics, citation rate and brand visibility included, can be broken down or filtered by audience, and a persona breakdown keeps every chat engine; a persona's row never holds Google AI Overviews, Google AI Mode, ChatGPT (app) or Gemini (app) answers, because persona variants do not run there (see Explorer) (api/services/explorer/dimensions.py#DIMENSIONS). Overview has no persona card; its answer drawer tags an answer with the persona it was collected for (api/services/overview_answer.py#build_answer).
  • Exports and API: the Answers and Brand mentions (entity_mentions) file exports, the customer API's answer objects, and the MCP list_answers tool all carry a persona field, empty or null for the General audience, never omitted (api/services/exports/answers.py#COLUMNS, api/services/exports/entity_mentions.py#COLUMNS, api/schemas/customer_api.py#CustomerAnswer).

Last verified 2026-09-29

Start monitoring your AI visibility.

See how AI search engines talk about your brand.

Free to start. No credit card required.