Minden, ami az új cold-email kampány elindításához kell: az előző kampány valódi, élő beállításai, a személyre szabás pontos működése, a kötelező ellenőrző kapuk, és a kézi minőségellenőrzés, amit indítás előtt le kell futtatnod.
Minden a GitHub branchen van. A Linux szerverhez semmilyen hozzáférés nem kell — nem is fogsz hozzányúlni.
Branch megnyitása a GitHubon Meghívó elfogadásagit clone https://github.com/matt-clientsflow/coldemail.git
cd coldemail
git checkout handoff/daniel-campaign-launch
cd handoff/daniel-2026-07-21
A repo privát. A
dani-clientsflow fiókra kiment az írási jogú meghívó — előbb fogadd el.
A credentials.md soha nincs a repóban: azt Mátyás küldi külön, és a repo gyökerébe
kell tenned.
Ez a legfontosabb rész, és sokkal egyszerűbb, mint amit a repo dokumentációja sugall. Élő Instantly lead-adatokból visszafejtve: két mező, mindkettő mechanikus, mindkettő abból épül, hogy a cég mit csinál. Semmilyen AI által írt egyedi nyitómondat nincs benne — ez házirend, mert az a legárulkodóbb spam-jel.
| Mező | Minta | Valódi élő példák |
|---|---|---|
greeting | „Szia" ha nincs név · „Kedves <Keresztnév>" ha van | Szia · Kedves Richárd · Kedves Szabolcs |
personalisation1 | a tevékenység -val/-vel raggal | burkolással · műanyag fröccsöntéssel · redőnyjavítással és -szereléssel |
personalisation2 | „a/az <szakma> céged / vállalkozásod" | a burkoló céged · az ablakbeépítő céged · a késkészítő vállalkozásod |
A mondatba illesztve így néz ki, amit a címzett kap:
A nyelvtani eset a lényeg. Ha a rag hibás, a mondat eltörik — és az olvasó azonnal
látja, hogy gépi. A personalisation1 mindig -val/-vel ragos, a
personalisation2 mindig birtokos szerkezet. Ez a teljes trükk.
Tegeződés. Az élő kampány végig tegez („Szia", „küldd el a számod"). A repo
name_guard.py szkriptje viszont magázó Tisztelt Vezetéknév Keresztnév!
megszólítást állít elő. Döntsd el tudatosan, melyiket akarod, és igazítsd össze a kettőt —
különben fél lista tegez, fél lista magáz.
4 kampány (V1–V4), „2026-jun-kert-meden-szauna-stb", magyar építőipari kkv-k. A teljes,
szó szerinti szövegek — minden lépés, minden variáns — a branch
02_LIVE_CAMPAIGNS.md fájljában vannak. A lényeg:
| Kampány | Küldve | Válasz | Válaszarány | Lehetőség | Állapot |
|---|---|---|---|---|---|
| V1 | 262 | 12 | 4,58% | 5 | lezárva |
| V2 | 240 | 10 | 4,17% | 1 | lezárva |
| V3 | 230 | 12 | 5,22% | 3 | lezárva |
| V4 | 227 | 14 | 6,17% | 3 | lezárva |
V4 vitte a legjobb számot — ez egyben a legrövidebb, legdirektebb szöveg is. De a
korábbi kampányok ugyanebben a fiókban jóval jobban mentek:
arny-szaun-kerit-meden-2026.04.20._v1 10,12% 573 küldésen,
boti_kerteszek_2026.03.10._v2 11,11%. A júniusi széria nagyjából felezte az
áprilisi válaszarányt. Érdemes megérteni, mielőtt szó szerint átemeled.
Egyik kampány sem érte el a döntési küszöböt. Házirend: variánsonként 500–1000 küldés alatt nincs győztes. 227–262 küldésnél ezek a számok irányt mutatnak, nem döntenek el semmit.
A tárgymező spintax. Mind a négy kampány ugyanazt a beágyazott
{{RANDOM ...}} tárgymező-pörgetőt használja. A házirend viszont külön, diszkrét
tárgymező-variánsokat ír elő, mert a spintax elmossa, hogy melyik tárgy hozta az eredményt.
Nálad legyen 2–3 külön variáns.
A V3 első lépésének van egy üres második variánsa (<div><br /></div>
— se szöveg, se merge tag). Ha az Instantly beleforgatott, a V3 230 küldésének egy része üres
levélként ment ki. Minden felépített kampánynál nézd végig az összes variáns-slotot.
A követő levél vékony. Mindössze 2 lépés van (nyitó, majd +1 nap), és a második mind a négy kampányban ugyanaz a három sor, új szög nélkül. A házi sztenderd 3 lépés valódi lezáró levéllel. Itt van hova fejlődni — ne másold, javítsd.
A repo azt írta, hogy ez a 4 kampány „aktív". Az élő API szerint mind a négy lezárva (status 3), 2026-07-21T14:20:25Z állapot szerint. Pontosan ezért van az a házirend, hogy Instantly-számot soha ne jegyzetből idézz.
Europe/Belgradeinstantly_live_status.py <slug> --json. Írd fel az időbélyeget.--check-only előbb: ingyenes előellenőrzés,
és az Apify fiók havi 5 dolláros kereten van, amin az összes ügyfél osztozik.navbar_crawler.py, majd
fit_classifier.py (Gemini) egy ügyfélre szabott ICP prompttal.neverbounce_verify.py. Tudatosan döntsd el, hogy
--strict (csak valid) vagy alapértelmezett (valid + catchall).dedup_registry.py diff. Senki ne kapjon két levelet
két kampányból vagy két ügyféltől.assemble_deliverable.py.good.csv-t.audit_personalisation_leads.py.Egy ismert rés, amit tudnod kell: a feltöltés ma kézi CSV-import az Instantly felületén. Nincs olyan szkript, ami technikailag kikényszerítené a két kaput — azok fegyelemből kötelezőek, nem a rendszer akadályozza meg, hogy megkerüld őket. Ezért fontos a feltöltés utáni ellenőrzés.
python3 .claude/skills/cold-email-pipeline/scripts/name_guard.py leads.csv --json
python3 .claude/skills/cold-email-pipeline/scripts/personalisation_guard.py leads.csv --json \
--quarantine bad.csv --clean good.csv
greeting + personalisation1 +
personalisation2 mindhárom üres — ez nulla értékű küldés, a nyitómondat
nyelvtanilag eltörikfirst_name/last_name üres (csupasz
„Szia"). Ma átengedjük, de az előző lead-készlet 60–70%-a ilyen volt — ez valódi minőségi
probléma, nem részletkérdésgood.csv-t töltsd fel. Soha az eredetit.Ha valamelyik kapu blokkol, az a válasz, hogy „még nem indítható". A blokkolt sort ember javítja vagy kiveszi. Felülbírálni nem szabad — pontosan ezért van ott.
Ez az a rész, amit egy szkript sem tud elvégezni helyetted, és amiért ez az egész átadás létezik. 2026. július 9-én és 10-én két hibás küldés ment ki valódi leadekhez — mindkettő két perc szemrevételezéssel elkerülhető lett volna.
1. Rakd össze kézzel a nyitómondatot 10 véletlen sorra. Vedd a sor
greeting és personalisation1 értékét, illeszd be a sablonba, és olvasd
el. Ember írta magyar mondat, vagy sablon-maradvány?
Hibás — élesben kiment, 2026-07-10:
Csupasz vessző név helyett, és üres rés a „hogy" meg a „foglalkoztok" között. Mind a három személyre szabott mező üres volt a lead rekordjában.
Hibás — élesben kiment, 2026-07-09:
Itt az adat rendben volt: a sablonban volt
elgépelve a merge tag — {{personalisation}} a helyes
{{personalisation1}} helyett. Az Instantly az ismeretlen taget némán üres
sztringre cseréli, és nem szól semmit.
Jó:
2. Vesd össze a sablon merge tagjeit a CSV oszlopneveivel — minden variánsban és minden lépésben. A 2026-07-09-es hiba pont az volt, hogy egyetlen kampány (V2) vitte az elgépelést, míg a V1/V3/V4 helyes volt. Ha csak azt nézed, amit épp szerkesztettél, nem találod meg.
3. A 2. és 3. lépést is nézd meg. Azok is {{greeting}}-gel indulnak, tehát
ugyanaz az üres érték végigmegy az egész szekvencián.
4. Küldj magadnak egy teszt-leadet a valódi szekvencián keresztül, és olvasd el a megérkezett levelet egy igazi postafiókban: sortörések, megszólítás, mindkét személyre szabott mező, aláírás. Utána töröld a teszt-leadet.
5. Feltöltés után azonnal futtasd le az ellenőrzőt — ez azt olvassa vissza, ami ténylegesen az Instantlybe került, és csak az számít:
python3 .claude/skills/cold-email-pipeline/scripts/audit_personalisation_leads.py \
--client <slug> --all-active --json
Miért nem elég egyszer megnézni: a 2026-07-10-i átvizsgálás 523 élő leadből 16-ot (3%) talált teljesen üres személyre szabással — már kiküldve, mind a négy kampányban. Egy batch-hiba addig láthatatlan, amíg egy címzett nem szól.
A teljes, bemásolható készlet a branchen: 04_PROMPTS.md. A két legfontosabb:
Read CLAUDE.md, PROJECT_STATE.md and the 2 newest CHANGELOG.md entries in this repo,
plus clients/<slug>/CLAUDE.md and clients/<slug>/PROJECT_STATE.md.
Then run:
python3 .claude/skills/cold-email-pipeline/scripts/instantly_live_status.py <slug> --json
Give me a =<15-line briefing: what is live right now for this client, sent/reply counts
with the UTC timestamp you fetched them, what the last session changed, and what the next
action is. Do not quote any Instantly number that did not come from that live call.
Run both mandatory pre-upload gates on <path-to-final.csv>:
python3 .claude/skills/cold-email-pipeline/scripts/name_guard.py <path> --json
python3 .claude/skills/cold-email-pipeline/scripts/personalisation_guard.py <path> --json \
--quarantine bad.csv --clean good.csv
Report: exit codes, every blocked/ambiguous/rejected row with the reason, and the warn-tier
count.
Do NOT fix blocked rows automatically and do NOT upload anything. For each blocked row, tell
me what is wrong and what the options are. I decide. If either gate exits non-zero, the answer
is "not ready to upload" — say so plainly.
A többi prompt: listaépítés, szövegírás, a személyre szabott mezők generálása, kampányépítés az Instantlyben, feltöltés utáni ellenőrzés, és a munkamenet naplózása a megfelelő ügyfél-changelogba.
Fut egy folyamatos futás a szerveren: minden domainről képernyőképet készít, majd egy vision modell 1–10-ig osztályozza a weboldalt. A cél olyan cégek megtalálása, akiknek láthatóan rossz a weboldala — így a megkeresés valódi megfigyeléssel indulhat. Neked nem kell hozzányúlnod, csak tudd, hogy mi van kész.
A 2 354 gyenge oldal kész, bizonyítékkal alátámasztott prospekt-készlet — mindegyikhez tartozik egy elmentett képernyőkép, amire konkrétan hivatkozni lehet a nyitólevélben. Ha kell, kérd el Mátyástól CSV-ben; ez 30 másodperc, és nem kell hozzá a szerverhez nyúlnod.
Ami viszont hibás benne, és még nincs javítva:
URLError, 2 067 capture-bad,
1 466 KeyError. Utóbbi valódi bug az értékelő válaszfeldolgozásában.ok=0 fail=25, a
headless böngésző elhal a 10 párhuzamos fül alatt.Röviden: a meglévő ~22 ezer értékelés valódi és ma is használható, de a maradék ~6,7 ezer domain magától nem fog befejeződni — javítás kell hozzá. Pénzt közben nem éget, tehát nem sürgős.
credentials.md soha nem kerül commitba, és kulcs soha nem kerül
dokumentumba, promptba vagy commit üzenetbe.clients/<slug>/CHANGELOG.md-be megy, nem a hub gyökerébe.Nézd át, hogy stimmel-e — főleg az 1. és a 2. szakaszt, mert azok az élő rendszerből jöttek, nem a dokumentációból. Ha valami nem egyezik azzal, amit tudsz, szólj, mielőtt bármit indítanál. Utána a 3–5. szakasz a tényleges munkamenet, a 6. pedig a bemásolható promptok.