STAGE 14 · Lv.68
자동 할인 & 쿠폰 시스템
프로그래밍 방식으로 쿠폰을 생성하고, 동적 가격 규칙, 장바구니 할인, 조건부 할인, 로열티 포인트 시스템까지 WooCommerce 할인 자동화를 구현합니다.
WooCommerce 할인 시스템 전체 개요
할인의 종류와 자동화의 가치
WooCommerce에서 할인을 적용하는 방법은 크게 세 가지입니다. 쿠폰(Coupon)은 고객이 코드를 입력하여 할인을 받는 전통적인 방식입니다. 세일 가격(Sale Price)은 개별 상품에 직접 할인 가격을 설정하는 방식입니다. 동적 가격(Dynamic Pricing)은 장바구니 금액, 수량, 회원 등급 등 조건에 따라 자동으로 할인을 적용하는 가장 유연한 방식입니다.
자동화된 할인 시스템은 마케팅 효과를 극대화합니다. 수동으로 쿠폰을 생성하고 이메일로 발송하는 대신, 시스템이 자동으로 첫 구매 할인, 생일 쿠폰, 대량 구매 할인, 장기 미방문 고객 리텐션 쿠폰, 장바구니 이탈 복구 쿠폰 등을 생성하고 발송합니다. 이를 통해 운영 인력을 절감하면서도 더 정교한 마케팅을 실행할 수 있습니다.
이 레슨에서는 WC_Coupon 클래스를 활용한 프로그래밍 방식의 쿠폰 생성, 장바구니 동적 할인, 수량 기반 가격 조정, 회원 등급별 할인, 포인트 적립/사용 시스템, 쿠폰 남용 방지, A/B 테스트까지 할인 자동화의 모든 것을 다룹니다.
자동화된 할인 시스템은 마케팅 효과를 극대화합니다. 수동으로 쿠폰을 생성하고 이메일로 발송하는 대신, 시스템이 자동으로 첫 구매 할인, 생일 쿠폰, 대량 구매 할인, 장기 미방문 고객 리텐션 쿠폰, 장바구니 이탈 복구 쿠폰 등을 생성하고 발송합니다. 이를 통해 운영 인력을 절감하면서도 더 정교한 마케팅을 실행할 수 있습니다.
이 레슨에서는 WC_Coupon 클래스를 활용한 프로그래밍 방식의 쿠폰 생성, 장바구니 동적 할인, 수량 기반 가격 조정, 회원 등급별 할인, 포인트 적립/사용 시스템, 쿠폰 남용 방지, A/B 테스트까지 할인 자동화의 모든 것을 다룹니다.
쿠폰
코드 입력 방식 할인
동적 가격
조건 기반 자동 할인
장바구니
합계 기반 할인
포인트
적립/사용 시스템
고객 행동
구매/가입/생일
구매/가입/생일
→
조건 판별
규칙 엔진
규칙 엔진
→
쿠폰 생성
자동 발급
자동 발급
→
고객 전달
이메일/알림톡
이메일/알림톡
| 할인 방식 | 적용 시점 | 고객 행동 필요 | 유연성 | 관리 난이도 |
|---|---|---|---|---|
| 쿠폰 코드 | 체크아웃 시 코드 입력 | 코드 입력 필요 | 높음 | 중 |
| 세일 가격 | 상품 페이지 표시 | 없음 (자동 적용) | 낮음 | 하 |
| 장바구니 할인 | 장바구니 자동 적용 | 없음 (조건 충족 시) | 높음 | 상 |
| 수량 할인 | 상품별 수량 기준 | 없음 (수량 충족 시) | 중 | 중 |
| 회원 등급 할인 | 로그인 시 자동 적용 | 없음 (등급별 자동) | 중 | 중 |
| 포인트 사용 | 체크아웃 시 포인트 차감 | 포인트 사용 선택 | 높음 | 상 |
프로그래밍 방식 쿠폰 생성 시스템
WC_Coupon 클래스 완전 가이드
WooCommerce의 WC_Coupon 클래스는 프로그래밍 방식으로 쿠폰을 생성, 수정, 삭제할 수 있는 강력한 API를 제공합니다. 이 클래스를 활용하면 관리자가 수동으로 쿠폰을 만들 필요 없이, 비즈니스 로직에 따라 자동으로 쿠폰이 생성되고 고객에게 발송됩니다.
WC_Coupon이 지원하는 할인 유형은 세 가지입니다. percent는 퍼센트 할인으로 장바구니 총액 또는 특정 상품에 퍼센트 할인을 적용합니다. fixed_cart는 장바구니 정액 할인으로, 장바구니 전체에서 고정 금액을 차감합니다. fixed_product는 상품별 정액 할인으로, 지정된 상품 각각에서 고정 금액을 차감합니다.
쿠폰에는 다양한 제한 조건을 설정할 수 있습니다. 사용 횟수 제한(전체/사용자별), 최소/최대 주문 금액, 특정 상품/카테고리 제한, 이메일 제한(특정 고객만 사용 가능), 만료일, 무료 배송 포함 여부, 다른 쿠폰과의 중복 사용 가능 여부 등을 세밀하게 제어할 수 있습니다.
WC_Coupon이 지원하는 할인 유형은 세 가지입니다. percent는 퍼센트 할인으로 장바구니 총액 또는 특정 상품에 퍼센트 할인을 적용합니다. fixed_cart는 장바구니 정액 할인으로, 장바구니 전체에서 고정 금액을 차감합니다. fixed_product는 상품별 정액 할인으로, 지정된 상품 각각에서 고정 금액을 차감합니다.
쿠폰에는 다양한 제한 조건을 설정할 수 있습니다. 사용 횟수 제한(전체/사용자별), 최소/최대 주문 금액, 특정 상품/카테고리 제한, 이메일 제한(특정 고객만 사용 가능), 만료일, 무료 배송 포함 여부, 다른 쿠폰과의 중복 사용 가능 여부 등을 세밀하게 제어할 수 있습니다.
// ============================================
// 고급 쿠폰 생성기 클래스
// ============================================
class MAP_Coupon_Generator {
// 쿠폰 생성 메인 메서드
public static function create($args = []) {
$defaults = [
'code' => self::generate_code(),
'discount_type' => 'percent',
'amount' => 10,
'individual_use' => true,
'usage_limit' => 1,
'usage_limit_per_user' => 1,
'expiry_days' => 30,
'min_spend' => 0,
'max_spend' => 0,
'free_shipping' => false,
'product_ids' => [],
'exclude_product_ids' => [],
'product_categories' => [],
'exclude_categories' => [],
'email_restrictions' => [],
'exclude_sale_items' => false,
'description' => '',
'meta_data' => [],
];
$args = wp_parse_args($args, $defaults);
// 중복 코드 확인
$existing = new WC_Coupon($args['code']);
if ($existing->get_id()) {
return false; // 이미 존재하는 코드
}
$coupon = new WC_Coupon();
$coupon->set_code($args['code']);
$coupon->set_discount_type($args['discount_type']);
$coupon->set_amount($args['amount']);
$coupon->set_individual_use($args['individual_use']);
$coupon->set_usage_limit($args['usage_limit']);
$coupon->set_usage_limit_per_user($args['usage_limit_per_user']);
$coupon->set_free_shipping($args['free_shipping']);
$coupon->set_exclude_sale_items($args['exclude_sale_items']);
$coupon->set_description($args['description']);
// 만료일 설정
if ($args['expiry_days'] > 0) {
$expiry = new DateTime('+' . $args['expiry_days'] . ' days');
$coupon->set_date_expires($expiry->getTimestamp());
}
// 금액 제한
if ($args['min_spend'] > 0) $coupon->set_minimum_amount($args['min_spend']);
if ($args['max_spend'] > 0) $coupon->set_maximum_amount($args['max_spend']);
// 상품/카테고리 제한
if (!empty($args['product_ids'])) $coupon->set_product_ids($args['product_ids']);
if (!empty($args['exclude_product_ids'])) $coupon->set_excluded_product_ids($args['exclude_product_ids']);
if (!empty($args['product_categories'])) $coupon->set_product_categories($args['product_categories']);
if (!empty($args['exclude_categories'])) $coupon->set_excluded_product_categories($args['exclude_categories']);
// 이메일 제한
if (!empty($args['email_restrictions'])) $coupon->set_email_restrictions($args['email_restrictions']);
// 커스텀 메타 데이터
foreach ($args['meta_data'] as $key => $value) {
$coupon->update_meta_data($key, $value);
}
$coupon->save();
// 생성 이벤트 발동 (추적, 로깅용)
do_action('map_coupon_created', $coupon, $args);
return $coupon;
}
// 고유 쿠폰 코드 생성
public static function generate_code($prefix = '', $length = 8) {
$code = strtoupper(wp_generate_password($length, false));
return $prefix ? $prefix . '-' . $code : $code;
}
// 대량 쿠폰 생성 (프로모션용)
public static function bulk_create($count, $args = []) {
$coupons = [];
for ($i = 0; $i $count; $i++) {
$args['code'] = self::generate_code($args['prefix'] ?? 'PROMO');
$coupon = self::create($args);
if ($coupon) $coupons[] = $coupon;
}
return $coupons;
}
}
// ============================================
// 자동 쿠폰 발급 시나리오들
// ============================================
// 1. 첫 구매 완료 시 감사 쿠폰 자동 발급
add_action('woocommerce_order_status_completed', function($order_id) {
$order = wc_get_order($order_id);
$customer_id = $order->get_customer_id();
if (!$customer_id) return;
$order_count = wc_get_customer_order_count($customer_id);
// 첫 주문 완료 시에만
if ($order_count === 1) {
$coupon = MAP_Coupon_Generator::create([
'code' => MAP_Coupon_Generator::generate_code('WELCOME'),
'discount_type' => 'percent',
'amount' => 15,
'expiry_days' => 14,
'min_spend' => 30000,
'email_restrictions' => [$order->get_billing_email()],
'description' => '첫 구매 감사 쿠폰 (자동 발급)',
'meta_data' => ['_coupon_type' => 'welcome', '_order_id' => $order_id],
]);
if ($coupon) {
map_send_coupon_email($order, $coupon, 'welcome');
}
}
});
// 2. 생일 쿠폰 자동 발급 (매일 크론으로 실행)
add_action('map_daily_birthday_coupons', function() {
$today = date('m-d');
// 오늘이 생일인 사용자 조회
$users = get_users([
'meta_key' => 'birthday',
'meta_value' => $today,
'meta_compare' => 'LIKE',
]);
foreach ($users as $user) {
// 올해 이미 발급했는지 확인
$year_key = '_birthday_coupon_' . date('Y');
if (get_user_meta($user->ID, $year_key, true)) continue;
$coupon = MAP_Coupon_Generator::create([
'code' => MAP_Coupon_Generator::generate_code('BDAY'),
'discount_type' => 'percent',
'amount' => 20,
'expiry_days' => 7,
'min_spend' => 20000,
'email_restrictions' => [$user->user_email],
'description' => '생일 축하 쿠폰 (자동 발급)',
]);
if ($coupon) {
update_user_meta($user->ID, $year_key, $coupon->get_code());
map_send_birthday_coupon_email($user, $coupon);
}
}
});
// 3. 장기 미방문 고객 리텐션 쿠폰 (매주 크론)
add_action('map_weekly_retention_coupons', function() {
global $wpdb;
// 30일 이상 주문 없는 기존 고객 조회
$inactive_customers = $wpdb->get_results("
SELECT DISTINCT pm.meta_value as customer_id
FROM {$wpdb->postmeta} pm
INNER JOIN {$wpdb->posts} p ON pm.post_id = p.ID
WHERE pm.meta_key = '_customer_user'
AND pm.meta_value > 0
AND p.post_type = 'shop_order'
AND p.post_status IN ('wc-completed', 'wc-processing')
GROUP BY pm.meta_value
HAVING MAX(p.post_date) DATE_SUB(NOW(), INTERVAL 31 DAY)
");
foreach ($inactive_customers as $row) {
$user = get_user_by('id', $row->customer_id);
if (!$user) continue;
$coupon = MAP_Coupon_Generator::create([
'code' => MAP_Coupon_Generator::generate_code('COMEBACK'),
'discount_type' => 'fixed_cart',
'amount' => 5000,
'expiry_days' => 7,
'min_spend' => 30000,
'email_restrictions' => [$user->user_email],
'free_shipping' => true,
'description' => '리텐션 쿠폰 (30일 미방문)',
]);
if ($coupon) {
map_send_retention_coupon_email($user, $coupon);
}
}
});
💡 쿠폰 코드 네이밍 전략
쿠폰 코드의 접두사(prefix)를 체계적으로 관리하면 어떤 캠페인에서 발급된 쿠폰인지 추적하기 쉽습니다. 예시: WELCOME-ABCD1234(첫 구매), BDAY-EFGH5678(생일), COMEBACK-IJKL9012(리텐션), CART-MNOP3456(장바구니 이탈), REVIEW-QRST7890(리뷰 보상). 관리자 페이지에서 접두사로 검색하면 캠페인별 사용 현황을 한눈에 파악할 수 있습니다.
🔒
여기까지는 미리보기입니다
자동 할인 & 쿠폰 시스템
무료 가입하면 이어서 볼 수 있고, 강의를 완료할 때마다 XP와 레벨이 쌓입니다.
Google로 3초 만에 시작 →🧵 Threads로 시작무료 공개 강의 둘러보기 (Lv.1~3)무료 가입하면 이어서 볼 수 있고, 강의를 완료할 때마다 XP와 레벨이 쌓입니다.