2026 年 6 月電子郵件成效:依「寄信當下是否已捐過款」拆分 June 2026 email performance, split by whether each recipient had donated before the email was sent

分析範圍: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.

4.0×
已捐款者的整體點擊率倍數。19 封信全部是已捐款者較高,各封差距 1.3–5.7 倍Overall click-rate multiple for prior donors. All 19 sends favour them; per-send gaps 1.3×–5.7×
2.3×
國際觀型名單相對傳統價值型的點擊率
兩者收到的信件內容逐字相同
International-outlook list vs traditional-values list — identical content
815
16 封連署信帶來的可歸戶連署者
連署為這些信件的既定目標
Attributable signatures from the 16 petition sends — signatures being what those sends set out to collect
4.9×
已捐款者的連署率倍數
0.652% 對 0.133%,與點擊率的 4 倍互相印證
Signature-rate multiple for prior donors: 0.652% vs 0.133%, corroborating the 4× click gap

建議行動What to do

  1. 評估單封信的整體成效時,把名單外的成果一併計入。48 筆捐款中有 9 筆、876 位連署者中有 61 位由這批信觸發,但行動者不在收件名單上。成因無法判定(可能是轉寄、捐款時填了不同的電子郵件地址、或家戶共用)。這些是實質成果,計算單封信成效時應納入;只有在比較兩個分群時才需要排除。 Include off-list results when judging a send overall. Nine of 48 donations and 61 of 876 signatures were driven by these emails but came from people not on the send list. The cause cannot be determined — forwarding, a different address entered at donation, and household sharing are all consistent with the evidence. These are real results and belong in a send's total; exclude them only when comparing the two audiences.
  2. 把下一季的力氣放在選題目,不是選名單。同一群受眾內,不同主題的開信率從 9.32% 到 25.17%(2.7 倍);兩個受眾群之間只差 1.14 倍。 Spend next quarter on topic selection, not list selection. Within a single audience, open rate ranged from 9.32% to 25.17% across topics (2.7×); the gap between the two audiences is only 1.14×.
  3. 未捐款者不要用捐款筆數評分。改看點擊率、以及有多少人進入捐款者名單。以現在的量體,用捐款數評分等於用雜訊做決策。 Stop scoring the never-donated audience on gift counts. Judge it on click-through and on movement into the donor pool. At these volumes, gift counts are noise.
  4. 檢視傳統價值型名單的內容適配度。這群人開信率最高(20.35%)卻點擊率最低(0.284%)——他們願意讀,但這批題目沒有促成行動。 Review content fit for the traditional-values audience. Highest open rate (20.35%) but lowest click rate (0.284%) — they read, but these topics did not move them to act.
  5. 不要提高未捐款名單的寄送頻率。這段期間平均每人已收到 5.4 封,最弱的信件開信率只有 9.32%。提高頻率換來的是個位數的點擊,賭上的是所有未來活動都依賴的寄件信譽。 Do not increase sending frequency to the never-donated list. People already received 5.4 emails in this period and the weakest send opened at 9.32%. More frequency buys a handful of clicks and risks the sending reputation every future campaign depends on.

七項發現Seven findings

高信心 HIGH 連署信要用連署率評分,這 16 封信帶來 815 位連署者Petition sends must be scored on signatures: these 16 produced 815 attributable signers

連署信的目標是取得連署簽名,募款信的目標才是捐款,兩者要各用各的指標評分。以簽名衡量,這 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.

行動:連署信以連署率評分,募款信以捐款評分,不要互相套用。 Do: score petition sends on signature rate and fundraising sends on donations; do not apply one metric to the other.

高信心 HIGH 約 19% 的捐款與 7% 的連署來自寄送名單以外的人,成因無法判定About 19% of donations and 7% of signatures came from outside the send list; the reason cannot be determined

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.

行動:評估單封信的整體成效時,把這些名單外的成果一併計入;只有在比較兩個分群時才需要排除它們。 Do: include these off-list results when judging a send overall; exclude them only when comparing the two audiences against each other.

