Google, Meta, TikTok. Auto-bidding, budget-shift och creative-rotation.
Modul 7 av 16 i Kapaciti-katalogen. Daglig optimering av betalda annonser pa Google Ads, Meta Ads, TikTok Ads och LinkedIn Ads. Konsumerar en strukturerad performance-snapshot fran kanalerna och returnerar en parsbar handlingslista med budget-omfordelningar, varningar om creative-fatigue, audience-tester och en eskaleringsflagga. Varje rekommendation barer en explicit motivering, ett risk-betyg och ett fortroende-betyg sa teamet far en revisionsbar audit-spar fran snapshot till beslut.
En e-handlare kor 92 000 sek dagligen fordelat over tre eller fyra kanaler. Klockan 06:30 varje morgon dumpas en CSV med foregaende dygns spend, klicks, konverteringar, intakter och kampanj-niva-metrics fran respektive API. Den dumpen omvandlas till modulens input-objekt och modulen kor. Output postas till Slack eller Discord, och budget-omfordelningen knuffas via en godkannande-gate till respektive plattforms API. Vid eskalering vacks en manniska. Bundle-filen sparas med en signerad hash-kedja som senare bevis nar finansavdelningen eller en revisor begar redogorelse for varfor en specifik budget-flytt gjordes.
{
snapshot_id: "ads-2026-05-19",
period: { start: "2026-05-12", end: "2026-05-18" },
channels: [
{
name: "google-ads",
spend_sek: 48000,
impressions: 420000,
clicks: 8400,
conversions: 220,
revenue_sek: 132000,
cac_sek: 218,
roas: 2.75,
campaigns: [
{ id: "g-brand-001", name: "Brand search", spend_sek: 12000, roas: 8.5, ctr: 0.062, conversion_rate: 0.041, days_running: 90, status: "active" }
]
}
],
total_budget_sek: 92000,
targets: { min_roas: 2.5, max_cac_sek: 250 },
brand: { name: "NordWear", voice_profile_id: "customer" }
}
Alla siffror i SEK. roas = revenue_sek / spend_sek, cac_sek = spend_sek / conversions. Modulen accepterar fyra kanal-namn: google-ads, meta-ads, tiktok-ads, linkedin-ads. Andra varden avvisas direkt i validateInput. Kampanj-statusar maste vara active eller paused.
Modulen returnerar en strikt strukturerad textsekvens som parsas av validateOutput och den exporterade rena funktionen parsePaidAdsOutput. Sektioner i ordning:
TOTAL_BEDOMNING: <pa-mal | over-mal | under-mal | kritisk>
ROAS_TOTAL: <number>
CAC_TOTAL_SEK: <number>
KANAL_REKOMMENDATIONER:
- KANAL: <name>
ATGARD: <oka-budget X% | minska-budget X% | pausa | bibehall | testa-nytt>
MOTIVERING: <1-2 meningar>
RISK: <lag | medel | hog>
FORTROENDE: <lag | medel | hog>
KAMPANJ_VARNINGAR:
- KAMPANJ: <id> | KANAL: <name> | PROBLEM: <kod>
NYA_TESTER_FORESLAG:
- <test 1>
BUDGET_OMFORDELNING_SEK:
- FRAN: <kanal> = -<sek>
- TILL: <kanal> = +<sek>
ESKALERING_TILL_TEAM: <ja | nej>
ESKALERINGS_ANLEDNING: <text | n/a>
SAMMANFATTNING_PA_SVENSKA:
<3 till 5 meningar redo att postas>
Sammanfattningen ar berattande prosa pa svenska, inte bullets, och designad for att klistras direkt i en daglig kanal utan ytterligare formatering.
Modulen ar byggd med defensiv bias. Vid spretig eller tunn signal valjer den hellre bibehall an aggressiva budget-rorelser. Konkret:
oka-budget X% kraver kanalens ROAS over 1.2 ganger min_roas samt minstmedel-fortroende. Procentintervallet ar 5 till 30 procent per dag.
minska-budget X% triggas av ROAS under 0.8 ganger min_roas eller CAC over 1.5 ganger max_cac_sek. Intervallet ar 10 till 50 procent.
pausa kraver ROAS under 0.5 ganger min_roas samt minst en kampanj somkor over 21 dagar utan forbattring. Pausa triggar alltid eskalering.
testa-nytt ar for stabila kanaler dar signalen antyder ny audience, nycreative eller nytt format.
bibehall ar default vid tvivel.Kampanj-varningar foljer faste koder: creative-fatigue, low-ctr, high-cac, days-running-over-30, low-roas, low-conversion-rate. Max fem varningar per kornings, prioriterade efter spend.
Budget-omfordelningen ar nollsumma per definition. Summan av alla FRAN poster maste matcha summan av alla TILL poster inom 1 sek tolerans. Eventuella avvikelser flaggas som budget_not_zero_sum violation och stoppar operationen. Om ingen rorelse foreslas skrivs en enda rad INGA_OMFORDELNINGAR.
Eskalering till team aktiveras automatiskt om TOTAL_BEDOMNING ar kritisk eller om nagon rekommendation ar pausa. Manuell over-ride via en kommande release-flagga.
Korningen genererar en signerad bundle med sju block i ordning:
input_received - hela snapshot-objektet.context_loaded - tomt for denna modul, system-prompten bar all kontext.agent_call - modell, prompt-langder, voice-profil.output_generated - rasvar fran Claude plus duration_ms.voice_validated - ban-ord och ban-tecken-skanning mot voice-profilen.output_validated - struktur-parse plus alla module-specifika gater.audit_sealed - status, total_blocks, hash-fingeravtryck.Varje block ar canonicaliserat, SHA-256-hashat, lankat via prev_hash och signerat med Ed25519. Verifieras via verifyBundle() i lib/audit-chain.mjs eller via fristaende verifier i kapaciti-site/scripts/verify-audit-bundle.mjs. Tamper-test i test-sviten bekraftar att en endaste tecken-andring i ett block bryter kedjan.
Default-rost ar kapaciti, B2B saklig och kort. Vid kund-leverans satts voice_profile_id: "customer" for neutral professionell ton. Voice-profilen forbjuder orden ensure, crucial, journey, delve, dive, navigate samt tankstreck. Voice-skanningen ar en post-check som flaggar violations utan att stoppa korningen, sa teamet kan se hur ofta modellen halkar fel.
Modulen tar inte hansyn till intra-day-effekter eller saisongsvariationer. LinkedIn Ads ar accepterad i schemat men prompt-exemplen ar tunnaare an for de tre andra kanalerna. Performance Max och Advantage+ campaigns granskas samma som vanliga kampanjer, vilket underskattar deras autopilot-natur. Modulen kor en korning per snapshot, ingen state-bevarning av tidigare rekommendationer aterfinns annu, sa coherence over flera dagar ar inte garanterad. Det loses i v1.1 via en MemoryCard per brand som spar de senaste sju dagarnas atgarder och flaggar inkonsekvens.
Se examples/paid-ads-manager.bundle.json. En realistisk tre-kanal-snapshot for en svensk e-handlare med 92 000 sek daglig spend genererar typiskt 7 audit-block, en eskalering vid pausa-rekommendation och en budget-omfordelning som flyttar 6 000 till 12 000 sek fran underpresterande TikTok till Google.
Justera input-objektet eller använd starter-värdena. När du trycker på Kör modulen anropas samma agent som i produktion. Audit-kedjan byggs framför dig och hela sessionen signeras med Ed25519 i samma format som exempel-bundlen ovan.
JSON-payload som matchar modulens validateInput. Starter-värdena kommer från en riktig produktionskörning. Max 12 000 tecken.
Audit-kedjan visas här när scenariot körs
● Nyhetsbrev
En sammanfattning ungefär en gång i månaden. Vad förändrats i regelverket, vilka pilot-cases vi sett och vilka vendor-shifts som påverkar svenska bolag. Skickas av oss, inte av en automation som låtsas vara oss.