CRM 有兩種那篇的開頭,是我用過的 CRM 工作流程:行銷開條件、工程師寫 SQL 撈名單、名單丟進 EDM 系統寄送。

上一篇把會員資料送進了業務型的 CRM。這篇走完後半段:把同一批會員送進行銷自動化系統,用條件分群,寄一封 EDM,再點退訂。

實驗環境

  • 行銷自動化系統:Mautic 7.2.1,用官方 image 加 docker compose 在本機啟動。
  • 寄信:Mailpit。它在本機假裝成寄信伺服器,把所有信攔下來,不會真的寄出去。
  • 資料:跟上一篇同一批假會員,5 位會員、6 張訂單。
  • 同步程式:一支 Node.js 腳本,透過 Mautic 的 REST API 寫入。

五個容器(資料庫、網站、排程、背景工作、Mailpit)合計大約 780 MB 記憶體,資料庫占了一半以上。

送進去:Mautic 用 email 認人

同步的寫法跟上一篇一樣:會員編號、姓名、近 90 天消費、最後下單時間。會員不願意收行銷信,就在 Mautic 標成「不聯絡」(Do Not Contact,簡稱 DNC)。

結果有兩點跟 EspoCRM 不同:

  • 沒有 email 的會員直接跳過。 EDM 一定要有 email,這種會員進來也沒有用。5 位會員進去 4 位。
  • 同一個 email 會被合併。 我事先手動建了一個同 email、沒有會員編號的聯絡人。同步之後,Mautic 用 email 把它跟會員合併成一筆,沒有重複。

Mautic 是行銷系統,email 就是它認人的方式,所以它把 email 設成唯一的識別欄位。我另外把會員編號也設成唯一識別。上一篇 EspoCRM 的重複資料問題,在這裡不會發生。

分群、寄信:退訂的人自動排除

建一個名單分群,條件是「近 90 天消費 ≥ 1000」,再建一封寄給這個分群的信。信裡放了 Mautic 的退訂連結。

按下寄送,結果是寄出 2 封。另外有一位已經退訂的會員符合另一個分群的條件,Mautic 自動把他排除了。

兩個觀察:

  • 退訂的排除是系統內建的。 寄信的人不用在條件裡記得加「排除退訂」。這正是 CRM 會碰到哪些資料那篇說的:同意條件要內建,不能靠人記得加。
  • 同一封信不會重寄。 我把同一封信再寄一次,寄出 0 封。收過的人不會再收到同一封。

撞到的第一件事:同步把退訂蓋掉了

接著從 Mailpit 打開寄給王小明的信,點退訂連結。頁面顯示「ming@example.com 不會再收到我們的信」。Mautic 在他身上加了 DNC,原因是「User unsubscribed」。

然後跑同步。這次我準備了兩個版本:

  • 照抄來源:來源說他願意收信,就把 DNC 移除。結果王小明變回可以寄。
  • 退訂優先:來源說願意,但 Mautic 已經退訂,就不動,並列出來回寫給來源。結果王小明維持退訂。

用「照抄來源」的版本同步後,我寄了一封新的十一月活動信。王小明收到了。 他明明點過退訂。

這跟上一篇在 EspoCRM 撞到的是同一件事,只是換了系統。差別在於,這次是真的寄出了一封信。個資法第 20 條規定,當事人拒絕行銷後應立即停止。一支同步程式就能讓公司違反這條,而且寫同步的人不會發現,因為每一步看起來都正確。

規則跟上一篇一樣:退訂優先,而且退訂要回寫給同意的唯一來源。

撞到的第二件事:名單不是即時的

Mautic 的名單分群不是寫入資料時馬上更新。它靠排程工作,官方 docker 範例預設每 15 分鐘跑一次。

實測:新增一位消費 5000 的會員,立刻查「高消費會員」名單,他不在裡面。手動跑一次分群更新,他才出現。

這對檔期活動的影響是:

  • 寄送前要先更新分群。 不然最後 15 分鐘內符合條件的人會漏掉,已經不符合的人還留在名單裡。
  • 「下單後 10 分鐘推薦加購」這類需求,不適合用分群做。 要用事件觸發,見企業系統之間怎麼交換資料。

撞到的第三件事:消失的 0

這是這次實驗最意外的發現。

有一位會員的訂單在 6 月,超過 90 天,所以近 90 天消費是 0。同步送進 Mautic 之後,他的消費欄位是空的,不是 0。

再做幾個測試:

寫入方式存進去的值
新會員,送 0空白
送字串 "0"空白
原本 1500,同步改成 0還是 1500
加上「空白值也要覆蓋」的參數,再送 0空白

Mautic 把 0 當成「沒有值」。新會員的 0 變成空白,已經有值的會員改成 0,則會被直接忽略。

這會讓名單出錯:

  • 「低消費會員」(消費 < 1000)漏掉消費 0 的人。 空白不符合「小於 1000」。如果這份名單是要喚醒沉睡會員,最該寄的人反而不在裡面。
  • 消費掉到 0 的會員,一直留在「高消費會員」裡。 他的欄位還是舊的 1500。

CRM 有兩種那篇說 Mautic 的名單是活的,不符合條件的人會自己掉出去。這句話成立的前提是:欄位的值真的有更新。

解法:分群不要直接用數字欄位篩選,改用同步程式算好的等級。 我加了一個文字欄位「消費等級」,同步程式算好 none、low、high 三種值送進去,分群改用這個欄位。結果消費 0 的會員正確地進入了 none 那一組。數字欄位還是顯示舊的 1500,只能拿來看,不能拿來篩選。

這其實就是 名單和報表的 ETL 怎麼規劃的做法:條件在自己這邊算好,再把結果推給 EDM 系統。這次實驗多了一個理由:EDM 系統對資料的解讀,不一定跟你想的一樣。

收:送名單進 EDM 的檢查清單

項目這次實驗的做法
認人EDM 系統用 email 認人;沒有 email 的會員不送
退訂系統內建排除;同步不能移除退訂,退訂要回寫給來源
分群時間寄送前先更新分群,不要依賴排程剛好跑過
數字欄位先測 0 和空白怎麼存;分群改用算好的等級
寄信測試用 Mailpit 這類工具攔下所有信,不會寄給真的人

兩篇實驗做下來,最常出事的都是同一件事:退訂。它在 CRM 被蓋掉一次,在 EDM 又被蓋掉一次。每一次的原因都一樣,都是同步程式把來源的舊值寫了回去。

相關主題