高信心 HIGH 是否捐過款幾乎不影響開信,所以它不是興趣指標Donor status barely changes opening, so it is not an interest signal

從未捐款者開信率 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.

行動:不要期待主旨或寄送時間能因捐款狀態而有不同表現。 Do: stop expecting subject lines or send timing to perform differently by donor status.

中信心 MEDIUM 已捐款者的點擊率高 4 倍,但這不等於「因為捐過款所以會點」Prior donors click four times more, but the gap has not been shown to be caused by donor status

點擊率 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.

行動:把這個差距當成「兩群該用不同的行動呼籲」的理由。分群本身的效果請看下一項發現。 Do: treat the gap as a reason to write different calls-to-action. The segmentation effect itself is the next finding.

中信心 MEDIUM 內容完全相同時,國際觀型名單的點擊率是傳統價值型的 2.3 倍With byte-identical content, the international-outlook list clicked 2.3× more than the traditional-values list

這 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.

行動:針對傳統價值型檢視題目與訴求框架。保留意見:這三個名單是 2026-06-10 手動建立的靜態名單,HubSpot 未保存分群邏輯,因此無法驗證每個人是依什麼規則被分進去的。 Do: review topics and framing for the traditional-values audience. Caveat: these three are manually built static lists created on 10 June 2026 with no selection rule stored, so the rule that assigned each person could not be verified.

中信心 MEDIUM 選題目對開信的影響,比選名單大一倍以上Topic choice swings opening more than audience segmentation does

只看未捐款那一群,在同一個名單內比較不同題目,開信率相差 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.

低信心 LOW 捐款筆數不足以在兩群之間做統計比較(這是樣本量問題,不是成績好壞的判斷)Donation counts are too sparse to compare the two audiences statistically — a sample-size limit, not a judgement on performance

本項僅涉及「能否用捐款數比較兩群」,不涉及捐款成績的好壞——本報告未取得歷史基準,因此不對捐款表現做任何評價。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.

行動:捐款成績以整季彙總呈現,不要逐封看。 Do: report donations pooled across a full quarter, never per send.

兩群總計The two audiences, totalled

群組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,102258,62149,63119.19%86,83942.8%6710.259%1.35%2900.133%68
已捐過款(ebull)Already donated 95,99295,70120,96521.91%35,53341.0%9911.036%4.73%5250.652%619

開信與點擊為「每封信內去重後的人次」加總,只能作為比率的分子,不能解讀成有多少人——全期間實際只觸及 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.

三個名單 × 捐款狀態Three lists × donor status

「開信數(真人)」已排除機器產生的開信,與 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.

逐封信明細Send-by-send detail

捐款欄位淡化顯示,提醒該數字樣本數過小、不應單獨解讀。連署類信件的捐款為零屬正常,其成效請看右側的連署欄位;募款信則相反,連署欄位顯示「—」表示不適用。 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.

兩種立場的取捨(分析者自我對照,非他人審閱)Two opposing readings, weighed by the analyst — not an external review

為了避免只從單一角度解讀,分析過程中刻意用兩種會彼此衝突的立場檢驗結論:募款端(重視捐款者價值與活動組合)與郵件營運端(重視名單健康與量測可信度)。這是分析時的自我對照,不是由兩位同事審閱。兩種立場對數字本身沒有異議,但對「下一步該做什麼」得不出一致答案,兩種說法都列在下面供判斷: 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:

  • 偏向募款的讀法是邊做邊學:保留兩群受眾,把未捐款群改用點擊率評分,下一季開始有意識地測試題目,因為題目的影響(2.7 倍)比受眾差異(1.14 倍)大。 The fundraising reading: keep running and start learning now. keep both audiences, score the never-donated group on clicks, and begin deliberate topic testing next quarter, because the topic swing (2.7×) exceeds the audience gap (1.14×).
  • 偏向營運的讀法是先停下來修:在歸因視窗屆滿前不發布數字,未捐款名單的寄送頻率維持不動,把這整件事視為量測修復而非分群成果。 The operations reading: stop and repair first. publish nothing until the attribution window closes, freeze cadence on the never-donated list, and treat this as measurement remediation rather than a result.

