~/blog/wordpress-crm-multi-channel-attribution-tracking-guide.md
企業系統與 CRM · 2025 / 12 / 07

行銷預算到底花去哪?WordPress + CRM 多渠道歸因追蹤完整指南

Eric — 浪花科技創辦人 / AI 架構師
Eric
浪花科技創辦人 · AI 架構師
行銷預算到底花去哪?WordPress + CRM 多渠道歸因追蹤完整指南
目錄 table-of-contents.md

月底檢討會上,老闆問「帶來最多付費客戶的到底是哪個管道?」,會議室一片死寂——Google 廣告、Facebook 社群、SEO 都有流量、都有點擊,就是沒人答得出錢花去哪最值。問題多半出在「最後點擊歸因」這個壞掉的羅盤。本文以工程師視角,動手打造 WordPress 結合 CRM 的多渠道歸因追蹤系統,把客戶從初次接觸到成交的整段旅程攤開來看。

這就是典型的「最後點擊歸因」陷阱。你只看到客戶成交前的最後一步,卻忽略了他們從認識你到愛上你的整段漫長旅程。今天,我就要以工程師的視角,帶你動手打造一套 WordPress 結合 CRM 的多渠道歸因分析系統,讓你清楚追蹤客戶是從 SEO、廣告還是社群媒體來的,不再讓任何一分行銷預算白白浪費。

為什麼「最後點擊」是個壞掉的羅盤?你需要的是商業 GPS:多渠道歸因

想像一下,一場籃球賽,A 球員抄截、B 球員傳球、C 球員助攻,最後 D 球員投籃得分。如果用「最後點擊歸因」,那所有功勞都歸 D 球員。這公平嗎?當然不。行銷也是一樣的道理。

一個客戶的旅程可能是這樣的:

  • 第一次接觸:在 Google 搜尋某個問題,透過 SEO 點進了你的部落格文章。
  • 加深印象:幾天後,在 Facebook 上看到你的 retargeting 廣告,覺得有點眼熟。
  • 產生興趣:又過了一週,收到你寄的電子報,裡面有一篇深度案例分享。
  • 完成轉換:最後,他直接在瀏覽器輸入你的網址,填寫了諮詢表單。

如果只看「最後點擊」,你會以為這個客戶是「直接流量」(Direct),然後錯誤地判斷 SEO、社群廣告、EDM 都沒用。這就是災難的開始。多渠道歸因就是要幫你畫出這張完整的「客戶旅程地圖」,讓你了解每個管道扮演的角色,誰是得分手、誰是助攻王。

數位足跡的起點:UTM 參數,你的追蹤麵包屑

好了,理論講完了,我們來點硬核的。要實現追蹤,我們的核心武器就是 UTM (Urchin Tracking Module) 參數。這聽起來很技術,但說穿了,它就是在網址後面加上幾個「標籤」,告訴我們這個訪客是從哪裡來的。

到底什麼是 UTM?五大金剛解析

一個完整的 UTM 網址長得像這樣:

https://roamer-tech.com/?utm_source=facebook&utm_medium=cpc&utm_campaign=q3_promo

問號後面的就是 UTM 參數,主要由這五個部分組成:

  • utm_source:流量來源,例如 google、facebook、line。
  • utm_medium:行銷媒介,例如 cpc (付費廣告)、social (社群貼文)、email。
  • utm_campaign:廣告活動名稱,例如 summer_sale_2024、new_product_launch。
  • utm_term:關鍵字 (主要用於搜尋廣告)。
  • utm_content:廣告內容 (用於 A/B 測試,例如 red_button vs blue_button)。

工程師的小囉嗦:建立你的 UTM 命名規則!

在我們動手寫任何程式碼之前,我必須先囉嗦一下:請務必、務必、務必建立一套全公司統一的 UTM 命名規則!我處理過太多客戶的數據災難,都是因為 UTM 命名混亂造成的。一下用 `Facebook`,一下用 `facebook`,一下又是 `FB`,在數據分析時,系統會把這三個視為完全不同的來源,你的報告就會變成一坨垃圾。

建議規則:

  • 全部小寫:避免大小寫混淆。
  • 使用底線分隔:用 `_` 代替空格,例如 `q3_promo`。
  • 保持精簡且語意清晰。
  • 製作一份共享文件:讓所有行銷團隊成員都能查詢和遵守。

相信我,現在花 30 分鐘建立規則,可以省下你未來 30 個小時清理數據的痛苦。

從瀏覽器到 CRM:三步驟打造潛在客戶的追蹤管道

現在,重頭戲來了。我們要怎麼把使用者網址上的 UTM 參數,一路護送到你的 CRM 系統裡,並跟著客戶資料綁定在一起?我們會分三步走:

