AI 正在初次分析文章並整理建議,請稍候…
2026 殭屍客戶復活術:WooCommerce 自動化偵測 90 天未購客群與 Coupon 發送實戰
嗨,我是 Eric。身為浪花科技的資深工程師,我最常聽到業務部門抱怨的一句話就是:「Eric,我們的廣告費越來越貴,獲客成本(CAC)高到快要吃掉毛利了!」這時候我就會默默打開他們的 WordPress 資料庫,指著 wp_users 表裡面那一大堆沈睡的資料說:「你們明明坐在金礦上,卻還在拼命往外挖土。」
在 2026 年的今天,數據不僅僅是資產,它是生存的氧氣。如果你還在每個月手動匯出 CSV,丟進 Excel 篩選誰三個月沒買東西,然後再手動發電子報,那你真的該把這篇文章看完。今天我們不講行銷大道理,我們講 Code。我要教你如何用程式碼,在 WooCommerce 裡建立一套「自動化喚醒機制」,精準偵測 90 天未互動的客戶,並自動塞一張專屬優惠券到他們信箱裡。
為什麼是 90 天?工程師眼中的「流失閾值」
在行銷心理學上,90 天(約一季)是一個關鍵的心理門檻。但在系統架構上,這也是一個非常好的篩選點。太短(如 30 天)會造成過度騷擾,導致退訂率(Unsubscribe Rate)飆升;太長(如 180 天)客戶可能已經忘了你是誰,甚至連帳號密碼都搞丟了。
從資料庫效能的角度來看,90 天也是一個相對容易進行索引(Index)查詢的時間區間,不會對伺服器造成過大的負擔。我們的目標很簡單:
- 自動化: 不需要人工介入,系統每天半夜自己跑。
- 個人化: 優惠券代碼必須是唯一的,讓客戶覺得「這只屬於我」。
- 防呆機制: 避免重複發送,不要讓同一個人在一週內收到三次「好久不見」。
核心架構:從 Query 到 Cron Job
要實現這個功能,我們不能依賴肥大的行銷自動化外掛,那些外掛通常會拖慢你的前台速度。身為工程師,我們要用最乾淨的方式解決問題。架構分為三個步驟:
- 篩選 (Filter): 找出「最後訂單日期」 < 90 天前,且「尚未被標記喚醒」的會員。
- 生成 (Generate): 透過程式碼動態產生一組 WooCommerce Coupon。
- 發送與標記 (Send & Mark): 寄出 Email 並在 User Meta 寫入標記,防止重複執行。
步驟一:高效率的資料庫查詢
很多人喜歡用 get_users() 搭配迴圈去跑,這在資料量小的時候沒問題,但如果你的會員數破萬,這種寫法會讓你的主機記憶體炸裂 (OOM)。在 2026 年,我們更傾向直接使用高效的 SQL 查詢或優化過的 WC_Order_Query。
這裡我們示範一個比較優雅的邏輯:先抓出所有有消費紀錄的使用者,再過濾出他們的最後訂單時間。
步驟二:動態優惠券生成
別再用通用代碼 “WELCOMEBACK” 了,那種代碼很容易流出去被濫用。我們要用 WC_Coupon 類別來動態生成。
步驟三:實作程式碼
以下這段程式碼,請小心服用。你可以將其放入你的佈景主題 functions.php 或自製的外掛中。為了相容於經典編輯器與各種環境,我保持了最純粹的 PHP 風格。
/**
* 每日排程偵測 90 天未購客戶並發送優惠券
* Author: Eric @ Roamer Tech
*/
// 1. 設定 Cron Job 排程 (建議使用 WP Crontrol 查看是否生效)
if ( ! wp_next_scheduled( 'roamer_daily_reactivation_scan' ) ) {
wp_schedule_event( time(), 'daily', 'roamer_daily_reactivation_scan' );
}
add_action( 'roamer_daily_reactivation_scan', 'roamer_process_dormant_customers' );
function roamer_process_dormant_customers() {
global $wpdb;
// 定義 90 天前的時間戳記
$days_ago = 90;
$cutoff_date = date( 'Y-m-d H:i:s', strtotime( "-{$days_ago} days" ) );
// 避免重複發送:我們需要檢查 User Meta 'last_reactivation_sent'
// 這裡使用 SQL 直接查詢效率最高,找出最後一張訂單早於 90 天前的用戶 ID
// 注意:這是一個簡化版的邏輯,實際專案可能需要更複雜的 SQL 來排除最近有互動的使用者
// 抓出所有客戶的 ID 與最後訂單時間
$customer_query = "
SELECT p.post_author as user_id, MAX(p.post_date) as last_order_date
FROM {$wpdb->prefix}posts as p
LEFT JOIN {$wpdb->prefix}usermeta as um ON p.post_author = um.user_id
WHERE p.post_type = 'shop_order'
AND p.post_status IN ('wc-completed', 'wc-processing')
GROUP BY p.post_author
HAVING last_order_date < %s
";
$dormant_users = $wpdb->get_results( $wpdb->prepare( $customer_query, $cutoff_date ) );
if ( ! empty( $dormant_users ) ) {
foreach ( $dormant_users as $user ) {
$user_id = $user->user_id;
// 雙重檢查:確認是否在過去 180 天內已經發送過喚醒信 (避免騷擾)
$last_sent = get_user_meta( $user_id, '_roamer_reactivation_sent_date', true );
if ( $last_sent && strtotime( $last_sent ) > strtotime( '-180 days' ) ) {
continue;
}
// 產生專屬優惠券
$coupon_code = roamer_generate_unique_coupon( $user_id );
if ( $coupon_code ) {
// 發送 Email (這裡使用簡單的 wp_mail,建議改用 WooCommerce Mailer 樣板)
$user_info = get_userdata( $user_id );
$subject = "好久不見!這是您的專屬回歸優惠";
$message = "嗨 {$user_info->display_name},我們發現您有一陣子沒來了。輸入代碼 {$coupon_code} 可享 9 折優惠!";
wp_mail( $user_info->user_email, $subject, $message );
// 標記已發送與時間
update_user_meta( $user_id, '_roamer_reactivation_sent_date', current_time( 'mysql' ) );
}
}
}
}
// 輔助函式:產生唯一優惠券
function roamer_generate_unique_coupon( $user_id ) {
$coupon_code = 'BACK-' . strtoupper( wp_generate_password( 6, false ) ); // Ex: BACK-X7Z29A
$coupon = new WC_Coupon();
$coupon->set_code( $coupon_code );
$coupon->set_description( '自動喚醒優惠券 - User ID: ' . $user_id );
$coupon->set_discount_type( 'percent' ); // 百分比折扣
$coupon->set_amount( 10 ); // 10% off
$coupon->set_individual_use( true ); // 單獨使用
$coupon->set_usage_limit( 1 ); // 只能用一次
$coupon->set_email_restrictions( array( get_userdata( $user_id )->user_email ) ); // 限制該使用者信箱
$coupon->set_expiry_date( strtotime( '+7 days' ) ); // 7天後過期
$coupon->save();
return $coupon_code;
}
進階優化:別讓自動化變成災難
程式碼寫好了,但身為資深工程師,我有幾個坑必須提醒你,這些都是我在 2026 年處理大型企業系統時的血淚經驗:
1. 佇列處理 (Queue) 是必須的
上面的程式碼範例是直接執行。如果你的沈睡客戶有 5,000 人,wp_mail 在迴圈裡跑 5,000 次,你的伺服器絕對會 timeout,甚至被郵件服務商(如 SendGrid 或 Amazon SES)判定為濫發垃圾信。強烈建議結合 WooCommerce 內建的 Action Scheduler,將發送任務分批加入佇列,每分鐘發送 20-50 封,保持優雅。
2. 排除特定黑名單
有些客戶可能已經因為客訴問題正在不爽中,這時候你還寄「好久不見」的優惠券,簡直是提油救火。務必在邏輯中加入黑名單排除機制,或是檢查該用戶是否有「未結案的客服單」。
3. 結合多渠道通知
Email 的開信率在 2026 年雖然回穩,但即時通訊軟體依然是王道。你可以考慮將上述的 wp_mail 替換成 LINE Messaging API 的推播。想像一下,客戶手機跳出:「Eric,好久不見,我們想你了,送你一杯咖啡(優惠券)」,這轉換率絕對比躺在垃圾信件匣的 Email 高出數倍。
結論:技術是為了解決商業問題
寫這段程式碼花不了你多少時間,但它建立的是一個「每天自動為你賺錢」的系統。我們工程師的價值,不只是修修 Bug 或改改 CSS,而是透過自動化流程,把被遺忘的數據資產變現。
如果你覺得這段程式碼對你來說有點太硬核,或者你的會員數量龐大到需要更複雜的佇列架構設計,別擔心,這正是我們擅長的。
延伸閱讀
- 拒絕盲人摸象!用 AI 挖掘 WooCommerce 歷史訂單,自動生成「活的」客戶輪廓 (Customer Persona)
- 告別「憑感覺」抓業績!用 WordPress + CRM 數據打造你的 AI 銷售預測水晶球
- LINE Chatbot 建置實戰:讓 WordPress 傳送 Flex Message 互動訊息,別再只會回純文字!
不想讓你的客戶名單變成數位殭屍?
浪花科技擁有最頂尖的 WordPress 開發團隊,我們擅長將複雜的商業邏輯轉化為自動化程式碼。無論是 CRM 串接、自動化行銷還是高併發架構,我們都能搞定。
常見問題 (FAQ)
Q1: 這段程式碼會讓我的網站變慢嗎?
如果你的會員數在 5,000 人以下,影響微乎其微。但如果數以萬計,建議必須改寫為使用 Action Scheduler 進行分批處理,避免在單一請求中執行過多資料庫查詢與郵件發送。
Q2: 為什麼不用 Mailchimp 或 Klaviyo 就好?
第三方行銷工具當然很好,但它們通常依照訂閱人數計費,且資料同步會有時間差。直接在 WooCommerce 內部實作的好處是「即時性」與「零額外月費」,且能生成專屬的動態 Coupon,這是外部工具較難做到的。
Q3: 客戶如果昨天剛買,會不會誤收到信?
不會。程式碼中的 SQL 查詢邏輯設定為 `HAVING last_order_date < cutoff_date`,這意味著只有「最後一筆訂單」早於 90 天前的客戶會被篩選出來。只要系統時間設定正確,不會發生誤判。






