getback-recruit-mail

SkillCommunication

Lets your agent send cohort recruitment and promo emails to an opted-in subscriber list with exclusion checks and logging.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the getback-recruit-mail skill

About this capability

Read this when sending GETBACK (GET100) cohort recruitment or encouragement emails to the subscriber list. Covers triple-exclusion comparison of targets, passing the send_bulk quality gate, ad labeling requirements, and send history logging procedures. Handles requests like "let's send a recruitment

What this skill tells your AI

The instructions your AI receives, as published by bam-bam-2/solo-skills in skills/getback-recruit-mail/SKILL.md and read by ahel’s review.

이 스킬이 시스템에 하는 일 (설치 전 확인)

  • 여러 명에게 메일을 실제로 발송합니다. 되돌릴 수 없습니다.
  • 발송 전에 수신 대상을 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월 신청자에게 오발송했다.

DBID용도
구독자<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. 발송

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로 나간다.
  • 네이버메일은 발송취소가 안 된다. 문구를 고쳤으면 발송 전에 전문을 덤프해 눈으로 읽고 승인받는다.

전문 확인용 덤프:

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.jsCURRENT_COHORTapply.html의 hidden cohort 필드를 둘 다 올린다. 신청 확인 메일 템플릿도 같이 본다.
  • 참가비는 소비자 노출을 **총액(부가세 포함)**으로 통일한다. 한 기수만 표기를 바꾸면 인상이 인하로 읽힌다.
  • 커뮤니티 페이지의 누적 멤버 수와 멤버 DB 행 수가 다를 수 있다(45 vs 42). 확정 못 하면 숫자를 빼고 쓴다.

Signals

GitHub stars
365
Forks
90
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
getback-recruit-mail
Source
github.com/bam-bam-2/solo-skills