訂單歸零?資深工程師教你用 WordPress 自動化代碼「暴力喚醒」沉睡 90 天的殭屍客戶

2026/01/13 | CRM 應用, WC 開發, 數位行銷策略

工程師的優雅反擊:用程式碼拯救沉睡客戶!

資深工程師 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)。

我們的程式邏輯流程如下:

  1. 設定一個每日執行的排程(Cron Job)。
  2. 搜尋所有「最後一次消費時間 < 90天前」的使用者。
  3. 檢查這些使用者是否在最近 30 天內已經收過挽回信(避免騷擾)。
  4. 為每個人生成一組專屬的優惠券代碼(Dynamic Coupon)。
  5. 發送 Email。
  6. 更新使用者 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 或其他時間。甚至可以針對不同等級的會員設定不同的喚醒時間。

延伸閱讀

覺得自己手刻自動化系統太複雜?或者擔心動到核心程式碼把網站弄壞?

讓浪花科技的專業團隊幫你打造量身定做的自動化喚醒機制。我們懂程式,更懂你的生意。

立即聯繫我們,喚醒你的沉睡業績

 
立即諮詢,索取免費1年網站保固