Marketing

Marketing settings

Add and manage brands, connect your own OpenRouter key, tune the AI pipeline, connect your own agent and see costs.

View as Markdown

Marketing → Settings (/m/marketing/settings) has five sections in the left menu: Connections, AI pipeline, Costs, Imports and Brands. Every setting has a default, so you never have to open them to start. The key, agent tokens and brands save per action; AI pipeline and the monthly limit under Costs save through the bar at the bottom.

Opening /m/marketing/settings lands on Connections. Old links keep working: /m/marketing/settings/agent and ?tab=agent open Connections with Your agent unfolded.

Connections

Connections (/m/marketing/settings/integrations) holds the OpenRouter key, the brand's Meta ads and Meta Ad Library connections and, under More, Your agent.

OpenRouter

The OpenRouter box holds the key. The marketing AI runs on your own key, so usage is billed to your OpenRouter account. Borkol does not sell or bill AI tokens. Create a key at openrouter.ai/keys.

Paste it under API key and click Save key. The key is stored encrypted and is never shown again; only Key ending (the last four characters) is visible. Borkol checks the key with OpenRouter when you save it, and Status shows the result:

StatusMeaning
Not connectedNo key is saved
VerifiedOpenRouter accepted the key
InvalidOpenRouter rejected the key, or the stored key can no longer be read
Not checkedThe key is saved, but OpenRouter could not be reached to check it: "The key is saved, but OpenRouter could not be reached to check it. Try again in a moment."

For a verified key the page also shows the Key label, Credit limit, Credits used and Credits remaining that OpenRouter reports, and Last checked. Without a limit on the key, the limit and remaining credits stay empty.

  • Check again checks the saved key again, for example after a Not checked.
  • Replace key saves a different key. If OpenRouter rejects the new key while the saved one is Verified, the saved key is kept and the field shows "OpenRouter rejected this key. Your saved key was kept." A rejected key with no verified key before it is saved as Invalid, and the page says "OpenRouter rejected this key. Check it and save a new one."
  • Remove key asks "Remove the OpenRouter key?" and deletes it. Marketing AI stops working until you add a key again.

Only the account owner can add, check again, replace or remove the key. Team members see the status and the credit figures, with "Only the account owner can add, check or remove the key." in place of the key field and buttons.

Meta ads

