統計上線後長期要守住的是四件事:配額不被打爆、髒資料不污染統計、隱私邊界守住、以及在量成長到 Sheets 撐不住前認出訊號。這一篇把這四件事各給一個務實的判斷與做法,收在「什麼時候該換更重的工具」。

配額實際碰撞會怎樣

免費配額的三條線(單次 6 分鐘、同時併發 30、觸發器每日 90 分鐘,見執行配額)在正常個人 blog 幾乎碰不到,但知道碰到時的症狀有助於診斷。

同時併發 30 是接收 beacon 最可能先碰的線:某篇文章瞬間爆紅、一秒內湧入超過 30 個瀏覽,第 31 個以後的 doPost 會拿到錯誤、那幾筆瀏覽漏記。症狀是「爆量時段的統計數字明顯偏低」。單次 6 分鐘 接 beacon 用不到(寫一列幾百毫秒),但彙總 trigger 全表掃描在資料很多時會逼近,症狀是彙總 trigger 開始逾時失敗。每日 90 分鐘 是所有觸發器加總,正常一天彙總一次遠遠用不完,除非彙總寫得很沒效率或觸發器被重複註冊。

碰到併發上限的處理不是「調高配額」(個人帳號調不了),而是「削峰」——beacon 本來就是可容忍少量遺失的統計,爆量漏記幾筆不影響「哪篇熱門」的判斷;真的很在意,訊號就指向遷移到吞吐更高的 Workers。

濫用防護與資料乾淨度

公開端點的騷擾型風險(髒資料、配額消耗,見部署與存取權限),對應兩個層級的防護。

過濾自己的瀏覽是最先該做、報酬最高的一項——不是防外人,是防站主把開發與自我瀏覽混進統計。前端的 hostname guard 已經擋掉本機預覽(見前端 beacon);要進一步排除「在正式站上自己一直重整」,可以在瀏覽器存一個退出標記、beacon 讀到就不送,或彙總時依訪客識別碼過濾。兩者的取捨在於前者省下配額與列數、後者保留資料可回頭校正,而它們可以並用。退出標記的實作、邊界與各瀏覽器的差異見訪客識別與 opt-out——存標記的版本同時也是給讀者的退出入口,適合公開在網站說明裡。

擋隨手亂打用一個約定 token:前端 payload 放一個固定字串、doPost 檢查對不上就丟掉不寫。這能擋掉不知情的爬蟲與隨手 POST,成本很低。但要誠實看待它的邊界:token 也在 client JS 裡看得到,鐵了心要灌的人抓一下原始碼就有——所以 token 是「擋雜訊」不是「擋攻擊」。對個人 blog,擋雜訊通常就夠了;真的被針對性灌爆,那是遷移到有更多防護手段(rate limiting、驗證)的平台的訊號。

隱私與 PII 邊界

這套統計在隱私上的立足點是根本不收集個人身分資訊,這讓它天然乾淨。具體有三條線值得明確守住:

  • 不記 IP:Apps Script 的 web app 收不到訪客 IP,所以就算想記也記不到——這反而是好事,少一個 PII 來源。
  • 裝置只送粗標籤mobile / tablet / desktop 三選一足以回答「用什麼裝置看」,不送完整 userAgent(那帶版本等可組成瀏覽器指紋的細節)。
  • 不放可識別個人的欄位:這一章講到的 payload 只有路徑、來源、語言、裝置,沒有任何綁到個人的東西。模組六會加上兩個隨機識別碼——它們同樣不含個人資訊,但確實會被寫進瀏覽器的儲存空間,下一段的同意機制討論就是為此。

不收 PII 讓「處理個資刪除請求」這類負擔不會發生,但同意機制的判斷不是由 PII 決定的。歐盟 ePrivacy 指令第 5(3) 條管的是「在使用者終端設備儲存或讀取資訊」這個動作本身,與存的內容是否為個資無關——市面上宣稱免同意橫幅的分析服務(Plausible、Fathom)之所以能這樣宣稱,正是因為它們完全不在瀏覽器儲存任何識別碼。模組六的訪客識別localStorage 存了兩個,因此那一步跨過了這條線。

實務上個人網站的合規風險與商業追蹤網路不在同一個量級,但這是取捨不是豁免。想更保守,可以尊重瀏覽器的 Do Not Track 訊號(navigator.doNotTrack === "1" 時不送 beacon),或者不存識別碼、只做頁面計數。

遷移訊號:什麼時候該離開 Sheets

Apps Script + Sheets 是為「量小、要人直接看試算表」設計的(選型見模組零)。以下訊號累積出現時,代表量已經長到該換更重的工具:

  • 爆量時段頻繁撞併發上限、漏記明顯到影響判斷。
  • 彙總 trigger 即使分表、只讀增量後仍逼近 6 分鐘。
  • raw log 的 cell 數逼近試算表上限(見資料模型與容量邊界)。
  • 需要的查詢已經超出試算表能力(多維交叉、即時儀表板)。

遷移的方向是把接收端換成 Cloudflare Workers、儲存換成 D1(免費 SQLite):吞吐與查詢能力遠高於 Sheets,代價是失去「打開試算表就能看」的便利、要自己做查詢介面。判準用一句話收斂:當「Sheets 即儀表板」的便利已經被它的容量與吞吐限制抵銷,就是遷移的時機——在那之前,簡單版一直是對的選擇。

管線完成之後

到這裡,一套不租主機、資料存在自己試算表裡的流量統計已經建好,而且知道它的配額邊界、防濫用手段與遷移訊號在哪。

管線能跑,不代表資料讀得出意義。 收到的來源網址大量空白、任兩列之間看不出是不是同一個人、真人與機器抓取混在一起——這些問題只在真實流量打進來之後才浮現,處理方式見模組六:收到資料之後。那一章會在 payload 上增加欄位,本章的配額判斷也會因為列數翻倍而需要重算。

想把同一套膠水模式套到別的靜態站或別的工具,回模組零的選型重新判斷即可。