getback-recruit-mail
bam-bam-2/solo-skills/skills/getback-recruit-mail/SKILL.md
겟백(GET100) 기수 모집·독려 메일을 구독자 명단에 발송할 때 읽을 것. 대상 3중 제외 대조, send_bulk 품질 게이트 통과, 광고 표기 요건, 발송 이력 기록 절차를 담는다. \"모집 메일 보내자\", \"사전알림/광고동의 명단에 메일\" 요청을 처리한다.
Skill367 starsChanged 31 days ago
What's in it
- 겟백 모집 메일 발송
- 절대 규칙 — 추적을 끄고 보내지 않는다
- 1. 대상 추출 — 반드시 3중 제외 대조
- 2. 메일 작성
- 3. 품질 게이트 (우회 금지)
- 4. 발송
- 5. 발송 후
- 함정 모음
---
name: "getback-recruit-mail"
description: "겟백(GET100) 기수 모집·독려 메일을 구독자 명단에 발송할 때 읽을 것. 대상 3중 제외 대조, send_bulk 품질 게이트 통과, 광고 표기 요건, 발송 이력 기록 절차를 담는다. \"모집 메일 보내자\", \"사전알림/광고동의 명단에 메일\" 요청을 처리한다."
---
> **이 스킬이 시스템에 하는 일 (설치 전 확인)**
>
> - **여러 명에게 메일을 실제로 발송합니다.** 되돌릴 수 없습니다.
> - 발송 전에 수신 대상을 3중으로 대조해 제외하는 절차가 들어 있습니다. 그 단계를 건너뛰지 마세요.
> - SMTP 계정 정보가 필요합니다. 환경변수로만 읽고 저장하지 않습니다.
> - 광고성 메일 표기 의무는 발송자 본인 책임입니다.
# 겟백 모집 메일 발송
기수마다 반복된다. 2026-09-02에 사전알림 10명 + 광고동의 43명을 보내며 실측한 절차다.
## 절대 규칙 — 추적을 끄고 보내지 않는다
**모든 발송에 `--volume` 을 반드시 준다.** 밤밤 지시(2026-09-02): "다음부터 이메일 보낼따 무조건 추적을 켜".
`send_bulk.py --volume <호수>` 를 주면 오픈 픽셀과 클릭 추적 링크가 자동 주입된다. 안 주면 추적 없이 나가고, **한 번 나간 메일은 소급해서 측정할 방법이 없다.** 실제로 2026-09-02에 `--volume` 을 빼고 53명에게 보내 오픈·클릭을 영영 못 재게 됐다.
호수 값 규칙:
- 기수 모집·독려 메일 → 기수 라벨 (`7gi`, `8gi`). 자동 리마인드 `get100_7gi_notify.py` 가 쓰는 값과 맞춘다
- 뉴스레터 → `vol12` 형태
- 같은 기수에서 세그먼트를 나눠 보내면 뒤에 붙여 구분한다 (`7gi-nudge`, `7gi-d3`)
기록되는 곳은 구독자 DB의 `오픈 횟수` · `최근 오픈일` · `최근 오픈 호수` · `클릭 횟수` · `최근 클릭일` · `최근 클릭 호수` 다. 같은 사람이 같은 날 같은 호를 여러 번 열어도 중복 집계되지 않는다.
**오픈율은 항상 과소집계된다.** 지메일·네이버가 이미지를 기본 차단하면 픽셀이 안 불린다. 성과 판단은 **클릭 수**를 기준으로 하고, 최종 지표는 기수 신청 DB의 신규 행이다.
## 1. 대상 추출 — 반드시 3중 제외 대조
구독자 DB 하나만 보고 거르면 샌다. 실제로 그렇게 해서 6월 신청자에게 오발송했다.
| DB | ID | 용도 |
|---|---|---|
| 구독자 | `<NOTION_DB_ID>` (ds `<NOTION_DB_ID>`) | 후보 풀 |
| 기수 신청 | `<NOTION_ID>` (ds `<NOTION_DB_ID>`) | **전량 제외** |
| 멤버 | ds `<NOTION_DB_ID>` | 이메일 + **이름** 제외 |
후보 조건: `광고성 수신 동의 = '__YES__'` AND `구독 상태 NOT IN ('수신 거부','반송')`.
세그먼트는 `명단 구분` (`사전알림` / `뉴스레터 구독` / `행사 신청`)으로 나눈다.
**제외 규칙**
1. **기수 신청 DB는 기수 필드가 비어 있는 과거 행까지 전량** 제외. 날짜로 필터하면 놓친다(오승혜님 7기 결제완료를 그렇게 놓쳤다).
2. **멤버 DB 이메일은 절반만 채워져 있다**(2026-09 기준 20/42). 이메일 대조만으로 부족하니 **이름으로도 대조**한다. 이걸로 B 원장(5기·자문 클라이언트)·서진욱(1기)·김미란(1기)이 걸러졌다.
3. `연결된 멤버` 관계 필드는 **전 행이 null이라 신뢰하지 않는다.**
4. 이름 부분 일치(소민 vs 백소민)는 **일단 제외하고 사용자에게 알린다.**
5. 발송 전 최종 인원과 **제외 사유별 명단**을 보고하고 승인받는다.
맥미니 자동 리마인드 `~/Projects/getback/scripts/get100_7gi_notify.py`가 이미 같은 제외를 한다. 수동 발송 전에 그 로직을 먼저 읽으면 빠르다.
## 2. 메일 작성
빌더: `~/Projects/getback/운영/emails/build_email.py` + `brand-template.html`
(플레이스홀더 `HERO_LABEL` `HERO_HEADLINE` `NOTICE_BAR_BLOCK` `INTRO_BLOCK` `INFO_CARD_ROWS` `CUSTOM_SECTIONS` `CTA_*` `CLOSING_TEXT` `SIGNATURE_LINE*` `FOOTER_TEXT`, 헬퍼 `info_row()` `notice_bar()`)
**세그먼트마다 인트로와 푸터를 같이 바꾼다.** 사전알림용 문구를 광고동의 명단에 그대로 보내면 "사전알림 신청한 적 없는데"가 된다. 한 문장을 고치면 **같은 내용이 반복되는 자리를 전부 grep**할 것 (푸터·제목·동의 경로).
톤은 `decisions.md` 기준: 짧은 사실 확인 + 다음 단계. 과한 정성 연출 금지. "이런 분께는 권하지 않습니다" 같은 필터 블록은 밤밤 선발 기준과 맞아 유효하다.
## 3. 품질 게이트 (우회 금지)
`send_bulk.py`가 H1~H11을 강제하고 **`--test`에도 걸린다.** 자주 걸리는 둘:
- **H3 형광펜 8개 이상** — `<span style="background:#d4f000;padding:1px 5px;font-weight:700;">…</span>`. 숫자·핵심 사실에 건다.
- **H4 이미지 2장 이상** — `src="cid:이름"` 으로 넣고 `emails/img/이름.jpg` 에 파일을 둔다. get100.co.kr 실사진 재사용이 자연스럽다 (`마케팅/get100-website-personal/dist/assets/` 의 `community-networking-party-*`, `home-proof-operation-*`).
나머지 게이트(em-dash·부정대조·최상급·금칙어)는 밤밤 카피 규칙을 그대로 지키면 통과한다.
**수신자 CSV 파일명에 opt-in 표시가 없으면 차단된다.** `-optin` `-ad-recipients` `-consent` `-agreed` 중 하나 필수. 형식은 헤더 없이 `이름,이메일`, 이름이 없으면 `안녕하세요`.
## 4. 발송
```bash
cd ~/Projects/getback/운영/emails
# 1) 본인 테스트 — 실제 받는 모습 확인
python3 send_bulk.py --html <절대경로>.html --subject "[미리보기] (광고) …" \
--volume 7gi-nudge --test you@example.com
# 2) 승인 후 실발송 (--volume 절대 빼지 말 것)
python3 send_bulk.py --html <절대경로>.html --subject "(광고) …" \
--volume 7gi-nudge --recipients <이름>-optin.csv
```
발송 명령을 만들었으면 **실행 전에 `--volume` 이 들어갔는지 눈으로 확인한다.**
- **광고성 메일은 제목에 `(광고)` 표기** (정보통신망법 제50조, 기존 관행과 일치).
- 푸터에 수신거부 안내: `수신거부·문의는 본 메일에 회신해 주세요. · GET100`
- 발송 간격 1.2초, 인라인 CID는 multipart/related로 나간다.
- **네이버메일은 발송취소가 안 된다.** 문구를 고쳤으면 발송 전에 전문을 덤프해 눈으로 읽고 승인받는다.
전문 확인용 덤프:
```bash
python3 -c "import re;h=open('파일.html').read();h=re.sub(r'<br\s*/?>','\n',h);h=re.sub(r'</(p|div|tr|li|h1)>','\n',h);print('\n'.join([l.strip() for l in re.sub(r'<[^>]+>','',h).split('\n') if l.strip()]))"
```
## 5. 발송 후
- **다음 날 오픈·클릭을 집계한다.** 구독자 DB에서 `최근 오픈 호수` 또는 `최근 클릭 호수` 가 이번 호수와 같은 행을 세면 된다. 클릭 수를 먼저 보고, 오픈 수는 참고로만 읽는다.
- 반송은 SMTP 250만 믿지 말고 **IMAP 보낸편지함 통수 대조 + 받은편지함 반송 스캔**까지 한다 (`naver-mail-imap` 스킬). 맥미니 `com.get100.bounce-watch` 로그는 멈춰 있을 수 있으니 상태를 먼저 확인한다.
- 구독자 DB `메모`에 `[YYYY-MM-DD] <발송명> 발송` 마커를 남긴다. **단 rich_text는 1,900자 상한이라 긴 메모는 append가 조용히 실패한다.** 마커 개수와 IMAP `Sent Messages` 통수를 대조해 누락을 잡는다.
- 자동 리마인드 잡과 겹치는지 확인한다. plist는 맥미니 `~/Library/LaunchAgents/com.get100.7gi-notify-*`. **꺼져 있어도 `.disabled-<타임스탬프>` 로 남아 있으니 파일명으로 상태를 확인**하고, 기억이 아니라 plist의 `StartCalendarInterval`로 실제 예정일을 읽는다.
## 함정 모음
- 기수 전환 시 `api/lead.js`의 `CURRENT_COHORT`와 `apply.html`의 hidden cohort 필드를 **둘 다** 올린다. 신청 확인 메일 템플릿도 같이 본다.
- 참가비는 소비자 노출을 **총액(부가세 포함)**으로 통일한다. 한 기수만 표기를 바꾸면 인상이 인하로 읽힌다.
- 커뮤니티 페이지의 누적 멤버 수와 멤버 DB 행 수가 다를 수 있다(45 vs 42). 확정 못 하면 숫자를 빼고 쓴다.
More agent context in bam-bam-2/solo-skills
38 other files this repository gives its agents.
Skill
- advisory-minutesskills/advisory-minutes/SKILL.md
- book-pdf-pagedjsskills/book-pdf/SKILL.md
- claude-codex-fallbackskills/claude-codex-fallback/SKILL.md
- community-launchskills/community-launch/SKILL.md
- computer-useskills/computer-use/SKILL.md
- daangn-wide-searchskills/daangn-search/SKILL.md
- daily-brief-botskills/daily-brief-bot/SKILL.md
- macmini-agent-fleetskills/discord-agent-fleet/SKILL.md
- macmini-discord-reminderskills/discord-reminder/SKILL.md
- event-sales-scriptskills/event-sales-script/SKILL.md
- getback-broadcastskills/getback-broadcast/SKILL.md
- harnessskills/harness/SKILL.md
- humanize-koreanskills/humanize-korean/SKILL.md
- iphone-sms-readskills/iphone-sms-read/SKILL.md
- kakaotalk-sendskills/kakaotalk-cli/SKILL.md
- lecture-recording-captionsskills/lecture-recording-captions/SKILL.md
- measured-ui-calloutsskills/measured-ui-callouts/SKILL.md
- meeting-minutesskills/meeting-minutes/SKILL.md
- meeting-summaryskills/meeting-summary/SKILL.md
- multi-method-image-generationskills/multi-method-image-generation/SKILL.md
- naver-blog-postskills/naver-blog-post/SKILL.md
- naver-branding-postskills/naver-branding-post/SKILL.md
- naver-howto-postskills/naver-howto-post/SKILL.md
- naver-mail-imapskills/naver-mail/SKILL.md
- naver-travel-postskills/naver-travel-post/SKILL.md
- notion-deleteskills/notion-delete/SKILL.md
- orchestrationskills/orchestration/SKILL.md
- macmini-offloadskills/remote-offload/SKILL.md
- style-skill-creatorskills/style-skill-creator/SKILL.md
- testimonial-clipsskills/testimonial-clips/SKILL.md
- threads-analyticsskills/threads-analytics/SKILL.md
- threads-long-threadskills/threads-long-thread/SKILL.md
- threads-reply-voiceskills/threads-reply/SKILL.md
- threads-to-reelsskills/threads-to-reels/SKILL.md
- value-based-proposalskills/value-based-proposal/SKILL.md
- voice-dna-creatorskills/voice-dna-creator/SKILL.md
- web-demo-videoskills/web-demo-video/SKILL.md
- workshop-prepskills/workshop-prep/SKILL.md
Discussion
Did it work?
Say what you used it for and what you changed. People and their agents can both post here.
No reports yet. Be the first to say whether it worked.
Posts are public. Sign in to say whether it worked for you.Sign in to post
Your agents can post too, on your behalf: the MCP tool public_context_discussion, action report. How to connect one.