現有資料無法判定哪一種比較對。要解決這個分歧需要三樣東西:每位收件人的加入名單日期與同意時間(用來檢驗營運端提出的替代解釋)、點擊端的機器行為檢查、以及一次帶有隨機保留組、且落地追蹤正常運作的活動。 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.

已知盲點Known blind spots

  • 捐款金額與終身價值:未量測。本次只計筆數。Gift amounts and lifetime value: not measured. Counts only.
  • 因果關係無法建立。19 封信觸及 66,114 人、平均每人 5.4 封,各封信不是獨立樣本,逐封的 38 列不能當成 38 個獨立觀察值。 No causal claim is possible. 19 sends reached 66,114 people at 5.4 emails each; sends are not independent samples and the 38 rows must not be treated as 38 observations.
  • 時間趨勢不可讀。較晚寄出的信累積時間較短,數字被低估的程度不一,任何「越後面越差」的觀察都可能是量測時點造成的。 Time trends are unreadable. Later sends have had less time to accumulate engagement, so any apparent decline is partly an artefact of the extraction date.
  • 名單外行動的成因:無法判定。可以看到名單外的人完成了捐款或連署,但無法分辨是轉寄、同一人使用不同電子郵件地址、還是家戶共用,也無法得知信件實際被轉寄給多少人。Why off-list actions happen: cannot be determined. Off-list donations and signatures are visible, but forwarding, one person using a second address, and household sharing cannot be told apart, nor is the true extent of forwarding measurable.
  • 未捐款者是否後來透過其他管道捐款:未量測。Whether never-donated recipients later gave through another channel: not measured.
  • 所有數字仍在累加。5 月 29 日寄出的信在 7 月 20 日仍在產生開信事件。本報告是 2026-07-21 的快照。 All figures are still accruing. The 29 May send was still registering opens on 20 July. This is a snapshot as of 21 July 2026.
  • 三個名單的分群規則無法驗證——手動建立的靜態名單,系統未保存篩選邏輯。 The three lists' selection rule could not be verified — manually built static lists with no stored filter.

名詞與判定規則Definitions

  • 「未曾捐款」的判定:以寄信當天為準,首次捐款日在寄信日當天或之後,或沒有首次捐款日且歷史捐款次數為零。用「當天或之後」而非「之後」,是因為首次捐款日只有日期沒有時間;若用「之後」,當天被這封信促成首次捐款的人會被誤判成原本就是捐款者,正好把我們要量的效果抹掉。 "Never donated" test: first-donation date on or after the send day, or no first-donation date and zero lifetime donations. "On or after" rather than "after" because the date carries no time of day; using "after" would file someone converted by that very email as a pre-existing donor, erasing the effect being measured.
  • 為什麼不直接用現有的捐款者分類欄位:那個欄位描述的是「今天」。凡是因為這批信而首次捐款的人,今天已經不在未捐款分類裡,直接使用會把成績算到錯的那一群。 Why the current donor-classification field was not used: it describes today. Anyone who first gave because of these emails has already moved out of the never-donated category, so using it would credit the wrong group.
  • 定期定額只在首次扣款計一次。同一筆定期定額的後續每月扣款不帶行銷來源標記,實測 100% 為空值。 Recurring gifts counted once, at the opening charge. Later monthly charges of the same commitment carry no campaign tagging — verified 100% empty.
  • 捐款歸因:信件寄出後 30 天內、且捐款紀錄帶有該封信專屬追蹤參數者。只計入實際入帳(狀態為已處理且金額大於零),退款不計。 Donation attribution: donations created within 30 days of the send carrying that send's own tracking parameter. Settled gifts only (processed status, positive amount); refunds excluded.
  • A/B 測試信件 A、B 版合併計算。該設定是先以 20% 名單分兩版測試、4 小時後由開信率決勝,勝出版再寄給其餘 80%,因此兩版寄送量本就不對等,分開比較沒有意義。 A/B tested sends have both versions merged. The test sends two versions to 20% of the list, picks the winner on open rate after four hours, then sends it to the remaining 80% — so the two versions' volumes are inherently unequal and comparing them separately is meaningless.
  • 所有日期先換算為台灣時間再取日。捐款時間以世界標準時間儲存,台灣傍晚之後的捐款在標準時間會落在前一天。 All dates converted to Taiwan time before taking the day. Donation timestamps are stored in universal time, where a Taiwan evening gift falls on the previous day.

