一家 38 家門市的連鎖餐飲打來求救:官網與 App 的「找附近門市」上線第二個月,Google Cloud 帳單 5,290 美元,約新台幣 16.9 萬。原因只有一個——前端每次地圖拖曳、每次輸入關鍵字,都直接打一次 Places API Nearby Search。Google 官方價目表上,Nearby Search Pro 每月僅 5,000 次免費,超過後每千次 32 美元,是 Dynamic Maps(每千次 7 美元)的四倍以上。地圖不貴,貴的是沒人管的呼叫次數。
適用情境 × 不適用情境
值得投入
- 據點超過 10 家且跨縣市,使用者真的要「最近的三家」
- 外送範圍因店而異,需地理圍欄判斷送不送
- 常有新開、搬遷、臨時公休,需後台自助維護
- 官網與 App 共用同份資料,每店一個可索引網址
先別做
- 只有 1–3 家店:一段 Maps Embed(官方列為無上限免費 SKU)就夠
- 純線上服務,或清單一年改不到一次
- 主檔沒整理:地址寫法不一、缺經緯度、時間是文字
- 預算低於 NT$30,000:先做靜態據點列表頁
四種圖資方案的取捨
| 方案 | 免費額度 | 超額價 | 取捨 |
|---|---|---|---|
| Google Maps Platform | 載入與編碼各 10,000 次/月,Nearby Search Pro 僅 5,000 次 | 載入 $7/千、編碼 $5/千、Nearby Search Pro $32/千 | POI 精度最高,但單價落差大 |
| Mapbox | 網頁載入 50,000 次、Temporary Geocoding 100,000 次 | 載入 $5/千起(降至 $2.50)、編碼 $0.75/千 | 自訂樣式佳,POI 密度較低 |
| MapTiler Cloud | Free 方案 5,000 sessions、1,000 搜尋 sessions(非商用) | Flex $30/月含 25,000 sessions,超額 $2.50/千 | 預算敏感者首選,商用需付費 |
| 自架 OSM+Nominatim | 無 API 費用 | 伺服器估算 NT$4,000–8,000/月 | 資料可落地,維運工時高 |
關鍵是流量會不會越過免費額度。另外公用的 nominatim.openstreetmap.org 在 OSMF 使用政策中明訂絕對上限每秒 1 次請求,且禁止自動完成與系統性查詢,不能當正式服務。
完整流程拆解
- 階段一・資料治理(3–5 天):收齊主檔,欄位含店名、地址、經緯度、電話、每週時段與例外公休。交付 CSV 範本與欄位字典。工具:Google Sheets、Notion。
- 階段二・批次地理編碼(2 天):用 Laravel Artisan 指令跑 Geocoding 寫回 POINT 欄位,複核低信心門牌。交付補齊報表。工具:Google Geocoding API(前 10,000 次免費)。
- 階段三・後端查詢(5–7 天):MySQL 8 的 POINT 欄位加 SPATIAL INDEX,先 bounding box 粗篩再以 ST_Distance_Sphere 排序;營業中判斷在 Asia/Taipei 時區處理跨午夜;第三方呼叫走代理並快取。交付 nearby API。工具:Laravel、Redis、Scribe。
- 階段四・前端與降級(5–8 天):官網用地圖+列表雙欄,Flutter 端用 google_maps_flutter 或 flutter_map;導航以 Maps URLs deep link 交給原生地圖。交付原型與清單。工具:Figma、Cloudflare。
真實成本完整拆解
- ScriptWalker 門市據點模組 NT$45,000 起:地圖+列表、最近 N 家、營業中篩選、後台匯入
- 地理圍欄多邊形編輯器 NT$35,000 起;Flutter App 地圖畫面 NT$30,000 起
- 隱藏費用一・圖資月費:Google Starter 訂閱每月 100 美元含 5 萬次呼叫,約 NT$3,200
- 隱藏費用二・資料維運:營業時間異動每月約 1–2 小時
- 隱藏費用三・自架成本:伺服器估算每月 NT$4,000–8,000 加更新工時
- 隱藏費用四・監控:Cloudflare 速率限制、UptimeRobot 與預算警示約 4 小時
實施真相 vs 客戶想像
- 以為地址丟進去就有經緯度;實際門牌寫法不一,38 家店常有 3–6 家要人工校正。
- 以為地圖是一筆費用;實際載入、地點搜尋、地理編碼、路線是四個獨立 SKU,各有額度與單價。
- 以為營業時間是一欄、外送範圍畫個圓就好;實際要處理午休斷點、跨午夜與颱風公休,而半徑 3 公里可能跨過沒橋的河。
六個最常見的陷阱
- API Key 沒設限制:外流即被盜刷。解法:Web Key 綁 HTTP referrer、Android 綁簽章、iOS 綁 bundle id,並在 Cloud Console 設每日配額上限。
- 每次拖曳就打一次搜尋:解法:改查自家資料庫,第三方 API 只在必要時呼叫,前端加 300–500 毫秒 debounce。
- 把公用 Nominatim 當正式服務:解法:自架或改用商用供應商並快取。
- 沒有降級方案:額度用盡整頁空白。解法:載入失敗退回靜態地圖。
- 自己算路線:解法:導航用 deep link 交給原生 App;只有多點派送才需 Routes 或自架 OSRM。
- 沒有預算警示:解法:Cloud Billing 設 50%/80%/100% 通知,每週看 SKU 明細。
成功指標與 90 天路線圖
- 30 天:看每工作階段的 API 呼叫次數、地圖載入成功率與查詢到店轉換率,把單人搜尋壓到 3 次以內。
- 60 天:比對門市頁自然搜尋曝光與導航點擊,找出搜尋量高卻沒據點的區域。
- 90 天:算出每千次工作階段的圖資成本,決定 pay-as-you-go 或改訂閱制;外送範圍換成多邊形並回測拒單率。
決策清單
- ☐ 據點超過 10 家
- ☐ 門市主檔完整、地址格式可批次編碼
- ☐ 使用者真的需要「離我最近」
- ☐ 需要營業中判斷或外送地理圍欄
- ☐ 官網與 App 共用同份據點資料
- ☐ 可估算每月載入與搜尋次數
- ☐ 已決定 API Key 限制與配額
- ☐ 已設定預算警示與負責人
- ☐ 已規劃降級畫面並有人每月維護資料
- ☐ 每家門市需獨立網址做 SEO
常見問題
一定要用 Google Maps 嗎?
不一定。只要顯示自家圖釘與最近 N 家,Mapbox 或 MapTiler 的免費額度通常就夠。常見混搭是底圖用 MapTiler,地址搜尋用 Google Geocoding。
每月 200 美元的免費額度還在嗎?
不在了。Google 於 2025 年 3 月改成每個 SKU 各自的額度:Essentials 每月 10,000 次、Pro 5,000 次、Enterprise 1,000 次,見 官方定價總覽。多 SKU 混用必須逐項試算。
多久可以上線?
資料齊全時官網版約 3 週,含 Flutter App 與地理圍欄約 5–6 週。最常延誤的不是開發,是主檔的時間與地址校正。
額度用完或服務中斷怎麼辦?
門市清單走自家 API 與本地快取,地圖改用靜態地圖(前 10,000 次免費、之後每千次 2 美元)或地址卡片,導航按鈕仍可用 deep link。
下一步
把門市數量、月訪客量、是否需要外送範圍告訴我們,我們回一份雙方案的選型試算與時程表。門市據點模組 NT$45,000 起,含首月呼叫次數健檢。
- Email:[email protected]
- 電話:0916-224-047
- LINE:@ufv9089p