跳到內容

Google Ads 品質分數卡在 3,查到最後是到達頁沒吃到快取

整理日期:2026-07-15

一個服務業網站,所有 Google Ads 廣告都導到同一個到達頁。品質分數長期卡在 3,實付的單次點擊偏高,等於有一部分預算一直花在貴的點擊上。

打開品質分數的細項看,線索很明顯:最花錢的那批通用字,「到達網頁體驗」全部低於平均;「廣告關聯性」反而高於平均。

這個組合會說話:不是文案問題,是頁面本身。而且所有廣告都指向同一頁——修好這一頁,所有關鍵字一起受惠。

實測這一頁:伺服器回應(TTFB)0.84 秒。每個點廣告進來的人,都要先白等這 0.84 秒。

第一個反射動作通常是「WordPress 太慢、主機太爛」。這次不是。

看回應標頭(header)就能拆開:

  • 標頭裡有 x-cache-age——主機端的快取(CLP Varnish)其實有在工作,HTML 不是每次重新產生。主機沒有慢。
  • 但 WordPress 同時送出 cache-control: no-store——等於告訴 Cloudflare「這頁不要存」。Cloudflare 就真的不存(cf-cache-status 顯示 DYNAMIC)。

結果就是:每一次廣告點擊,Cloudflare 都要從離訪客最近的節點,繞回主機重抓一次 HTML。那 0.84 秒幾乎全花在這趟來回。不是主機慢,是「每次都回主機」這件事慢。

那個 no-store 是哪來的?站上同時開著兩個快取外掛(CLP Varnish + WP-Optimize)。兩套設定互相打架,是這種標頭最常見的來源。

另外一半的問題是前端資源太重:字型載了六種字重(設計實際用不到那麼多)、腳本從外部網域阻塞載入。圖片反而沒問題。這一半這次先不動,屬於下一階段。

在 Cloudflare 加一條快取規則(Cache Rule),只圈這一個到達頁,不動全站,隨時可以停用回滾。三個設定,缺一個就白做:

  1. 匹配網址用萬用字元收尾:https://你的網域/到達頁路徑/*。結尾那個 *,是讓帶參數的廣告網址也對得上。
  2. 邊緣 TTL 選「忽略 cache-control 標頭並使用此 TTL」,設 2 小時。這步是關鍵——WordPress 在送 no-store,不蓋掉它的話,規則加了 Cloudflare 還是不存。
  3. 快取索引鍵打開「忽略查詢字串」。這是最容易漏的一步。每個廣告點擊帶的 gclid 都不一樣,不忽略的話,Cloudflare 會把每個點擊當成不同網址、每次都未命中——對真正要救的廣告流量完全沒效。開了之後,所有 ?gclid=… 共用同一份快取。

(快取索引鍵裡「指定包含/排除特定參數」是付費功能,這裡用不到——免費的「忽略查詢字串」開關就夠。)

廣告追蹤不受影響:gclid 是頁面上的程式在瀏覽器裡從網址列讀的。Cloudflare 發同一份 HTML 給大家,不會改到每個人的網址列,GA4、GTM 都照常運作。

維運提醒:之後改這頁的內容,記得回 Cloudflare 對這個網址清一次快取。忘了也最多舊 2 小時。

改完後實測同一頁:

改之前改之後
cf-cache-statusDYNAMIC(不快取)HIT
TTFB0.84 秒0.04 秒

帶 gclid 的網址也回 HIT——代表「忽略查詢字串」有生效,廣告流量真的吃到快取了。

品質分數不會馬上動。Google 要重新爬、再累積一兩週的流量,才會重評到達網頁體驗。所以規則做完先別急著下結論,排一個兩週後回頭看分數的行程。

  • 品質分數的三個細項(預期點閱率/廣告關聯性/到達網頁體驗),哪一項低於平均。
  • 到達頁的回應標頭:cf-cache-status 是 HIT 還是 DYNAMIC、cache-control 有沒有 no-store、有沒有主機端快取的痕跡。
  • 站上開了幾個快取外掛。
  • 廣告網址帶哪些參數——gclid 這種每次都不同的,就是快取未命中的元兇候選。

TTFB 慢,先確認是不是「邊緣沒快取、每次回主機」,再去怪程式或資料庫。標頭一看就知道。

自己顧的話,照上面的順序查一次。要找人看的話,先把這四項整理好再問,會快很多。