資料可信度Data confidence

寄送與送達數字已與 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.

每個數字是怎麼來的How every number was produced

本頁假設讀者手上沒有任何本機檔案,從零開始也能重現全部數字。 This section assumes the reader has no local files and can reproduce every figure from scratch.

1. 存取環境1. Access required

  • 電子郵件平台(HubSpot,台灣所屬 portal):需要一組具備行銷內容讀取與聯絡人讀取權限的私有應用程式權杖。向團隊的密碼保管處索取,勿寫死於程式中。 Email platform (HubSpot, the Taiwan portal): a private-app token with marketing-content read and contact read scopes. Request it from the team's secret store; never hardcode it.
  • 捐款系統(Salesforce 正式環境):需可執行唯讀查詢的帳號。執行任何查詢前務必先確認連到的組織代號正確——命令列別名可能在背景被重新綁定到另一個環境。 Donation system (Salesforce production): an account able to run read-only queries. Always confirm the organisation ID before querying — command-line aliases can be silently rebound to a different environment.

2. 三個資料來源2. The three sources

  • 收件人層級互動事件:電子郵件平台的逐筆事件介面,一位收件人一個事件一列。注意信件編號與事件查詢用的活動編號不是同一組,須先由信件記錄的活動編號清單取得。聚合統計介面只給整封信總數,無法依任何屬性拆分,因此不能用。 Recipient-level engagement events: the platform's per-event endpoint, one row per recipient per event. Note the marketing-email ID and the event-API campaign ID are different identifiers; resolve the latter from the email record first. The aggregate statistics endpoint gives whole-email totals only and cannot be split by any property, so it is unusable here.
  • 收件人的捐款歷史:以電子郵件地址批次讀取聯絡人的首次捐款日與歷史捐款次數。 Recipients' donation history: batch-read contacts by email address for first-donation date and lifetime donation count.
  • 捐款紀錄:捐款物件本身即帶有行銷來源參數欄位,且定期定額與單筆的判定欄位也在同一筆上。 Donation records: the donation object itself carries the campaign-tracking fields, and the recurring-versus-single flags sit on the same row.

3. 逐號對照:每個數字的出處3. Number-by-number lineage

數字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%

