分析範圍:2026 年 5 月 29 日至 7 月 3 日寄出的 19 封台灣電子報 · 資料擷取時間 2026 年 7 月 21 日 19 Taiwan newsletter sends, 29 May – 3 July 2026 · Data extracted 21 July 2026
結論:曾經捐過款的支持者,點擊率是從未捐款者的 4 倍(1.036% 對 0.259%)。19 封信全部是已捐款者較高,沒有例外;各封差距介於 1.3 至 5.7 倍。但兩群的開信率幾乎一樣(21.91% 對 19.19%)。也就是說,是否捐過款預測的是「會不會採取行動」,不是「會不會注意到你」。 Answer: supporters who had already donated clicked four times as often as those who never had (1.036% vs 0.259%). All 19 sends favour prior donors without exception, per-send gaps ranging 1.3× to 5.7× — yet the two groups opened at almost the same rate (21.91% vs 19.19%). Prior donation predicts whether someone acts, not whether they pay attention.
關於 value-based 分群:這 19 封信寄送的正是那三個分群(國際觀型/傳統價值型/監督型,即 2026 年 6 月 10 日建立的名單)。在三個版本信件內容逐字相同的前提下,國際觀型的點擊率是傳統價值型的 2.3 倍,且此差距在已捐款、未捐款兩群內各自都成立——分群確實造成可量測的行為差異。另一個重點:這 19 封信中有 16 封是連署信,其目標是取得連署簽名,因此本報告除捐款外也納入連署成績——16 封連署信帶來 815 位可歸戶的連署者,且已捐款者的連署率是未捐款者的 4.9 倍,與點擊率的 4 倍互相印證。 On the values-based segmentation: these 19 sends went to exactly those three segments (international-outlook, traditional-values, oversight-minded — the lists built on 10 June 2026). With the three versions carrying byte-identical content, the international-outlook segment clicked 2.3 times as often as traditional-values, and the gap holds within both donor-status groups — the segmentation does produce a measurable difference in behaviour. Equally important: 16 of the 19 are petition emails, whose goal is signatures, so this report covers signatures alongside donations — those 16 sends produced 815 attributable signatures, and prior donors signed at 4.9 times the rate of those who had never given, corroborating the 4× click gap.
連署信的目標是取得連署簽名,募款信的目標才是捐款,兩者要各用各的指標評分。以簽名衡量,這 16 封連署信的連署率介於送達數的 0.1% 到 0.7%,且已捐款者的連署率是未捐款者的 4.9 倍(0.652% 對 0.133%)——與點擊率 4 倍的差距互相印證,兩個獨立指標指向同一個結論。國際觀型名單的連署表現同樣是三個名單中最高。簽名數的歸因經三個系統交叉驗證:行銷活動成員記錄、表單填答的隱藏追蹤欄位、以及網站分析的活動內容維度,三者差異在 5% 至 12% 之內,本報告採用表單填答為準(該來源可去重到人,且不受後續活動覆寫影響)。 A petition email exists to collect signatures; a fundraising email exists to raise money. Each should be scored on its own metric. Measured that way, the 16 petition sends converted 0.1% to 0.7% of delivered messages, and prior donors signed at 4.9 times the rate of those who had never given (0.652% vs 0.133%) — corroborating the 4× click gap from a second, independent metric. The international-outlook list again leads the three. Attribution was cross-checked across three systems: campaign membership records, a hidden tracking field on the form submission, and the web-analytics campaign-content dimension, agreeing within 5% to 12%. Form submissions are used here because they deduplicate to a person and are not overwritten by later campaigns.
48 筆捐款中有 9 筆、876 位連署者中有 61 位,帶有這批信的追蹤參數,但捐款人或連署人的電子郵件地址不在任何一封信的收件名單中。行銷來源與媒介欄位確認這些行動確實由這批信件觸發。 成因無法從現有資料判定。已查證的事實是:9 位捐款者的聯絡人記錄都是在捐款當天才建立;以電話號碼比對後,其中 1 位有一個共用電話、且確實收到過這批信的聯絡人(符合「同一人用不同電子郵件地址捐款」),5 位的共用電話對象同樣沒收到信(可能是家戶共用號碼,也可能是重複記錄,無法分辨),3 位的電話在系統中唯一。 可能的解釋包括:信件被轉寄給名單外的人、支持者在捐款表單填了與收信不同的電子郵件地址、或家庭成員共用。現有資料不足以判斷何者為主,因此本報告不對成因下結論。無論成因為何,這些行動都無法歸屬到兩個分群中的任一群,因為他們不在任何一群的寄送分母裡。 另需注意:最後一封信(7 月 3 日)的 30 天歸因視窗要到 8 月 2 日才屆滿,海洋保護區那封則是 7 月 26 日,兩者的數字尚未完整。另需說明:本版只呈現捐款結果,但這 19 封信中有 16 封是連署信,其真正目標是連署簽名而非募款,用捐款數評價它們並不恰當。連署簽名有被記錄(於行銷活動成員、表單填答與網站分析中),能否逐封歸因正在確認,確認後將補入本報告。 Nine of 48 donations and 61 of 876 signatures carry these sends' tracking codes, but the donor's or signer's email address is not on any send list. The source and medium fields confirm these actions were driven by these emails. Why cannot be determined from the available data. What is established: all nine donors' contact records were created on the day they gave; matching on phone number, one of the nine shares a number with a contact that did receive these emails (consistent with one person donating under a different address), five share a number with a contact that also did not receive them (a household sharing a number, or a duplicate record — the two cannot be told apart), and three have a number unique in the system. Candidate explanations include the email being forwarded to someone off-list, a supporter entering a different email address on the donation form, and household sharing. The data cannot establish which dominates, so this report draws no conclusion about the cause. Either way these actions cannot be assigned to either audience, since they appear in neither group's delivery denominator. Separately: the 3 July send's 30-day window closes on 2 August and the marine protected areas send's on 26 July, so both remain incomplete. Note also that this version reports donation outcomes only, yet 16 of the 19 sends are petition emails whose real goal is signatures, not money — judging them on donations is not appropriate. Signatures are recorded (in campaign membership, form submissions and web analytics); whether they can be attributed to an individual send is being confirmed and will be added here.
從未捐款者開信率 19.19%,已捐款者 21.91%,相差 2.7 個百分點。我特別檢查過一個可能讓這個比較失效的陷阱:郵件軟體自動預抓圖片會產生「假開信」,若兩群使用的郵件軟體不同,比到的就是軟體不是興趣。實測兩群的機器開信佔比分別是 42.8% 與 41.0%,幾乎相同,所以這個比較是乾淨的。另一個支持「兩群開信行為其實接近」的證據:19 封信中有 1 封(海洋保護區・監督型)的開信率是未捐款者較高(24.11% 對 22.82%)。相對地,點擊率的方向性 19 封全部一致,沒有任何反例。 Never-donated opened at 19.19%, already-donated at 21.91% — 2.7 percentage points apart. I specifically checked the trap that would invalidate this comparison: mail applications that pre-load images generate opens no person performed, so if the two groups used different mail software the comparison would measure software, not interest. Machine-generated opens were 42.8% and 41.0% of raw opens respectively — near-identical, so the comparison is clean. Further evidence that the two groups open similarly: in one of the 19 sends (marine protected areas, oversight list) the never-donated group actually opened more (24.11% vs 22.82%). By contrast the click-rate direction held in all 19 sends with no exception.
點擊率 0.259% 對 1.036%(4.0 倍),開信後點擊率 1.35% 對 4.73%(3.5 倍)。兩項保留:一是機器點擊的偵測遠不如機器開信有效(全部事件中,45.72% 的開信被標記為機器產生,點擊只有 2.86%),所以點擊端可能仍有未被濾除的自動化行為;二是這是觀察資料不是實驗,已捐款者同時也在「加入名單多久」「最近一次同意接收的時間」等面向上不同,資料無法排除那才是真正原因。 Click rate 0.259% vs 1.036% (4.0×); click-to-open 1.35% vs 4.73% (3.5×). Two caveats. First, automated-activity detection is far weaker on clicks than on opens: across all events, 45.72% of opens were flagged as machine-generated versus only 2.86% of clicks, so unfiltered automation may remain on the click side. Second, this is observational, not an experiment — prior donors also differ in how long ago they joined and how recently they consented, and the data cannot rule those out as the real cause.
這 19 封信寄給三個互不重疊的名單:國際觀型、傳統價值型、監督型,全期送達量分別為 178,800、129,679、45,843 封次。我比對過三個版本的完整信件內容,除了連結上的追蹤參數之外逐字相同——所以差異來自受眾,不是文案。國際觀型點擊率 0.646%、傳統價值型 0.284%、監督型 0.303%(此差距在已捐款、未捐款兩群內各自都是 2.2 倍,並非兩群混合比例不同造成的假象)。「點擊率最低」在已捐款、未捐款兩群內都成立(各約 2.2 倍)。開信率則要分開看:傳統價值型在未捐款群是三者最高(20.01%),在已捐款群反而是三者最低(21.33%)。整體而言這群人願意打開,但沒有被促成行動。 These sends went to three mutually exclusive lists: international-outlook, traditional-values and oversight-minded, receiving 178,800, 129,679 and 45,843 delivered messages over the period. I compared the full email content across all three versions and it is identical apart from the tracking parameter in links — so the difference is the audience, not the creative. Click rates: 0.646%, 0.284%, 0.303% (the gap is 2.2× within each donor-status group separately, so it is not an artefact of the groups being mixed in different proportions). The lowest-click-rate pattern holds within both donor-status groups (about 2.2× in each). Open rate is mixed: traditional-values is the highest of the three among never-donated (20.01%) but the lowest among already-donated (21.33%). Overall this audience opens but is not moved to act.
只看未捐款那一群,在同一個名單內比較不同題目,開信率相差 2.3 至 2.7 倍(監督型名單內從 9.32% 到 25.13%);相對地,兩個捐款狀態群之間只差 1.14 倍。限定在同一名單內比較,是為了不把題目的效果與名單的效果混在一起。每封信的送達量介於約 5,400 到 19,200 封,不是小樣本造成的波動。保留意見:這 19 封信寄出時間跨越五週,季節性與名單疲勞無法與題目本身分離。 Within the never-donated audience alone, comparing topics within a single list, open rate varies by 2.3× to 2.7× (within the oversight list, 9.32% up to 25.13%) — against only 1.14× between the two donor-status groups. Holding the comparison within one list keeps the topic effect separate from the list effect. Each send delivered roughly 5,400–19,200 messages, so this is not a small-sample artefact. Caveat: the sends span five weeks, so seasonality and list fatigue cannot be separated from subject matter.
本項僅涉及「能否用捐款數比較兩群」,不涉及捐款成績的好壞——本報告未取得歷史基準,因此不對捐款表現做任何評價。19 封信合計 39 筆可歸戶捐款:未捐款群 6 筆定期定額+8 筆單筆,已捐款群 6 筆定期定額+19 筆單筆。逐封來看,每個格子多半是 0 或 1。另有三封信的捐款完全未知。請不要用捐款筆數比較這兩群——兩三筆捐款的落點不同就會翻轉排序。若要評估捐款成績本身,需另外取得歷史同類信件的基準值。 This is solely about whether donations can be used to compare the two audiences; it is not an assessment of fundraising performance, for which no historical benchmark was obtained. Across all 19 sends, 39 donations are traceable: never-donated 6 recurring + 8 single; already-donated 6 recurring + 19 single. Per send, most cells hold 0 or 1. Three further sends have unknown totals. Please do not compare the two audiences on gift counts — two or three gifts landing differently would reverse the ranking. Assessing fundraising performance itself would require a historical benchmark for comparable sends.
| 群組Audience | 寄送Sent | 送達Delivered | 開信(真人)Opens (people) | 開信率Open rate | 含機器開信Incl. machine | 機器占比Machine share | 點擊Clicks | 點擊率Click rate | 開信後點擊率Click-to-open | 連署數Signatures | 連署率Signature rate | 定期定額Recurring | 單筆Single |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 未曾捐款(enews)Never donated | 260,102 | 258,621 | 49,631 | 19.19% | 86,839 | 42.8% | 671 | 0.259% | 1.35% | 290 | 0.133% | 6 | 8 |
| 已捐過款(ebull)Already donated | 95,992 | 95,701 | 20,965 | 21.91% | 35,533 | 41.0% | 991 | 1.036% | 4.73% | 525 | 0.652% | 6 | 19 |
開信與點擊為「每封信內去重後的人次」加總,只能作為比率的分子,不能解讀成有多少人——全期間實際只觸及 66,114 人。已排除郵件軟體自動產生的開信。 Opens and clicks are per-send deduplicated counts, summed — valid as rate numerators only, not as a count of people; just 66,114 distinct people were reached in total. Machine-generated opens excluded.
「開信數(真人)」已排除機器產生的開信,與 HubSpot 介面顯示的數字一致;「含機器開信數」是未排除前的原始值,兩者並列是為了讓機器開信的規模可被看見,不應拿含機器的數字對外報告。比率欄位的底色深淺代表該欄位內的高低,每一欄各自獨立比較;數字本身仍完整列出,顏色只是輔助。 "Opens (people)" excludes machine-generated opens and matches what HubSpot shows on screen; "Incl. machine" is the unfiltered figure. Both are shown so the scale of machine activity is visible — do not report the unfiltered number externally. Shading in the percentage columns shows high and low within that column only, each scaled independently; figures are printed in full and colour is only an aid.
捐款欄位淡化顯示,提醒該數字樣本數過小、不應單獨解讀。連署類信件的捐款為零屬正常,其成效請看右側的連署欄位;募款信則相反,連署欄位顯示「—」表示不適用。 Donation columns are dimmed as a reminder that they are too sparse to read individually. Zero donations on a petition send is normal — read its signature columns instead. For the fundraising sends the reverse applies, and the signature columns show an em dash for not applicable.
為了避免只從單一角度解讀,分析過程中刻意用兩種會彼此衝突的立場檢驗結論:募款端(重視捐款者價值與活動組合)與郵件營運端(重視名單健康與量測可信度)。這是分析時的自我對照,不是由兩位同事審閱。兩種立場對數字本身沒有異議,但對「下一步該做什麼」得不出一致答案,兩種說法都列在下面供判斷: To avoid reading the data from a single angle, these conclusions were tested against two conflicting positions: fundraising (donor value and campaign mix) and email operations (list health and measurement integrity). This was a self-check during analysis, not a review by two colleagues. Neither position disputes the figures, but they do not reach the same answer on what to do next, so both are set out below:
現有資料無法判定哪一種比較對。要解決這個分歧需要三樣東西:每位收件人的加入名單日期與同意時間(用來檢驗營運端提出的替代解釋)、點擊端的機器行為檢查、以及一次帶有隨機保留組、且落地追蹤正常運作的活動。 The present evidence cannot settle which is right. Doing so would need three things: each recipient's list-join and consent dates (to test operations' rival explanation), a machine-activity check on the click side, and one campaign run with working landing-page tracking and a randomly held-out group.
寄送與送達數字已與 HubSpot 自身回報的數字對帳:19 封信全數落在 +0.21% 至 +2.18% 之間,整體 +0.35%(我們計 356,441,HubSpot 計 355,194)。開信與點擊的計算口徑也經驗證可重現 HubSpot 介面數字,兩封抽驗信件的誤差分別為 0.14% 與 0.11%。已驗證 Sent and delivered figures were reconciled against the platform's own reported numbers: all 19 sends fall between +0.21% and +2.18%, overall +0.35% (356,441 ours vs 355,194 theirs). The open and click methodology was verified to reproduce the platform's on-screen figures to within 0.14% and 0.11% on two test sends. Verified
收件人比對涵蓋率:66,114 位收件人中僅 201 位(0.3%)在聯絡人資料庫查無資料;無法判定捐款狀態的寄送佔全部的 0.10%。 Recipient match coverage: only 201 of 66,114 recipients (0.3%) had no contact record; sends that could not be classified account for 0.10% of the total.
本頁假設讀者手上沒有任何本機檔案,從零開始也能重現全部數字。 This section assumes the reader has no local files and can reproduce every figure from scratch.
| 數字Figure | 如何取得How obtained |
|---|---|
| 19.19% / 21.91% | 各群「非機器產生的不重複開信人次」÷「該群送達數」Non-machine deduplicated opens ÷ delivered, per group |
| 0.259% / 1.036% | 各群「不重複點擊人次」÷「該群送達數」Deduplicated clickers ÷ delivered, per group |
| 42.8% / 41.0% | (含機器開信人次 − 非機器開信人次)÷ 含機器開信人次(raw opens − human opens) ÷ raw opens |
| 39 筆捐款 | 捐款物件中,追蹤參數等於這 19 封信其中之一、狀態為已處理、金額大於零、且落在該封信寄出後 30 天內者;定期定額僅計首次扣款;扣除 9 筆來自非收件人的捐款Donations whose tracking parameter matches one of the 19 sends, processed, positive amount, within 30 days of that send; recurring counted at opening charge only; excludes 9 donations from non-recipients |
| 66,114 | 全部 19 封信的寄送事件收件人地址去重後的總數Distinct recipient addresses across all sends' delivery events |
| 2.3× | 國際觀型名單點擊率 0.646% ÷ 傳統價值型 0.284%0.646% ÷ 0.284% |
重現時的起點。信件編號用於取得信件內容與寄送時間;活動編號用於查詢逐筆互動事件(兩者是不同的識別碼);追蹤碼用於比對捐款與連署。A/B 測試的信件對應三個活動編號,三者加總才是完整名單。 The starting point for any recomputation. The email id retrieves content and send time; the campaign id is what the per-event endpoint takes (they are different identifiers); the tracking code is what donations and signatures are matched on. A/B tested sends map to three campaign ids whose union is the full audience.
| 寄送日Sent | 追蹤碼 utm_contentTracking code | 信件編號Email id | 活動編號Campaign id | appIdappId |
|---|---|---|---|---|
| 2026-05-29 | petition-energy-ai_cake_international | 412332026092 | 137017961 | 113 |
| 2026-06-03 | petition-climate-antarctica_hotter_international | 414859316410 | 137404363 | 113 |
| 2026-06-03 | petition-climate-antarctica_hotter_traditional | 414859319499 | 137406339 | 113 |
| 2026-06-03 | petition-climate-antarctica_hotter_supervision | 414770668775 | 137406641 | 113 |
| 2026-06-11 | petition-oceans-babyfish_international | 419220717767,419220890819 | 138094384,138094385,138094386 | 20185 |
| 2026-06-11 | petition-oceans-babyfish_traditional | 419221280988,419221363954 | 138095525,138095526,138095527 | 20185 |
| 2026-06-11 | petition-oceans-babyfish_supervision | 419221169365,419221001419 | 138096186,138096187,138096188 | 20185 |
| 2026-06-12 | donation-plastics-resource_circulation_promotion_act_international | 419478832355 | 138178783 | 113 |
| 2026-06-12 | donation-plastics-resource_circulation_promotion_act_traditional | 419481563342 | 138178798 | 113 |
| 2026-06-12 | donation-plastics-resource_circulation_promotion_act_supervision | 419478927604 | 138179038 | 113 |
| 2026-06-18 | petition-climate-dalinpo_international | 422440354015 | 138650476 | 113 |
| 2026-06-18 | petition-climate-dalinpo_traditional | 422582832347 | 138650641 | 113 |
| 2026-06-18 | petition-climate-dalinpo_supervision | 422533062856 | 138650692 | 113 |
| 2026-06-26 | petition-oceans-mpa_international | 426875212018,426875183331 | 139306291,139306292,139306293 | 20185 |
| 2026-06-26 | petition-oceans-mpa_traditional | 426875301054,426920875249 | 139306719,139306720,139306721 | 20185 |
| 2026-06-26 | petition-oceans-mpa_supervision | 426875302111,426875321537 | 139306922,139306923,139306924 | 20185 |
| 2026-07-03 | petition-plastics-nurdles_forum_international | 430899306708,430947523791 | 139919992,139919993,139919994 | 20185 |
| 2026-07-03 | petition-plastics-nurdles_forum_traditional | 430899441871,430947631306 | 139920962,139920963,139920964 | 20185 |
| 2026-07-03 | petition-plastics-nurdles_forum_supervision | 430899487959,430947639544 | 139920971,139920972,139920973 | 20185 |
以下每一步都可直接執行,不需要任何本機既有檔案。權杖請向團隊的密碼保管處索取,設為環境變數 TOKEN。
Every step below runs standalone with no pre-existing local files. Obtain the token from the team's secret store and export it as TOKEN.
步驟一 — 由信件編號取得活動編號Step 1 — resolve campaign ids from an email id
curl -s -H "Authorization: Bearer $TOKEN" \
"https://api.hubapi.com/marketing/v3/emails/412332026092" \
| python3 -c "import sys,json; d=json.load(sys.stdin); print(d['allEmailCampaignIds'], d['publishDate'])"
# then read appId from the campaign record
curl -s -H "Authorization: Bearer $TOKEN" \
"https://api.hubapi.com/email/public/v1/campaigns/137017961" \
| python3 -c "import sys,json; d=json.load(sys.stdin); print(d['appId'], d['contentId'], d['counters'])"
appId 依寄送工具而異(一般批次為 113,A/B 測試為 20185),必須逐一讀取,不可假設。 appId varies by sending tool (113 for a plain batch, 20185 for an A/B test) and must be read per campaign, never assumed.
步驟二 — 拉取逐筆互動事件Step 2 — pull recipient-level events
curl -s -H "Authorization: Bearer $TOKEN" \
"https://api.hubapi.com/email/public/v1/events?appId=113&emailCampaignId=137017961&eventType=OPEN&limit=1000"
四種事件各拉一次:SENT、DELIVERED、OPEN、CLICK。回應含 hasMore 與 offset,需分頁直到取完;若 offset 未前進必須中止,否則會無限重抓同一頁而使數字倍增。每筆事件的 recipient 是收件人電子郵件地址(比對前統一轉小寫並去除前後空白),filteredEvent 為布林值,true 表示該次互動由機器產生。
Pull each of SENT, DELIVERED, OPEN, CLICK. The response carries hasMore and offset; page until exhausted and abort if the offset stops advancing, or the same page is re-fetched forever and the counts multiply. Each event's recipient is the email address (lower-case and trim before matching) and filteredEvent is a boolean, true meaning the engagement was machine-generated.
步驟三 — 取得每位收件人的捐款歷史Step 3 — each recipient's donation history
curl -s -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
"https://api.hubapi.com/crm/v3/objects/contacts/batch/read" \
-d '{"idProperty":"email",
"properties":["email","first_donation_date","number_of_donations_all_time"],
"inputs":[{"id":"someone@example.com"}]}'
每批最多 100 筆。名單中含已刪除聯絡人時回應為 207,仍會回傳查得到的部分,屬正常情況。 Maximum 100 per batch. A batch containing a deleted contact returns 207 with the found ones still present — this is normal, not an error.
步驟四 — 捐款Step 4 — donations
SELECT Id, Contact__c, CreatedDate, Amount__c, Donation_Type__c,
Is_Recurring_Donation__c, Recurring_Donation__c, UTM_Content__c
FROM Donation__c
WHERE Status__c = 'Processed' AND Amount__c > 0
AND CreatedDate >= 2026-05-29T00:00:00Z AND CreatedDate <= 2026-08-03T00:00:00Z
AND UTM_Content__c IN ('petition-energy-ai_cake_international', ...)
再以 Recurring_Donation__c 取母記錄的 First_Successful_Donation_Date__c,用於判定是否為首次扣款;並由 Contact__c 取 Contact.Email 以串回收件人。
Then fetch the parent's First_Successful_Donation_Date__c via Recurring_Donation__c to identify the opening charge, and Contact.Email via Contact__c to join back to recipients.
步驟五 — 連署簽名Step 5 — petition signatures
# list forms, then pull submissions per form id
curl -s -H "Authorization: Bearer $TOKEN" "https://api.hubapi.com/marketing/v3/forms?limit=100"
curl -s -H "Authorization: Bearer $TOKEN" \
"https://api.hubapi.com/form-integrations/v1/submissions/forms/<formId>?limit=50"
每筆填答含 values 陣列與 pageUrl。追蹤碼取自隱藏欄位 utm_content(本批 100% 有值);若為空則改由 pageUrl 的查詢字串解析。以 (追蹤碼, 電子郵件地址) 去重,同一人重複簽署取最早一筆。
Each submission carries a values array and pageUrl. Take the tracking code from the hidden utm_content field (populated on 100% of matches here); fall back to parsing it out of the pageUrl query string when empty. Deduplicate by (tracking code, email address), keeping the earliest submission per person.
替代來源:Salesforce CampaignMember.UTM_Content__c 搭配 Petition_Sign_Up_Date__c。該來源每人每活動僅一列且會被最新一次覆寫,因此當同一表單被後續信件再次推廣時會低估較早的信件(實測 babyfish 低 33 筆)。第三來源為網站分析的 petition_signup 事件搭配 sessionManualAdContent 維度,因同意設定與工具阻擋落差 5% 至 12%。
Alternative sources: Salesforce CampaignMember.UTM_Content__c with Petition_Sign_Up_Date__c — one row per person per campaign, overwritten last-touch, so it undercounts an earlier send when the same form is re-promoted later (measured 33 short on one campaign). And the web-analytics petition_signup event by sessionManualAdContent, which runs 5% to 12% off through consent and blocker loss.
TAIPEI = timezone("Asia/Taipei")
# Which audience a recipient belonged to, for one particular send.
# Evaluated at the SEND day, not at the moment of the open/click/signature,
# so that one person has exactly one classification per email and every rate
# for that email shares a consistent denominator.
def audience(email, send_day, first_donation_date, lifetime_donations):
if email not in contact_database:
return "unclassified" # counted separately, never folded into a group
if first_donation_date is None:
return "never_donated" if lifetime_donations == 0 else "already_donated"
return "never_donated" if first_donation_date >= send_day else "already_donated"
# Per send, merge the A/B variants: each recipient received exactly one of the
# campaigns, so the union across a send's campaign ids is its full audience.
for send in sends:
for event_type in ["SENT", "DELIVERED", "OPEN", "CLICK"]:
people = union(recipients(c, event_type) for c in send.campaign_ids)
if event_type in ("OPEN", "CLICK"):
people = [p for p in people if not p.filtered_event] # drop machine activity
for p in people:
counts[audience(p, send.day, ...)][event_type] += 1
# Donations: within 30 days of the send, tagged with that send's code, settled only.
# A recurring commitment counts once, at its opening charge -- later monthly charges
# carry no tracking code at all, but the opening charge is identified explicitly.
def counts_as_recurring_gift(donation):
return (donation.is_recurring
and donation.created_day == donation.parent.first_successful_donation_day)
# Signatures: same 30-day window and tracking code, deduplicated to one per person.
兩個容易做錯的細節。第一,判定用「大於或等於寄送日」而非「大於」:首次捐款日只有日期沒有時間,用「大於」會把當天因這封信而首次捐款的人判成原本就是捐款者,等於消滅要測量的效果。第二,所有時間先換算為台灣時間再取日期:捐款時間以世界標準時間儲存,台灣傍晚之後的捐款在標準時間屬於前一天。 Two details that are easy to get wrong. First, the test is "on or after the send day", not "after": the first-donation date has no time component, so "after" would file someone who gave that very day because of that very email as a pre-existing donor, erasing the effect being measured. Second, convert every timestamp to Taiwan time before taking the day: donation times are stored in universal time, where a Taiwan evening gift falls on the previous day.
彙總後必須對帳:各群寄送數加總應與活動記錄自身回報的寄出數相符。本次全部 19 封落在 +0.21% 至 +2.18% 之間,整體 +0.35%。開信與點擊的口徑(不重複人數、排除機器事件)應能重現平台介面顯示的數字,本次於未參與方法校準的三個活動上實測,送達與點擊完全相同、開信差 0.04% 至 0.44%。 Reconcile after aggregating: summed sends per group should match the campaign record's own reported total. All 19 landed between +0.21% and +2.18% here, +0.35% overall. The open and click definition (distinct people, machine events excluded) should reproduce the figures shown in the platform's interface; tested here on three campaigns not used to calibrate the method, delivered and clicks matched exactly and opens differed by 0.04% to 0.44%.