The Meta ads box connects the brand you are on to its Meta ad account. Borkol then reads your own ad results per ad and day (spend, impressions, 3-second plays, ThruPlays, link clicks, purchases and revenue) and each video ad's length, so What wins and the scene lengths use real numbers. Each brand has its own connection: switch brand to connect another ad account.

  1. Paste a system user token under Access token (how to create one is below) and click Check. The token is stored encrypted and is never shown again; only Token ending is visible. Status shows Verified, Invalid (Meta refused the token, with Meta's own message in a notice above the status) or Not checked (Meta could not be reached: "The token is saved, but Meta could not be reached to check it. Try Check again in a moment.").
  2. Pick the Ad account whose results sync to this brand. The list shows the accounts the token can read, with the account id and currency; it appears after a Verified check. "This token cannot read any ad account." means the ad account is not assigned to the system user yet.
  3. Click Sync now under Last sync, or wait: Borkol syncs every connected brand once a day. The first sync reads the last 90 days, later syncs the last 3 days. A notice shows Reading ad results…, then Syncing ads: 12 of 40 with a bar, again after a reload of Connections and while you move around the app, and ends with how many ads were synced or why the sync failed.

Last sync shows when the last sync finished. When it failed, a notice above it says "The last sync failed" with Meta's message; the next sync that works clears it. Results already synced stay when a sync fails.

Synced results are stored like an ad results import and join a script through the Borkol ad code in the ad name; ads without a code still count for length. For the same ad and day a synced result replaces an imported one, and a later import skips rows that are already synced, so nothing counts twice.

  • Check again checks the saved token again. Replace token saves a different one; if Meta rejects it while the saved one is Verified, the saved token is kept ("Meta rejected this token. Your saved token was kept.").
  • Remove token asks "Remove the Meta ads token?" and deletes it. Syncing stops for this brand; results already synced stay.

Only the account owner can add, check, replace or remove the token and pick the ad account. Team members see the status, the ad account and Last sync, and can click Sync now.

Create the access token

Use a system user token: it belongs to your business, not to a person, and does not expire. You need admin access to the Meta business portfolio that owns the ad account.

  1. Open business.facebook.com/settings and pick the business portfolio that owns the ad account.
  2. Create an app at developers.facebook.com/apps: app type Business, connected to that business portfolio. On the app's dashboard, add the Marketing API product.
  3. In the business settings, go to Users → System users, click Add and create a system user with the Admin role.
  4. With the system user selected, click Assign assets: assign the ad account (at least view performance) and the app you created.
  5. Click Generate token, pick the app, set the expiry to Never and tick the permission ads_read. Copy the token: Meta shows it once.
  6. Paste it under Access token in Borkol and click Check. Your ad account id is the number after act= in the Ads Manager address (for example act=1234567890); pick the account with that id under Ad account.

The token only needs ads_read: Borkol reads results and never changes your ads.

Meta Ad Library

The Meta Ad Library box connects the brand you are on to Meta's Ad Library, the public archive of ads. Borkol then reads the ads of the pages and search terms on the brand's watch list into the swipe file, with a winner score. Each brand has its own connection.

  1. Paste a user token under Access token (how to get one is below) and click Check. The token is stored encrypted and never shown again; only Token ending is visible. Status shows Verified, Invalid (Meta refused the token, with Meta's message in a notice above the status) or Not checked.
  2. Under Status, Expires shows when the token stops working. From 7 days before, a notice above the status says "The token expires soon" with the date; after it, "The token has expired". Save a new token under Replace token before then.
  3. Click Sync now under Last sync, or wait: Borkol checks the watch list once a day. A notice shows Checking the Ad Library: 2 of 5 (watch entries) with a bar, again after a reload of Connections or the Swipe file and while you move around the app, and ends with how many entries were checked, how many Meta refused, or why it failed. Without any watch entry, Sync now says "Add a page or a search term under Swipe file, Watch first."

Last sync shows when the last check finished; when it failed, a notice above it says "The last sync failed" with Meta's message. Ads already in the swipe file stay when a sync fails or the token is removed. Check again, Replace token and Remove token work as for Meta ads. Only the account owner can add, check, replace or remove the token; team members see the status and can click Sync now.

Get the access token

The Ad Library API works with a user token from a Meta developer app whose owner confirmed their identity with Meta.

  1. Confirm your identity with Meta at facebook.com/ID (it can take a few days).
  2. Open facebook.com/ads/library/api, read the terms and accept them.
  3. Create an app at developers.facebook.com/apps (any type; a Business app works), or use the one you made for Meta ads.
  4. Open the Graph API Explorer, pick your app under Meta App, choose User Token and click Generate Access Token. No extra permission is needed. This token lasts about an hour.
  5. Copy it into the Access Token Debugger, click Debug, then Extend Access Token at the bottom. Copy the new token: it lasts about 60 days.
  6. Paste it under Access token in Borkol and click Check. Expires shows the date; repeat steps 4 to 6 before then.

Your agent

More · Your agent, under the OpenRouter box, holds the tokens an agent you already run, such as Hermes or any MCP client, uses to connect to Borkol Marketing. Create token shows the token once, with the three setup blocks (Agent config (Hermes), Skill, Schedule) already filled in; Setup instructions under the list shows the same blocks later with a placeholder. More in the create window limits a token to some permissions or one brand. The row menu has Revoke. It unfolds by itself when the brand runs on your agent or a token is active. Only the account owner can create and revoke tokens; team members see the list without Create token. See Your agent.

AI pipeline

AI pipeline (/m/marketing/settings/pipeline) sets how runs work for one brand ("These settings apply to {brand}."). With more than one brand, the brand switcher next to that line picks the brand; switching with unsaved changes asks first. The other settings sections keep the chosen brand in the address bar (?brand=). Every field has a default, so you never have to open this page to start. Change a field and the bar at the bottom shows Save and Discard changes. A run keeps the settings it started with; changes apply to the next run.

Up front, under Scripts, sit the two fields most people change:

FieldDefaultWhat it does
Scripts per run5Used when you start a run without picking a number (1 to 10)
Cost limit per run$1.00A run pauses at this amount, charged to your OpenRouter key ($0.05 to $50). You can continue it from the run. Raising it needs the approve permission ("Raising the cost limit needs the approve permission. Lowering it is fine."); lowering it does not.

Below it, the Video tool box sets the AI video tool that scenes are written for: Name (optional), Clip length (8 seconds by default, 2 to 20; no scene is longer), Aspect ratio (9:16 vertical by default, 1:1 square or 16:9 landscape) and Prompt style (added to the end of every video prompt, up to 300 characters).

More opens the rest, closed by default (it opens by itself when a hidden field has an error). Per run:

FieldDefaultWhat it does
Hook variants per script3Alternative openings of each script, to test against each other (3 to 5)
Runs at the same time1Runs of this brand above this number wait their turn (1 to 3). Raising it starts waiting runs right away.

Steps, also under More, sets the model behind each step. The list holds suggestions; you can type any OpenRouter model id, such as meta-llama/llama-3.3-70b-instruct. The same model can also be switched from a step card on a run page; see Switching a step's model.

StepDefault modelCan be switched off
Researchopenai/gpt-4o-miniYes (Run Research)
Anglesopenai/gpt-4o-miniNo, always on
Scriptsopenai/gpt-4o-miniNo, always on
Checkgoogle/gemini-3.5-flash-liteYes (Run Check)

When Check uses the same model as Scripts, a line says "Check uses the same model as Scripts. A different model tends to catch more." It does not stop you from saving.

Under More too: Who runs the steps and Instructions and privacy.

Who runs the steps has one field, Steps run on: Borkol (the default) runs every step on your OpenRouter key; Your agent hands the steps to an agent you run yourself over MCP ("Runs already started keep their setting."). A brand on Your agent needs no OpenRouter key and is never paused at the cost limit. See Your agent.

Instructions and privacy holds:

  • Minimum spend for a learning (50 by default), in your ad account currency: a tag needs this much spend across its ads before Borkol draws a conclusion from it. See How learnings are made.

  • Transcription model (openai/whisper-large-v3-turbo by default): writes the transcript of video and audio files you add to swipe ads, on your OpenRouter key. The list holds models with a zero data retention provider; openai/whisper-large-v3 and mistralai/voxtral-mini-transcribe are the alternatives.

  • Target ROAS (empty by default): an ad at or above this return on ad spend counts as a winner. Empty compares each ad with the brand's median.

  • Extra instructions per step, up to 2,000 characters, added to that step for this brand. Leave them empty to use the standard playbook. The step's output is still checked against its fixed format.

  • Zero data retention (on by default): prompts only go to providers that keep no data. Only the account owner can turn it off, after confirming "Turn off zero data retention?": prompts, including your brand context, may then go to providers that store them. Team members see "Only the account owner can turn this off." Each run records the setting it ran with, shown as Zero data retention on the run page. Not every model has a zero-retention provider. A step that runs on one without it fails with "This model has no zero data retention (ZDR) provider on OpenRouter": pick another model for that step.

Changing the AI pipeline needs marketing edit access.

Costs

Costs (/m/marketing/settings/costs) shows what the brand's runs cost at raw OpenRouter prices: this month's spend, cost per script, runs (with how many ran with zero data retention off), the remaining OpenRouter credit, cost per day, and every run with its tokens and cost. It also holds the brand's Monthly limit ($25 by default), which saves through the bar at the bottom; raising it needs the approve permission. See Costs.

Imports

Imports (/m/marketing/settings/imports) lists every file imported into the selected brand with what it was, its rows, how many were added, updated and skipped, its status, who imported it and when. Saved column mappings below holds the column choices Borkol remembers for files with the same column names; Forget mapping removes one. You start an import from Scripts or Brand, not here. See Imports.

Brands

Brands lists your brands with their Setup score. Each brand has its own profile, customer types, quotes, swipe file, documents, knowledge and projects.

  • Add brand asks for a Name (up to 120 characters), then opens the new brand's Overview, with the box and the setup strip ready. See Setting up a brand.
  • The row menu has Rename brand, Make default and Delete brand.
  • Exactly one brand is the Default. It opens when you do not pick a brand. Make default moves the badge to another brand.
  • The last brand cannot be deleted.
  • The default brand cannot be deleted while other brands exist. Deleting it shows Make another brand the default first.

Delete brand asks "Delete this brand?" first. Its profile, customer types, voice quotes, swipe ads, documents, knowledge and projects are deleted with it, and this cannot be undone.