CF7 폼에서 체크박스 없이 Mailchimp 드립 시퀀스 트리거하는 방법

발행: (2026년 6월 5일 PM 10:06 GMT+9)
10 분 소요
원문: Dev.to

출처: Dev.to

워드프레스 지원 포럼에 개발자가 올린 글:

“방문자가 CF7 폼을 제출하면 자동 회신 이메일을 Mailchimp에서 바로 보내고 싶습니다. 드립 캠페인과 전용 Mailchimp 리스트를 설정해 두었습니다. 체크박스를 표시하지 않고도 연락처 폼을 제출하는 모든 사람을 이 리스트에 가입시킬 수 있을까요?”

답변은 CF7 제출 시 Mailchimp 태그를 설정하는 코드 스니펫에 대한 링크 하나뿐이었습니다. 한 문장. 스레드는 닫혔습니다.
그 답변은 기술적으로는 맞지만, 실제로 중요한 부분을 모두 건너뛰었습니다: Mailchimp 자동화 시스템이 실제로 어떻게 동작하는지, 무음 옵트인(silent opt‑in)의 동의(Consent) 함의, 그리고 CF7 → Mailchimp 자동화 흐름을 올바르게 구축하는 방법 등 말이죠.
이 글에서는 그 모든 것을 다룹니다.

목표

  1. 방문자가 CF7 연락처 폼을 제출한다.
  2. 방문자를 체크박스 없이 Mailchimp 오디언스에 조용히 추가한다.
  3. 해당 연락처에 태그를 적용한다.
  4. 해당 태그를 기준으로 Mailchimp 자동화가 트리거된다.
  5. 자동화가 일련의 이메일(드립 캠페인)을 보낸다.

이는 정당한 사용 사례입니다. “구독”이 문의 요청에 부수적인 형태로, 마케팅 리스트 가입이 아니라 사후 문의 팔로우업 시퀀스에 사용됩니다.

사전 검토: 동의(Consent) 문제

Mailchimp 서비스 약관은 오디언스에 추가되는 모든 연락처가 마케팅 이메일을 받을 동의를 해야 한다고 명시합니다. 사용자의 사전 인지 없이 오디언스에 추가하고 마케팅 드립을 보내는 행위는 Mailchimp 약관 위반이며, 관할 구역에 따라 GDPR, CAN‑SPAM, CASL 등에도 위배될 수 있습니다.

하지만 여기서 다루는 사례는 거래형 자동 회신(transactional auto‑reply)이며, 마케팅이 아닙니다. 중요한 구분은 다음과 같습니다.

구분정의동의 필요 여부
거래형 이메일사용자가 취한 행동(폼 제출, 구매, 정보 요청 등)에 직접적인 응답으로 발송되는 메시지대부분의 규제에서 마케팅 동의를 요구하지 않음
마케팅 이메일제품·서비스·콘텐츠 등을 홍보하기 위해 발송되는 메시지명시적 동의 필요

Mailchimp 자체는 표준 오디언스에서 거래형과 마케팅을 구분하지 않습니다. 진정한 거래형 이메일을 보내려면 Mailchimp Transactional(구 Mandrill)이 적합합니다. 폼 제출 시 묵시적 동의(implicit consent) 로 마케팅 자동화를 트리거하려면, 폼의 개인정보 처리방침에 명확히 고지하는 것이 최소 기준입니다.

본 글에서는 합법적인 자동 회신(사용자가 후속 커뮤니케이션을 받을 기대가 있는 경우)이라는 전제하에 진행합니다.

Mailchimp 데이터 모델 이해

  • Audience(구전 리스트): Mailchimp에서 연락처를 보관하는 최상위 컨테이너. 연락처는 하나 이상의 Audience에 속합니다. 비용은 연락처당 부과됩니다.
  • Tag: 특정 Audience 내 연락처에 붙이는 라벨. 비용이 추가되지 않으며, 하나의 연락처에 여러 태그를 부여할 수 있습니다.
  • Automation(고객 여정): 특정 이벤트에 의해 시작되는 이메일 및 액션 시퀀스. 여기서는 “연락처가 Audience에 추가됨” 혹은 “태그가 적용됨”이 트리거가 됩니다.

권장 아키텍처

CF7 제출
   |
   v
Mailchimp API 로 Audience에 연락처 추가
   |
   v
특정 태그 적용 (예: "contact-form-inquiry")
   |
   v
태그 적용을 감지한 Mailchimp Automation 시작
   |
   v
드립 이메일 1 즉시 전송
   |
   v (7일 후)
드립 이메일 2 전송

태그가 트리거이며, 단순히 Audience에 가입하는 것만으로는 자동화가 시작되지 않습니다. 이렇게 하면 하나의 Audience에 여러 폼·태그 조합별 자동화를 구성할 수 있습니다.

MC4WP 플러그인 활용 (체크박스 제거)

MC4WP 플러그인은 CF7과 Mailchimp를 연결해 줍니다. 기본 설정에서는 체크박스가 표시됩니다. 체크박스를 없애고 조용히 구독하도록 하려면, 폼별로 태그를 자동으로 추가하도록 필터를 사용합니다.

