# Results and learning

Borkol gets better at writing for your brand the more it knows about which ads worked. Results come in, Borkol turns them into **learnings**, and the learnings you accept go into every next brief. Nothing changes without a person: Borkol proposes, you accept or reject.

## Ad codes

Every script has an ad code such as `M2610-7KQ3D`, and every hook adds its number: `M2610-7KQ3D-H1`, `-H2`, `-H3`. Copy them from the script page: the copy button next to **Ad code** in the header for the script's code, or **Copy hook ad code** next to a hook's code. **Copy hook** copies the hook's text, not its code.

Put the hook's code in the ad name when you publish the ad, anywhere in the name: `M2610-7KQ3D-H2 | UGC | v3` works, in capitals or not. Borkol finds the code inside the name when your ad results come in, and joins the result to that script and hook. A code is only matched as a whole word, so `XM2610-7KQ3DZ` matches nothing. A script you imported keeps the code from your file (for example `SPRING-HOOK-04`); an ad named exactly that code joins it.

## Results on the script

A script's page has a **Results** box once results joined it: **Spend**, **Impressions**, **Hook rate** (3-second plays per impression), **Hold rate** (ThruPlays per 3-second play), **CTR** (clicks per impression), **Purchases**, **Cost per purchase**, **ROAS** (revenue per spend) and **Days with results**, plus the hook rate **Per hook**. A rate Borkol cannot compute shows **n/a**. When results use more than one currency, money totals are left out.

Under it, **Per ad** lists each ad of the script that spent at least 20 in the last 90 days, marked **Winner** or **Not a winner** (see [What wins](/docs/marketing/results)). Without any results the section says **No ad results yet**, with **Import ad results** (opens the ad results import) and **How importing works**.

Results come in two ways, and both are stored the same way:

- **Import** a results export from your ad platform: **Scripts** → **More** → **Ad results**. See [Imports](/docs/marketing/imports).
- **Your agent** reports them with the `report_metrics` tool: one row per ad and day, with the same checks as a file import. See [Your agent](/docs/marketing/agent#reporting-ad-results).

Sending the same ad and day again corrects it; it is never counted twice.

## How learnings are made

After every import or report, and once a day, Borkol looks at the last 90 days of results of the brand. It groups the ads by tag (**Angle**, **Hook type**, **Format**, **Customer type** and **Awareness**) and compares each tag's **Hook rate**, **Hold rate**, **Click-through rate**, **Cost per purchase** and **Return on ad spend** with the brand median.

A tag only becomes a learning when:

- it has at least 3 ads (an ad needs at least 5 in spend to count),
- its ads together spent at least the **Minimum spend for a learning** (50 by default, under **Settings** → **AI pipeline** → **More**), and
- it is at least 15% above or below the brand median.

Cost per purchase is compared with the brand's average instead of the median, so ads that never sold count as well. A learning reads like "Hook type Question: Hook rate 31% above the brand median".

**Confidence** follows the amount of data: **High** from 10 ads and 5 times the minimum spend, **Medium** from 5 ads and twice the minimum spend, **Low** below that. Every learning expires 60 days after it was last confirmed by new data, so old conclusions drop out on their own.

## The Learnings tab

**Marketing** → **Knowledge** → **Learnings** (`/m/marketing/knowledge/learnings`) lists them with **What we learned**, **Ads**, **Spend**, **Confidence**, **Status** and **Expires**. Filter on **Status**, **Confidence** and **Tag**. **Refresh** asks Borkol to look at the results again now.

A new learning is **Proposed**. The row menu has:

- **Accept**: the learning becomes **Active** and goes into the next briefs.
- **Retire**: the learning is no longer used. Use it for a learning you do not trust.

Click a row to see what backs it before you decide: the tag, the tag's value of the metric, the **Brand median** (or **Brand average**), the **Difference**, the number of ads, the spend in your ad account's currency, the confidence, **Refreshed** and **Expires**, then the **Scripts** behind it (each opens the script) and their **Ad codes**. **Accept** and **Retire** are there as well.

Accepting and retiring need the approve permission. A learning whose 60 days have passed shows **Expired** and is no longer used.

### When the data changes its mind

Borkol never changes an accepted learning by itself. When new results point the other way (the tag that was above the median is now below it), the active learning stays as it is, and a new **Proposed** learning appears with "Replaces an earlier learning". Accept it and the old one is retired; leave it and nothing changes.

## Learnings in the brief

Accepted learnings that have not expired go into every brief under "What worked before", the most relevant and most confident first (at most 12). Like your imported material they are quoted as data. Open **What the agent was told** on a run page to see exactly which learnings a run used. See [Runs](/docs/marketing/runs).

## Golden set

The golden set is a small selection of approved scripts that show what good looks like for the brand: up to 10. Open an approved script, then **More actions** → **Add to golden set**, with an optional note. It shows the **Golden set** pill on the script and in the list, and the **Golden set** filter on **Scripts** shows only those. **Remove from golden set** takes it out. Only an approved script can be in the golden set, and both actions need the approve permission.

## Playbook changes

Each step follows a playbook: the instructions behind **Research**, **Angles**, **Scripts** and **Check**. **Marketing** → **Knowledge** → **More** → **Playbooks** (`/m/marketing/knowledge/playbooks`) shows one card per step, with the version in use (**Platform playbook v1** or **Brand version 2**) and **Show the text**. The **Scripts** and **Check** playbooks can get a brand version.

1. Click **Propose a change** on the card and write the whole playbook, with an optional note. Nothing changes yet.
2. Open the proposal under **Changes**. **Change** shows the current and the proposed text side by side, changed lines marked.
3. **Run golden check** writes and scores scripts for each golden script with the current and the proposed playbook, on your OpenRouter key. The line above the button says how many golden scripts and about what it costs, and you confirm before it starts. It counts toward the monthly limit and pauses there like any run.
4. When it is done, the box shows **Average score now**, **Average score proposed**, **Passed now** and **Passed proposed**, and the score of every golden script on both sides.
5. **Accept** puts the proposal in use for runs started from now on. Runs that already started keep the playbook they started with.

**Accept** stays off until a golden check of exactly this text has finished ("Run the golden check of this text first."). Edit the proposal after a check and you have to run it again. A check also only counts against the playbook it compared with: when another proposal for the same step was accepted in the meantime, **Accept** says "The active playbook changed since this check. Run the golden check again.". **Reject** keeps the proposal in the history as **Rejected**. Accepting and rejecting need the approve permission.

To go back, open the card's menu and choose **Use the platform playbook**. The brand version stays in the history.

Without golden scripts the page says "Mark approved scripts as golden set to check playbook changes." with a link to the golden set filter.

## Nothing changes without a person

Borkol proposes learnings and you propose playbook changes; only a person with the approve permission accepts them, and every decision is recorded with who made it. Borkol never rewrites a learning, a playbook or your knowledge by itself.
