# Imports

Borkol learns faster when it starts from what you already have. One import flow takes a spreadsheet (CSV, TSV or Excel `.xlsx`) and turns its rows into scripts, ad results, creatives, swipe ads or customer quotes. You start it from the screen where the data belongs; there is no separate import page.

## Where Import lives

| Screen | Button | What you can import |
| --- | --- | --- |
| **Marketing** → **Scripts** | **More** (under **Import**) | **Scripts history**, **Ad results**, **Creatives** |
| **Marketing** → **Brand** → **Your voice** → **Voice of customer** | **Import** | **Customer quotes** |
| **Marketing** → **Brand** → **More** → **Swipe file** | **Import** | **Swipe ads** |

A script without results links to the ad results import from the line "Results show up here after an import.", and an empty **Learnings** tab under Knowledge has **Import ad results**.

Every import goes into the brand that is selected at the top of the screen.

## The file

- CSV, TSV or `.xlsx`, up to 5 MB and 5,000 rows. The first row holds the column names.
- Commas, semicolons and tabs all work as the separator, so a CSV saved by a Dutch or Turkish spreadsheet app imports as it is. Dates may be written as `2026-10-20`, `20/10/2026`, `20.10.2026` or a spreadsheet date cell; one clear value such as `13/10/2026` settles day-first for the whole column.
- An Excel file is read from its first sheet.
- For customer quotes a plain `.txt` file works too: one quote per line, no column names.

A file with no rows under the column names is refused with "The file has no rows below the column names." A file over 5,000 rows is refused with "The file has more than 5,000 rows. Split it and import the parts." In both cases nothing is added.

## How columns are recognised

Borkol reads the column names and matches them to its own fields, in English, Dutch and Turkish, ignoring capitals, accents and anything in brackets. `Amount spent (USD)` is **Spend**, `Datum` is **Date**, `Yorum` is **Quote**. The sheet then shows "We recognised 9 of 9 columns" and goes straight to the preview.

These are the column names Borkol recognises (a selection; any capitalisation works):

| What | Field | Column names |
| --- | --- | --- |
| **Ad results** | **Ad name** (required) | Ad name, Ad, Ad code, Creative name, Advertentienaam, Reklam adı |
| | **Date** | Day, Date, Reporting starts, Datum, Dag, Tarih |
| | **Spend** (required) | Amount spent, Spend, Cost, Uitgegeven bedrag, Harcanan tutar |
| | **Video length** | Video length, Length, Duration, Video duration, Videolengte, Video süresi |
| | **Impressions** | Impressions, Impr, Vertoningen, Gösterimler |
| | **3-second plays** | 3-second video plays, 3s video views, Video plays at 3s |
| | **ThruPlays** | ThruPlays, Video completions, Completed views |
| | **Clicks** | Clicks, Link clicks, Klikken, Tıklamalar |
| | **Purchases** | Purchases, Conversions, Orders, Aankopen, Satın almalar |
| | **Revenue** | Purchase conversion value, Revenue, Conversion value, Omzet, Gelir |
| | **Currency**, **Channel** | Currency, Valuta; Channel, Platform |
| **Scripts history** | **Title**, **Angle** | Title, Name, Script name; Angle, Concept |
| | **Hook** to **Hook 5** | Hook, Hook 1, Opening line; Hook2 to Hook5 |
| | **Script**, **Call to action** | Body, Script, Voiceover; CTA, Call to action |
| | **Ad copy** to **Ad copy 3** | Ad copy, Primary text, Caption |
| | **Hook type**, **Format**, **Awareness**, **Customer type** | Hook type; Format; Awareness; Customer type, Persona, Audience |
| | **Ad code**, **ID**, **Status**, **Date** | Ad code, Code, Ad name; ID, External ID; Status; Date, Created |
| **Creatives** | **Ad code** (required), **Link** (required) | Ad code, Ad name; URL, Link, Creative URL, Video URL |
| | **Editor**, **Launch date**, **Notes** | Editor, Made by, Creator; Launched, Launch date, Start date; Notes |
| **Swipe ads** | **Title**, **Link**, **Transcript** | Title, Name, Headline; URL, Link, Ad link; Transcript, Copy, Primary text |
| | **Notes**, **Tags**, **Project** | Notes, Comments; Tags, Labels, Category; Project, Campaign |
| **Customer quotes** | **Quote** (required), **Theme** | Text, Review, Comment, Quote, Feedback; Theme, Topic, Category |
| | **Customer type**, **Source** | Customer type, Persona, Segment; Source, Reference, Review ID |