當使用者帶著 UTM 參數第一次來到你的網站時,我們必須立刻把這些資訊「抓下來」。因為他可能不會在第一個頁面就轉換,可能會逛逛「關於我們」、「服務項目」等頁面。如果我們不把這些資訊存起來,一旦他跳轉到下一頁,網址上的 UTM 參數就消失了。

最好的方法就是用 JavaScript 讀取 URL 參數,然後把它們存進瀏覽器的 Cookie。Cookie 的好處是,在它過期之前,使用者在你的網站內不管怎麼逛,我們都能隨時取回這些最初的來源資訊。

請將以下這段 JavaScript 程式碼,透過佈景主題的設定或 `functions.php` 檔案,加到你網站的 `<head>` 或頁尾 (footer) 區域。

<script>
document.addEventListener('DOMContentLoaded', function() {
    function getUrlParams() {
        const params = new URLSearchParams(window.location.search);
        const utmParams = {};
        const utmKeys = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content'];
        let hasUtm = false;

        utmKeys.forEach(key => {
            if (params.has(key)) {
                utmParams[key] = params.get(key);
                hasUtm = true;
            }
        });

        return hasUtm ? utmParams : null;
    }

    function setCookie(name, value, days) {
        let expires = "";
        if (days) {
            const date = new Date();
            date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
            expires = "; expires=" + date.toUTCString();
        }
        // 將物件轉換為 JSON 字串儲存
        document.cookie = name + "=" + (JSON.stringify(value) || "")  + expires + "; path=/";
    }

    function getCookie(name) {
        const nameEQ = name + "=";
        const ca = document.cookie.split(';');
        for(let i = 0; i < ca.length; i++) {
            let c = ca[i];
            while (c.charAt(0) === ' ') c = c.substring(1, c.length);
            if (c.indexOf(nameEQ) === 0) {
                // 解析 JSON 字串
                try {
                    return JSON.parse(c.substring(nameEQ.length, c.length));
                } catch (e) {
                    return null;
                }
            }
        }
        return null;
    }

    // 只有當網址中有 UTM 參數,且 Cookie 中沒有時,才寫入新的 Cookie
    const currentUtms = getUrlParams();
    const existingUtmsCookie = getCookie('roamer_utm_data');

    if (currentUtms && !existingUtmsCookie) {
        // 設定一個 30 天過期的 Cookie
        setCookie('roamer_utm_data', currentUtms, 30);
    }
});
</script>

這段程式碼做的事情很單純:

  1. 檢查當前頁面的網址是否包含任何 UTM 參數。
  2. 檢查瀏覽器是否已經存在一個名為 `roamer_utm_data` 的 Cookie(代表這不是第一次帶 UTM 參數的訪問)。
  3. 如果網址有 UTM,且 Cookie 不存在,就把這些 UTM 參數打包成一個物件,存進 `roamer_utm_data` 這個 Cookie 裡,並設定 30 天後過期。

步驟二:在表單中埋下「隱藏欄位」

現在我們已經把來源資訊存在使用者的瀏覽器裡了。下一步,就是當他填寫聯絡表單 (例如 Contact Form 7 或 Gravity Forms) 的時候,神不知鬼不覺地把這些資訊一起送出去。

我們需要在你的表單裡加入幾個「隱藏欄位」(Hidden Fields)。這些欄位使用者看不到,也無法填寫,但它們確實在表單中,等著被我們的程式碼填入數值。

以 Contact Form 7 為例,你可以在表單編輯器中加入:

[hidden utm_source id:utm_source]
[hidden utm_medium id:utm_medium]
[hidden utm_campaign id:utm_campaign]
[hidden utm_term id:utm_term]
[hidden utm_content id:utm_content]

最後一步,就是在表單頁面載入時,讀取我們之前存的 Cookie,然後把裡面的值填入對應的隱藏欄位。這樣使用者一按「提交」,UTM 數據就跟著他的聯絡資訊一起發送了。

請將下面這段 JavaScript 加到你網站的頁尾:

