persona_create
Add an audience archetype to a brand — who it is talking to — with as much or as little written up front as you have.
Creates a Persona on a Brand: an audience archetype describing who the brand is talking to.
Everything except name and description is optional. A persona is authored incrementally — creating one with nothing but a name is a valid starting point, and sections get filled in as you learn them.
Input
| Field | Type | Required | Description |
|---|---|---|---|
brand_name |
string |
yes | The slug of the brand this persona belongs to. |
name |
string |
yes | Display name, e.g. "Time-poor Parent". |
description |
string |
yes | One-line summary used to pick this persona from a list. |
slug |
string |
no | Explicit handle; normalized to kebab-case. Defaults to one derived from the name. |
profile |
string |
no | Who they are: life stage, situation, role, context. |
motivations |
string |
no | What they want: jobs to be done, triggers, outcomes. |
frictions |
string |
no | What stops them: objections, doubts, perceived risk. |
language |
string |
no | The words they use for the problem — not a locale. |
age_min |
integer |
no | Lower age bound. Omit for “and younger”. |
age_max |
integer |
no | Upper age bound. Omit for “and older”. |
Example
persona_create({
brand_name: 'acme-running',
name: 'Marathon Maya',
description: 'Trains before work, races twice a year.',
age_min: 30,
age_max: 44,
frictions: 'Thinks carbon plates are a gimmick sold on hype.',
});
// → { persona: { slug: 'marathon-maya', revision: 1, … } }
The slug is unique per brand, not per organization
Two brands may each have a loyalists. That is why every persona tool takes
brand_name alongside persona_name — the pair is the handle. A collision
within one brand returns an error rather than silently adding a suffix.
Age is the only structured field
Everything else is prose, deliberately. Location, interests and job titles are
written into profile rather than typed, because they resolve differently on
every ad platform — a persona describes an audience, it is not a targeting
spec. Both age bounds are independently optional, so age_min: 35 on its own
means “35 and older”.
Requires the brand:write scope.