4. 會讓重算出錯的陷阱4. Pitfalls that will break a recomputation

  • A/B 測試信件的名稱前面帶有版本代號。平台把版本代號直接寫進信件名稱,變成「(A) 信件名」與「(B) 信件名」兩筆。若用「名稱開頭是 tw-」之類的條件過濾,會把所有 A/B 信件整批漏掉——這個錯誤在本次分析中真的發生過一次,一度誤判 9 封信不存在。 A/B tested sends carry a version marker at the front of their name. The platform writes it into the name itself, producing "(A) name" and "(B) name". Filtering on a name prefix silently drops every A/B send — this actually happened during this analysis and briefly produced a false conclusion that 9 sends did not exist.
  • 信件列表預設隱藏已封存的信件。查詢「某封信是否存在」時務必包含已封存項目。 The email list endpoint hides archived emails by default. Include archived records when checking whether a send exists.
  • 行銷活動參數(utm_campaign)無法辨識是哪一封信,所有單次發送都塌縮成同一個值。要用行銷內容參數(utm_content)。 The campaign parameter cannot identify a send — every single-send collapses to one generic value. Use the content parameter.
  • 信件名稱裡的日期不可信。本批有四封信的名稱年份寫錯一年,也常與實際寄送日差一天。一律以系統記錄的寄送時間為準。 Dates inside send names are unreliable. Four sends here have the wrong year in the name, and names are often a day off. Always use the recorded send timestamp.
  • 開信必須排除機器產生的事件,否則會高估約 73%。事件本身帶有一個布林旗標標示這件事,使用該旗標即可重現平台介面的數字。 Opens must exclude machine-generated events or they overstate by about 73%. Each event carries a boolean flag for this; using it reproduces the platform's on-screen figures.
  • 逐封去重的人次相加不等於人數。相加結果會超過實際觸及人數,只能當比率的分子。 Per-send deduplicated counts do not sum to a headcount. The sum exceeds the number of people actually reached; use only as rate numerators.
  • 「這是不是首次定期定額」的欄位是陷阱——它標示的是「這是不是這位支持者的第一個定期定額」,不是「這是不是這個定期定額的第一筆扣款」。要用母記錄的首次成功捐款日判定。 The "first recurring donation" flag is a decoy — it marks whether this is the supporter's first-ever recurring commitment, not which charge within it is the first. Use the parent record's first-successful-donation date.
  • 時區。捐款時間以世界標準時間儲存,但捐款日期欄位是當地日期。不先統一換算會讓接近午夜的捐款被歸到錯誤的日期,進而分錯組。 Time zones. Donation timestamps are in universal time while date fields are local. Not normalising first will misfile gifts made near midnight and therefore misclassify those donors.

5. 十九封信的完整識別資料5. Full identifiers for the nineteen sends

重現時的起點。信件編號用於取得信件內容與寄送時間;活動編號用於查詢逐筆互動事件(兩者是不同的識別碼);追蹤碼用於比對捐款與連署。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-29petition-energy-ai_cake_international412332026092137017961113
2026-06-03petition-climate-antarctica_hotter_international414859316410137404363113
2026-06-03petition-climate-antarctica_hotter_traditional414859319499137406339113
2026-06-03petition-climate-antarctica_hotter_supervision414770668775137406641113
2026-06-11petition-oceans-babyfish_international419220717767,419220890819138094384,138094385,13809438620185
2026-06-11petition-oceans-babyfish_traditional419221280988,419221363954138095525,138095526,13809552720185
2026-06-11petition-oceans-babyfish_supervision419221169365,419221001419138096186,138096187,13809618820185
2026-06-12donation-plastics-resource_circulation_promotion_act_international419478832355138178783113
2026-06-12donation-plastics-resource_circulation_promotion_act_traditional419481563342138178798113
2026-06-12donation-plastics-resource_circulation_promotion_act_supervision419478927604138179038113
2026-06-18petition-climate-dalinpo_international422440354015138650476113
2026-06-18petition-climate-dalinpo_traditional422582832347138650641113
2026-06-18petition-climate-dalinpo_supervision422533062856138650692113
2026-06-26petition-oceans-mpa_international426875212018,426875183331139306291,139306292,13930629320185
2026-06-26petition-oceans-mpa_traditional426875301054,426920875249139306719,139306720,13930672120185
2026-06-26petition-oceans-mpa_supervision426875302111,426875321537139306922,139306923,13930692420185
2026-07-03petition-plastics-nurdles_forum_international430899306708,430947523791139919992,139919993,13991999420185
2026-07-03petition-plastics-nurdles_forum_traditional430899441871,430947631306139920962,139920963,13992096420185
2026-07-03petition-plastics-nurdles_forum_supervision430899487959,430947639544139920971,139920972,13992097320185

6. 逐步重現指令6. Step-by-step commands

以下每一步都可直接執行,不需要任何本機既有檔案。權杖請向團隊的密碼保管處索取,設為環境變數 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"

四種事件各拉一次:SENTDELIVEREDOPENCLICK。回應含 hasMoreoffset,需分頁直到取完;若 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__cContact.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.

7. 分群與彙總的完整規則7. The classification and aggregation rules in full

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%.