A swipe ad needs at least a title, a link or a transcript. A scripts history row needs at least a hook or a script.

## The mapping step

When a column could mean more than one thing (for example `Comment theme`, which holds both "comment" and "theme"), or a required field has no column, the sheet opens the mapping table for you: **Column in your file**, **Example** and **Imports as**. Unclear columns carry **Check this**. Pick a field for each, or **Ignore**. Until every required field has a column, the sheet says "Choose a column for {fields} under More before importing." and the import button stays off.

When everything was recognised the table stays folded under **More**. Open it to check or change any column.

When you choose columns yourself, Borkol remembers the choice for files with the same column names, so next week's export maps itself. Saved choices are per business and listed in **Settings** → **Imports** under **Saved column mappings**, where **Forget mapping** removes one.

## Preview and import

The preview shows how many rows are ready ("2 rows ready") and how many will be skipped, with the first rows as they will be imported. Missing data is a hint, never a blocker: for example "No impressions or 3-second plays column: hook rates stay empty." or "Rows without a date are booked on today."

Click **Import 2 rows**. **Import finished** shows how many rows were **Added**, **Updated** and **Skipped**, and **See all imports** opens the history.

### Skipped rows

A row with a problem is skipped, and the other rows still land. **2 skipped rows** under the preview lists each one with its row number, field and reason, for example "Row 14, Spend: not a number". Common reasons: **empty** (a required cell), **not a number**, **not a date**, **below zero**, **not a web link**, **too long**.

## Importing again

Imports are safe to repeat. Upload this week's results sheet every week: rows Borkol already has are updated, not added twice.

| What | A row is the same when |
| --- | --- |
| **Ad results** | Same ad code and same day |
| **Scripts history** | Same **ID**, or else the same **Ad code** |
| **Creatives** | Same script and same link |
| **Swipe ads** | Same link |
| **Customer quotes** | Same quote text |

An imported script never changes a script Borkol wrote: a row whose ad code belongs to a script made in Borkol is skipped with "code of a script made in Borkol, left unchanged". A script someone approved, rejected or put in the golden set stays as it is too: its row is skipped with "reviewed or golden script, left unchanged".

An ad results row for an ad and day that the [Meta ads connection](/docs/marketing/settings#meta-ads) already synced is skipped with "already synced from Meta ads": the synced numbers come straight from Meta, so nothing counts twice.

A swipe ads row whose link belongs to an ad from the [Meta Ad Library](/docs/marketing/brand-context#watch-competitors) is skipped with "belongs to an ad from the Meta Ad Library": those ads update with each sync and an import never changes them.

## What each import does

- **Ad results** join the scripts they belong to through the ad code inside the ad name, then show on the script under **Results** and feed [learnings](/docs/marketing/learning). A result whose ad name holds no known code is kept, and joins as soon as the script exists (for example after you import your scripts history).
- **Scripts history** adds past scripts with **Imported** as their source. A row without an ad code gets a new Borkol code. The **Status** column maps words like `live`, `winner` or `active` to **Approved** and `paused`, `stopped` or `loser` to **Rejected**; anything else imports as **Approved**.
- **Creatives** link your finished ads (a video link per ad code) to their script; they show on the script under **Creatives**. A row whose ad code matches no script is skipped with "no script with this code".
- **Swipe ads** and **Customer quotes** land in the [Swipe file and Voice of customer](/docs/marketing/brand-context). A project or customer type the brand does not have is left empty, with a hint.

Everything you import is treated as data. In a brief it is quoted, never followed as an instruction.

## Settings → Imports

**Marketing** → **Settings** → **Imports** (`/m/marketing/settings/imports`) lists every file imported into the selected brand: **File**, **What**, **Rows**, **Added**, **Updated**, **Skipped**, **Status** (**Imported**, **Not imported** or **Failed**), **By** and **When**. Filter on **What** and **Status**. Below it are the **Saved column mappings**.

Importing needs marketing edit access. Uploaded files are kept privately with the import and are never public.