<script>
document.addEventListener('DOMContentLoaded', function() {
    function getCookie(name) {
        const nameEQ = name + "=";
        const ca = document.cookie.split(';');
        for(let i = 0; i < ca.length; i++) {
            let c = ca[i];
            while (c.charAt(0) === ' ') c = c.substring(1, c.length);
            if (c.indexOf(nameEQ) === 0) {
                try {
                    return JSON.parse(c.substring(nameEQ.length, c.length));
                } catch (e) {
                    return null;
                }
            }
        }
        return null;
    }

    const utmData = getCookie('roamer_utm_data');

    if (utmData) {
        // 將 Cookie 中的值填入對應的隱藏欄位
        if (document.getElementById('utm_source')) document.getElementById('utm_source').value = utmData.utm_source || '';
        if (document.getElementById('utm_medium')) document.getElementById('utm_medium').value = utmData.utm_medium || '';
        if (document.getElementById('utm_campaign')) document.getElementById('utm_campaign').value = utmData.utm_campaign || '';
        if (document.getElementById('utm_term')) document.getElementById('utm_term').value = utmData.utm_term || '';
        if (document.getElementById('utm_content')) document.getElementById('utm_content').value = utmData.utm_content || '';
    }
});
</script>

搞定!現在,每當有使用者提交表單,你收到的資料裡就會包含他最初的來源資訊。接下來,你只需要在你的 CRM 系統(如 HubSpot、Salesforce)中建立對應的自訂欄位 (例如: Original Source, Original Medium 等),然後將表單欄位映射過去即可。無論是透過外掛直接整合,還是使用 n8n、Zapier 這類自動化工具,都能輕鬆完成。

結語:從猜測到洞察,數據驅動的真正意義

建立這套多渠道歸因追蹤系統,看起來有點技術門檻,但它帶來的價值是無可估量的。你將不再是憑感覺、憑直覺在做行銷決策。你的每一分預算、每一次活動,都能被精準地量化和評估。你會清楚地知道,SEO 帶來的客戶雖然轉換慢,但忠誠度最高;Facebook 廣告帶來的客戶雖然多,但客單價偏低。這些洞察,才是真正能驅動企業成長的引擎。

當然,這只是歸因分析的起點。更進階的還有跨裝置追蹤、不同歸因模型的選擇等等,但打好這個基礎,你已經超越了 80% 的競爭對手。數據不會說謊,它只會告訴你最真實的商業故事。

延伸閱讀

如果你覺得以上的技術細節太過複雜,或是希望有專家能協助你規劃並執行一套完整的 WordPress + CRM 數據追蹤架構,歡迎隨時與浪花科技的團隊聯繫。我們很樂意協助你打造真正能驅動商業決策的數據引擎。

// FAQ

常見問題

什麼是多渠道歸因,和「最後點擊歸因」有何不同?
最後點擊歸因只把功勞歸給客戶成交前的最後一步,會忽略整段客戶旅程,導致誤判 SEO、社群、EDM 等管道無效。多渠道歸因則畫出完整的客戶旅程地圖,讓你了解每個管道在從認識到成交過程中扮演的角色,避免行銷預算被錯誤分配。
UTM 參數有哪五個組成部分?
UTM 參數主要由五個部分組成:utm_source(流量來源,如 google、facebook)、utm_medium(行銷媒介,如 cpc、social、email)、utm_campaign(廣告活動名稱)、utm_term(關鍵字,主要用於搜尋廣告)、utm_content(廣告內容,用於 A/B 測試)。它們加在網址問號之後,用來標記訪客的來源。
為什麼一定要建立統一的 UTM 命名規則?
因為命名混亂會造成數據災難。例如同一個來源一下用 Facebook、一下用 facebook、一下又是 FB,系統會把它們視為完全不同的來源,報告就會失準。建議規則是:全部小寫、用底線分隔、保持精簡語意清晰,並製作共享文件讓全團隊遵守。先花時間建立規則能省下日後大量清理數據的痛苦。
如何把網址上的 UTM 參數一路帶到 CRM 並綁定客戶資料?
分三步:第一步用 JavaScript 在訪客第一次帶 UTM 進站時讀取網址參數並存進瀏覽器 Cookie(例如設定 30 天過期),確保跳頁後資訊不流失;第二步在表單中加入隱藏欄位(如 Contact Form 7 的 hidden 欄位);第三步在提交時把 Cookie 中的 UTM 值填入隱藏欄位一起送出,使來源資訊跟著客戶資料進入 CRM。
為什麼要把 UTM 參數存進 Cookie,而不是只讀網址?
因為使用者帶著 UTM 參數進站後,可能不會在第一個頁面就轉換,而會繼續瀏覽其他頁面,一旦跳頁網址上的 UTM 參數就會消失。把 UTM 存進 Cookie 後,在 Cookie 過期前不論使用者怎麼逛,都能隨時取回最初的來源資訊並在轉換時送出。
~/roamer-tech/newsletter // FREE
// newsletter

訂閱免費電子報

把 AI 自動化、企業系統設計與 WordPress / Laravel 開發的真實案例和可直接照做的技巧,整理成電子報寄給你。只寄精選內容、不灌垃圾信,一鍵就能退訂。

$
// final.exec()

準備好讓你的網站開始為你工作了嗎?