// functions.php에 추가
// 출처: ibericode/mailchimp-for-wordpress 샘플 스니펫

add_filter('mc4wp_integration_cf7_tags', function($tags, $form) {
    // 폼 ID에 따라 다른 태그 적용
    $form_tag_map = [
        123 => ['contact-form-inquiry'],    // 실제 폼 ID로 교체
        456 => ['quote-request'],
        789 => ['newsletter-signup'],
    ];

    $form_id = (int) $form->id();

    if (isset($form_tag_map[$form_id])) {
        $tags = array_merge($tags, $form_tag_map[$form_id]);
    }

    return $tags;
}, 10, 2);

조용히 구독하려면 MC4WP 설정에서 “Implicit sign‑up”(묵시적 가입) 옵션을 활성화합니다. 이렇게 하면 UI 요소 없이 모든 폼 제출 시 자동으로 구독이 이루어집니다.

제한점: MC4WP의 묵시적 가입은 전역적으로 지정한 하나의 Audience에만 연락처를 추가합니다. 폼마다 다른 Audience를 사용해야 한다면 아래와 같은 직접 구현이 필요합니다.

코드로 완전 제어하기 (플러그인 없이)

다음 코드는 폼별 Audience, 태그, 구독 상태 등을 자유롭게 지정할 수 있게 해 줍니다. wpcf7_before_send_mail 액션을 활용해 Mailchimp API를 직접 호출합니다.

add_action('wpcf7_before_send_mail', 'cf7_to_mailchimp_silent');

function cf7_to_mailchimp_silent($contact_form) {
    $form_id = (int) $contact_form->id();

    // 폼 ID와 Mailchimp Audience ID, 태그 매핑
    $form_config = [
        123 => [
            'audience_id' => 'abc123def4',   // 자신의 Mailchimp Audience/List ID
            'tags'        => ['contact-form-inquiry'],
        ],
        456 => [
            'audience_id' => 'abc123def4',
            'tags'        => ['quote-request'],
        ],
    ];

    if (!isset($form_config[$form_id])) return;

    $config      = $form_config[$form_id];
    $submission  = WPCF7_Submission::get_instance();
    if (!$submission) return;

    $data        = $submission->get_posted_data();
    $email       = sanitize_email($data['your-email'] ?? '');
    $name_parts  = explode(' ', sanitize_text_field($data['your-name'] ?? ''), 2);
    $first_name  = $name_parts[0] ?? '';
    $last_name   = $name_parts[1] ?? '';

    if (empty($email)) return;

    $api_key     = defined('MAILCHIMP_API_KEY') ? MAILCHIMP_API_KEY : '';
    $server      = substr($api_key, strpos($api_key, '-') + 1); // 예: "us21"
    $audience_id = $config['audience_id'];
    $member_hash = md5(strtolower($email));

    // 연락처 추가 또는 업데이트 (PUT은 멱등 연산)
    $response = wp_remote_request(
        "https://{$server}.api.mailchimp.com/3.0/lists/{$audience_id}/members/{$member_hash}",
        [
            'method'  => 'PUT',
            'headers' => [
                'Authorization' => 'Basic ' . base64_encode('anystring:' . $api_key),
                'Content-Type'  => 'application/json',
            ],
            'body'    => wp_json_encode([
                'email_address' => $email,
                'status_if_new' => 'subscribed',  // 신규 연락처에만 상태 지정
                'merge_fields'  => [
                    'FNAME' => $first_name,
                    'LNAME' => $last_name,
                ],
            ]),
            'timeout' => 15,
        ]
    );

    if (is_wp_error($response)) {
        error_log('[CF7->Mailchimp] Member upsert failed: ' . $response->get_error_message());
        return;
    }

    $status_code = wp_remote_retrieve_response_code($response);
    if ($status_code >= 400) {
        error_log('[CF7->Mailchimp] API error ' . $status_code . ': ' . wp_remote_retrieve_body($response));
        return;
    }

    // 태그 별도 적용 (태그 엔드포인트는 배열 형태의 태그 작업을 받음)
    $tags_payload = array_map(fn($tag) => ['name' => $tag, 'status' => 'active'], $config['tags']);

    wp_remote_post(
        "https://{$server}.api.mailchimp.com/3.0/lists/{$audience_id}/members/{$member_hash}/tags",
        [
            'headers' => [
                'Authorization' => 'Basic ' . base64_encode('anystring:' . $api_key),
                'Content-Type'  => 'application/json',
            ],
            'body'    => wp_json_encode(['tags' => $tags_payload]),
            'timeout' => 15,
        ]
    );
}

위 코드는 다음을 수행합니다.

  1. 폼 ID를 기준으로 어떤 Audience와 태그를 사용할지 결정합니다.
  2. 제출된 데이터를 받아 이메일, 이름을 추출하고, Mailchimp API 키와 서버 접두어(usXX)를 파싱합니다.
  3. PUT /lists/{audience_id}/members/{member_hash} 요청으로 연락처를 추가하거나 업데이트합니다. (status_if_new를 `
0 조회
Back to Blog

관련 글

더 보기 »

모바일 한여름 열풍

!Cover image for Mobile Midsommer Madnesshttps://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploa...