工程師的優雅反擊:用程式碼拯救沉睡客戶!
資深工程師 Eric 憤怒表示:每日手動拉名單寄送挽回信,根本是對 DRY 信仰的侮辱!本篇獨家揭露 WooCommerce 的自動化挽回策略,專門瞄準那些 90 天未消費的「沉睡客戶」。我們避開臃腫的外掛,直接上 PHP 實戰程式碼,教你如何利用 Cron Job 高效執行每日掃描,精準生成動態優惠券,並架設完善的防呆與防騷擾機制。獲取新客戶的成本是留住老客戶的 5 到 25 倍,別再讓黃金資源躺在資料庫裡發霉!立即行動,掌握這套專業技術架構,將重複的苦力活轉化為自動化的營收發電機!
嗨,我是 Eric,浪花科技的資深工程師。如果你跟我一樣,每天看著行銷部門的同事在 Excel 裡拉名單,然後手動寄送「我們好想你」的電子報,你心裡一定會有一股莫名的煩躁感。我們是工程師,DRY (Don’t Repeat Yourself) 是我們的信仰,這種重複性的苦力活,根本就是對程式碼的侮辱。
最近我幫一個電商客戶處理了一個經典需求:「自動偵測 90 天未互動並發送優惠」。這聽起來很簡單,但在 WordPress 和 WooCommerce 的架構下,如果做得不好,你的網站可能會因為資料庫查詢(Query)爆炸而卡死,或者你的網域被 Gmail 判定為垃圾信件發送源。
今天這篇文章,不講虛無飄渺的行銷心法,我們直接上 Code,教你怎麼用工程師的方式,優雅地喚醒那些沉睡的客戶。
為什麼「沉睡客戶」比新客戶更有價值?
在寫程式之前,我們得先確認「為什麼要做」。根據 Harvard Business Review 的數據,獲取一個新客戶的成本是留住老客戶的 5 到 25 倍。而向現有客戶銷售的成功率是 60-70%,相比之下,新客戶只有 5-20%。
很多老闆只盯著流量報表看,卻忽略了資料庫裡躺著成千上萬筆「曾經買過單」的 Email。這些人不是不買,只是忘了你。我們要做的,就是在他們快要徹底遺忘你的時候(通常是 90 天),輕輕推他們一把。
技術拆解:如何定義「沉睡」與架構設計
在 WooCommerce 的資料庫結構中,並沒有一個現成的欄位叫「是否沉睡」。我們需要自己定義邏輯。一般來說,我們會這樣判斷:
- 最後訂單日期 (Last Order Date): 距離今天超過 90 天。
- 排除條件: 在這 90 天內沒有登入紀錄(選用),或者沒有任何新訂單。
- 防呆機制: 不要重複發送。如果我們昨天寄過挽回信,今天就不能再寄。我們需要在
usermeta裡壓一個標籤(Flag)。
我們的程式邏輯流程如下:
- 設定一個每日執行的排程(Cron Job)。
- 搜尋所有「最後一次消費時間 < 90天前」的使用者。
- 檢查這些使用者是否在最近 30 天內已經收過挽回信(避免騷擾)。
- 為每個人生成一組專屬的優惠券代碼(Dynamic Coupon)。
- 發送 Email。
- 更新使用者 Meta Data,記錄發送時間。
實戰演練:手寫 PHP 打造自動偵測機器人
不用裝那些臃腫的行銷外掛,我們用一段精簡的 PHP 程式碼就能搞定。請將以下程式碼加入你的佈景主題 functions.php 或自製的外掛中。我建議用自製外掛,這樣你換佈景主題時功能才不會消失。
1. 設定排程與查詢邏輯
首先,我們利用 WordPress 的 wp_schedule_event 來建立一個每日任務。
// 1. 註冊 Cron Schedule
if ( ! wp_next_scheduled( 'roamer_daily_reengagement_scan' ) ) {
wp_schedule_event( time(), 'daily', 'roamer_daily_reengagement_scan' );
}
// 2. 綁定執行的 Function
add_action( 'roamer_daily_reengagement_scan', 'roamer_process_dormant_customers' );
function roamer_process_dormant_customers() {
// 這裡我們稍微偷懶一點,直接用 SQL 查詢比較快,避免 WooCommerce loop 跑太久
global $wpdb;
// 定義 90 天前的時間戳記
$cutoff_date = date( 'Y-m-d H:i:s', strtotime( '-90 days' ) );
// 找出最後訂單超過 90 天的客戶 ID (這只是一個簡化範例,實際場景可能需要更複雜的 Join)
// 更好的做法是平時就在 user meta 存一個 '_last_order_date'
// 這裡假設我們已經維護了 '_last_order_date' 這個 meta key
$args = array(
'role' => 'customer',
'meta_query' => array(
'relation' => 'AND',
array(
'key' => '_last_order_date',
'value' => $cutoff_date,
'compare' => '<',
'type' => 'DATETIME'
),
array(
'key' => '_reengagement_sent',
'compare' => 'NOT EXISTS', // 從沒寄過,或者你可以設定時間區間
)
),
'number' => 50, // 為了效能,一次只處理 50 筆,積少成多
);
$user_query = new WP_User_Query( $args );
$authors = $user_query->get_results();
if ( ! empty( $authors ) ) {
foreach ( $authors as $author ) {
roamer_send_we_miss_you_email( $author->ID, $author->user_email, $author->display_name );
}
}
}
2. 生成優惠券與發送郵件
接下來是重頭戲,我們不能只寄一封空泛的信,要給點甜頭。我們會動態生成一張 9 折優惠券。
function roamer_send_we_miss_you_email( $user_id, $user_email, $user_name ) {
// 1. 動態建立優惠券
$coupon_code = 'MISSYOU-' . strtoupper( wp_generate_password( 6, false ) );
$amount = '10'; // 10% off
$discount_type = 'percent';
$coupon = array(
'post_title' => $coupon_code,
'post_content' => '自動喚醒優惠券: ' . $user_email,
'post_status' => 'publish',
'post_author' => 1,
'post_type' => 'shop_coupon'
);
$new_coupon_id = wp_insert_post( $coupon );
// 設定優惠券屬性
update_post_meta( $new_coupon_id, 'discount_type', $discount_type );
update_post_meta( $new_coupon_id, 'coupon_amount', $amount );
update_post_meta( $new_coupon_id, 'individual_use', 'yes' );
update_post_meta( $new_coupon_id, 'usage_limit', '1' );
update_post_meta( $new_coupon_id, 'expiry_date', date( 'Y-m-d', strtotime( '+7 days' ) ) ); // 7天後過期
// 2. 準備 Email 內容
$subject = "嘿 {$user_name},我們好久不見了!(內含專屬優惠)";
$message = "
<h2>嗨 {$user_name},</h2>
<p>我們發現您已經有一段時間沒有來逛逛了。</p>
<p>為了表示我們的心意,這是一個專屬於您的 9 折優惠碼,有效期只有 7 天喔!</p>
<h3 style='background:#f0f0f0;padding:10px;display:inline-block;'>{$coupon_code}</h3>
<p><a href='" . site_url() . "'>立即回官網使用</a></p>
";
$headers = array('Content-Type: text/html; charset=UTF-8');
// 3. 發送郵件
$sent = wp_mail( $user_email, $subject, $message, $headers );
// 4. 更新 User Meta,避免重複發送
if ( $sent ) {
update_user_meta( $user_id, '_reengagement_sent', date('Y-m-d H:i:s') );
}
}
進階工程師的叮嚀:不要用你的主機發信
雖然上面的程式碼能動,但我必須很嚴肅地告訴你:如果你直接用 WordPress 預設的 wp_mail() 狂發幾千封信,你的伺服器 IP 很快就會黑掉。
聽 Eric 一句勸,專業的事情交給專業的工具。在實作這類自動化行銷時,請務必搭配 SMTP 外掛(如 WP Mail SMTP)並串接 SendGrid、Mailgun 或 Amazon SES 這種專業的郵件發送服務。這不僅是為了送達率,更是為了保護你網站的信譽。
更好的架構:Webhook + n8n
如果你不想在 WordPress 裡面寫太多 PHP,或者希望 Email 版面更漂亮(手刻 HTML Email 真的很痛苦),我更推薦使用 n8n 這樣的自動化工具。
你可以寫一個簡單的 API Endpoint,讓 n8n 每天定時 Call 進來拿名單,然後由 n8n 去串接 SendGrid 或 Mailchimp 發信。這樣做的好處是將「運算邏輯」留在 WordPress,將「行銷發送」交給外部工具,降低網站負載。
結語
「自動偵測 90 天未互動並發送優惠」這個功能,表面上是行銷策略,底層其實是資料庫查詢與排程管理的技術展現。透過自動化,我們把寶貴的時間從重複性工作中解放出來,這才是工程師(和聰明的老闆)該做的事。
不要讓你的客戶名單只是躺在資料庫裡的冷冰冰數據,用程式碼給他們一點溫度吧。
常見問題 (FAQ)
Q1: 為什麼我的 Cron Job 排程沒有準時執行?
WordPress 的 WP-Cron 是「被動觸發」的,也就是說需要有人訪問網站才會觸發檢查。如果你的網站流量不大,排程可能會延遲。建議在伺服器層級(如 Linux Crontab)設定真實的 System Cron 來每分鐘呼叫一次 wp-cron.php。
Q2: 一次撈取所有沉睡客戶會不會讓網站掛掉?
絕對會!所以我在程式碼範例中使用了 'number' => 50 的限制。這意味著每次執行只處理 50 人。如果名單很多,你可以增加執行頻率(例如每小時一次),或是使用背景處理(Background Processing)的 Library 來非同步處理。
Q3: 我可以設定不同的喚醒條件嗎?例如 180 天?
當然可以。程式碼中的 strtotime( '-90 days' ) 就是控制時間的關鍵,你可以隨意改成 -180 days 或其他時間。甚至可以針對不同等級的會員設定不同的喚醒時間。
延伸閱讀
- 流量來了留不住?資深工程師教你用 WordPress + Social CRM 打造『私域流量池』的技術護城河
- 訂單自動化實戰:用 n8n 串接 WooCommerce,打造 24 小時不休息的「數位店長」
- 註冊後的黃金 5 分鐘!工程師教你設計「自動化迎賓旅程」,讓新會員從路人變鐵粉






