Branch8

HubSpot 香港 Sales Hub 報價單自動化設定教學

Matt Li
September 12, 2026
12 mins read
HubSpot 香港 Sales Hub 報價單自動化設定教學

Key Takeaways

  • 報價單自動化需 Sales Hub Professional 以上,並使用 Private App token
  • Quote 金額由關聯 Line Items 加總,非複製 Deal amount
  • Association type ID 必須用 API 查證,不要照抄範例數字
  • 繁中 PDF 需自行上傳 CJK 字型並設定 fallback stack
  • LLM 跟進草稿應避免傳送個人資料,符合香港私隱條例

在 HubSpot Sales Hub 設定報價單自動化,核心是四步:整理 Product Library 與多幣別、建立自訂 Quote Template、用 Workflow 的 Custom Code Action 呼叫 Quotes API 自動生成報價單,再接上電子簽署與收款。香港團隊需額外處理繁中欄位、HKD/USD 匯率與審批權限。

為什麼香港與跨境團隊特別需要報價單自動化

香港、新加坡、台灣的 B2B 銷售團隊有一個共同特徵:單一業務員往往同時服務多個市場。一張報價單可能要用繁體中文寫給香港客戶、英文寫給澳洲總部、附上 HKD 與 USD 兩種幣別,還要符合不同地區的稅務標註習慣(香港無 VAT/GST、新加坡有 GST、澳洲有 GST)。

手動處理的結果是:業務在 Excel 改範本、複製貼上產品價格、PDF 匯出、Email 寄出,而 CRM 裡完全沒有這張報價單的紀錄。等到要做 pipeline forecast 時,Deal amount 與實際報價金額對不上。

HubSpot 的 Quotes 物件(object type quotes)是 CRM 內的一級物件,可以透過 Workflows、API 與 Associations 完全自動化。根據 HubSpot 開發者文件,Quotes API 支援建立、關聯 Deal / Line Items / Contacts,並可設定報價單狀態與有效期。這代表報價單可以變成 pipeline 的一部分,而不是 pipeline 外的附件。

開始前需要準備什麼

在動手之前,先確認以下條件到位。缺一項都會在中途卡住。

訂閱與權限要求

  • Sales Hub Professional 或 Enterprise:Workflows 的 Custom Code Action 與 Quote Approvals 屬於 Professional 以上功能。Starter 只能手動建立報價單。
  • Super Admin 權限:設定 Private App token、自訂物件屬性、Quote Template 都需要。
  • Private App Access Token:到 Settings → Integrations → Private Apps 建立,勾選 crm.objects.quotes.writecrm.objects.deals.readcrm.objects.line_items.writecrm.schemas.quotes.read。HubSpot 文件明確指出 API Key 已於 2022 年停用,現在一律使用 Private App token 或 OAuth。

資料面準備

  1. Product Library 已建立:每個 SKU 要有 namehs_skupricehs_cost_of_goods_sold。跨境團隊建議額外加一個自訂屬性 region_availability(HK / SG / TW / AU)。
  2. 多幣別已啟用:Settings → Account Defaults → Currencies。設定 Company currency(多數香港公司選 HKD),再新增 USD、SGD、TWD、AUD。HubSpot 會以你設定的匯率換算 Deal amount 到公司幣別。
  3. Deal Pipeline 階段清晰:至少要有一個明確的「Quote Sent」或「報價中」階段作為觸發點。
  4. 繁中欄位命名一致:如果業務要看中文介面,在屬性的 label 用繁體中文,internal name 保持英文(例如 label「客戶採購編號」/ internal customer_po_number)。混用中文 internal name 會讓 API payload 難以維護。

Ready to Transform Your Ecommerce Operations?

Branch8 specializes in ecommerce platform implementation and AI-powered automation solutions. Contact us today to discuss your ecommerce automation strategy.

第一步:用自訂屬性承載報價單的在地資訊

香港與 APAC 報價單常見的額外欄位,在 Quotes 物件上建立:

  • quote_language(下拉:繁體中文 / English / 简体中文)
  • payment_terms_local(下拉:預付 / 貨到 30 日 / 貨到 60 日)
  • delivery_incoterm(EXW / FOB / DDP)
  • company_br_number(商業登記號碼,香港客戶常要求列在報價單上)

用 API 建立屬性的範例:

1curl -X POST \
2 'https://api.hubapi.com/crm/v3/properties/quotes' \
3 -H "Authorization: Bearer $HUBSPOT_PRIVATE_APP_TOKEN" \
4 -H 'Content-Type: application/json' \
5 -d '{
6 "name": "quote_language",
7 "label": "報價單語言",
8 "groupName": "quoteinformation",
9 "type": "enumeration",
10 "fieldType": "select",
11 "options": [
12 { "label": "繁體中文", "value": "zh_hk", "displayOrder": 0 },
13 { "label": "English", "value": "en", "displayOrder": 1 },
14 { "label": "简体中文", "value": "zh_cn", "displayOrder": 2 }
15 ]
16 }'

預期回應:HTTP 201,回傳含 namelabeloptions 的 JSON。若收到 409,代表屬性名稱已存在,改用 PATCH。

第二步:建立支援繁體中文的 Quote Template

HubSpot 提供兩種範本路徑:內建的 Quote Themes(無需寫碼),以及 CMS 內的自訂 Quote Template(用 HubL 撰寫)。香港團隊通常在第二種才能滿足需求——因為要放商業登記號碼、雙語條款、以及公司印章圖檔。

在 Design Manager 建立一個新的 quote template,關鍵 HubL 片段如下:

1{% set lang = quote.quote_language|default('zh_hk') %}
2
3<h2>
4 {% if lang == 'en' %}Quotation{% else %}報價單{% endif %}
5</h2>
6
7<p>
8 {% if lang == 'en' %}Quote No.{% else %}報價編號{% endif %}:
9 {{ quote.hs_quote_number }}<br>
10 {% if lang == 'en' %}Valid Until{% else %}有效期至{% endif %}:
11 {{ quote.hs_expiration_date|datetimeformat('%Y-%m-%d') }}<br>
12 {% if lang == 'en' %}BR No.{% else %}商業登記號碼{% endif %}:
13 {{ quote.company_br_number }}
14</p>
15
16{% for item in line_items %}
17 <div class="line-item">
18 <strong>{{ item.name }}</strong> ({{ item.hs_sku }})<br>
19 {{ item.quantity }} × {{ item.price|format_currency(quote.hs_currency) }}
20 = {{ item.amount|format_currency(quote.hs_currency) }}
21 </div>
22{% endfor %}
23
24<p class="total">
25 {% if lang == 'en' %}Total{% else %}總計{% endif %}:
26 {{ quote.hs_quote_total|format_currency(quote.hs_currency) }}
27</p>

繁中字型的坑:HubSpot 的報價單 PDF 匯出若沒有明確指定 CJK 字型,繁體中文可能顯示為方框。在 template 的 CSS 加入 fallback stack:

1body, .line-item, .total {
2 font-family: "Noto Sans TC", "PingFang HK", "Microsoft JhengHei",
3 "Hiragino Sans GB", sans-serif;
4}

建議在 Design Manager 上傳 Noto Sans TC 的 WOFF2 子集(只含常用字),避免 PDF 生成時因外部字型載入逾時而 fallback。

Ready to Transform Your Ecommerce Operations?

Branch8 specializes in ecommerce platform implementation and AI-powered automation solutions. Contact us today to discuss your ecommerce automation strategy.

第三步:用 Workflow 自動建立報價單

這是整個流程的核心。目標:當 Deal 進入「Quote Sent」階段,系統自動抓取 Deal 上的 Line Items,建立一張草稿報價單,並關聯回 Deal 與主要聯絡人。

Workflow 架構

  1. Trigger:Deal-based workflow,條件為 Deal stage is Quote Sent(建議加上 Amount is knownAssociated line items is known 作為防呆)。
  2. If/then branch:依 Deal owner teamCountry/Region 分流,決定用哪一份範本與幣別。
  3. Custom Code Action:呼叫 Quotes API。
  4. Internal notification:通知 Deal owner 報價單已生成。

Custom Code Action 程式碼

HubSpot 的 Custom Code Action 支援 Node.js 20 與 Python 3.9。以下用 Node.js,並使用官方 @hubspot/api-client:

1const hubspot = require('@hubspot/api-client');
2
3exports.main = async (event, callback) => {
4 const client = new hubspot.Client({
5 accessToken: process.env.HUBSPOT_TOKEN
6 });
7
8 const dealId = event.object.objectId;
9
10 // 1. 讀取 Deal 與其 line items
11 const deal = await client.crm.deals.basicApi.getById(
12 dealId,
13 ['dealname', 'amount', 'deal_currency_code', 'closedate'],
14 undefined,
15 ['line_items', 'contacts']
16 );
17
18 const lineItemIds = (deal.associations?.['line items']?.results || [])
19 .map(r => r.id);
20 const contactIds = (deal.associations?.contacts?.results || [])
21 .map(r => r.id);
22
23 if (lineItemIds.length === 0) {
24 return callback({
25 outputFields: { status: 'SKIPPED', reason: 'NO_LINE_ITEMS' }
26 });
27 }
28
29 // 2. 建立報價單(草稿)
30 const expiry = new Date();
31 expiry.setDate(expiry.getDate() + 30); // 香港 B2B 常見 30 日有效期
32
33 const quote = await client.crm.quotes.basicApi.create({
34 properties: {
35 hs_title: `${deal.properties.dealname} — 報價單`,
36 hs_expiration_date: expiry.toISOString().split('T')[0],
37 hs_currency: deal.properties.deal_currency_code || 'HKD',
38 hs_language: 'zh-hk',
39 hs_status: 'DRAFT',
40 quote_language: 'zh_hk',
41 payment_terms_local: 'net_30'
42 }
43 });
44
45 // 3. 建立關聯:Quote ↔ Deal / Line Items / Contact
46 const assoc = async (toObject, toId, typeId) =>
47 client.crm.associations.v4.basicApi.create(
48 'quotes', quote.id, toObject, toId,
49 [{ associationCategory: 'HUBSPOT_DEFINED', associationTypeId: typeId }]
50 );
51
52 await assoc('deals', dealId, 64);
53 for (const liId of lineItemIds) {
54 await assoc('line_items', liId, 67);
55 }
56 if (contactIds[0]) {
57 await assoc('contacts', contactIds[0], 69);
58 }
59
60 callback({
61 outputFields: {
62 status: 'CREATED',
63 quoteId: quote.id,
64 quoteUrl: `https://app.hubspot.com/quotes/${event.portalId}/quote/${quote.id}`
65 }
66 });
67};

重要:association type ID 會隨物件組合不同而異。不要照抄上面的數字就上線,先用以下指令查詢你 portal 的實際值:

1curl -X GET \
2 'https://api.hubapi.com/crm/v4/associations/quotes/deals/labels' \
3 -H "Authorization: Bearer $HUBSPOT_PRIVATE_APP_TOKEN"

預期回應會列出 typeIdlabel。把對應數值填回程式碼。

Secret 管理:在 Custom Code Action 編輯畫面的左側「Secrets」區塊新增 HUBSPOT_TOKEN,不要把 token 硬寫進程式碼——Workflow 程式碼對所有 Super Admin 可見。

預期輸出與驗證

執行後到 Workflow 的 History 分頁,展開該次執行。成功時會看到 outputFieldsstatus: CREATEDquoteId。到 Sales → Quotes 應該看到一張狀態為「草稿」的報價單,金額與 Deal 一致。

第四步:設定報價單審批流程

跨市場團隊最容易出事的地方是折扣。香港業務給 15% 折扣、新加坡業務給 25%,總部要到季末才發現。

Sales Hub Professional 以上提供 Quote Approvals(Settings → Objects → Quotes → Approvals)。設定邏輯:

  1. 啟用 Approvals,指定審批人(建議用 Team 而非個人,避免人員離職卡流程)。
  2. 設定觸發條件——通常是報價單總額超過某個門檻,或折扣率超過標準。
  3. 折扣率不是內建屬性,需自行計算。在 Workflow 加一個 Custom Code Action:
1const listPrice = Number(event.inputFields.list_price_total || 0);
2const quoteTotal = Number(event.inputFields.hs_quote_total || 0);
3const discountPct = listPrice > 0
4 ? ((listPrice - quoteTotal) / listPrice) * 100
5 : 0;
6
7callback({
8 outputFields: {
9 discount_pct: Math.round(discountPct * 100) / 100,
10 needs_approval: discountPct > 15 ? 'YES' : 'NO'
11 }
12});

然後用 needs_approval 分支決定是否送審。這樣香港、台北、雪梨的團隊套用同一條規則,而審批人可以按地區分派——亞太時區覆蓋的好處在這裡很實際:香港下午送出的審批,新加坡或雪梨的主管在同一個工作日就能處理完。

Ready to Transform Your Ecommerce Operations?

Branch8 specializes in ecommerce platform implementation and AI-powered automation solutions. Contact us today to discuss your ecommerce automation strategy.

第五步:接上電子簽署與線上收款

電子簽署

HubSpot Quotes 內建 eSignature 功能(Sales Hub Professional 以上,有每月簽署次數配額,詳見 HubSpot 產品文件)。在報價單編輯流程的「Signature and payment」步驟勾選 E-signature 即可。

法律效力方面,香港《電子交易條例》(第 553 章)承認電子紀錄與電子簽署的法律地位,但條例對部分文件類型(例如遺囑、不動產轉讓)設有排除。一般商業報價單與服務協議通常不在排除範圍內,但簽署前建議由法務確認具體合約類型。新加坡的 Electronic Transactions Act、澳洲的 Electronic Transactions Act 1999 有類似結構但細節不同——跨境團隊不要假設一套流程通用。

收款

HubSpot Payments 目前的可用地區有限,香港帳戶通常走 Stripe 整合。啟用後,報價單可直接嵌入付款連結,客戶簽署後即時付款。

設定要點:

  • 在 Settings → Payments 連接 Stripe 帳戶,確認 Stripe 帳戶的結算幣別與報價單幣別一致,否則會產生額外換匯成本。
  • 若使用 HKD 以外幣別,先在 Stripe Dashboard 開啟對應幣別的 payout 設定。
  • 測試時用 Stripe 的測試卡號驗證整條流程,再切換到 live mode。

第六步:用 AI 加速報價後的跟進

報價單寄出後的沉默期是成交率殺手。這裡可以用 HubSpot Breeze(HubSpot 的 AI 功能組)或自建的 LLM 呼叫來自動化跟進內容。

一個實務做法:在報價單寄出後 3 天,若 hs_quote_status 仍為 PENDING_APPROVAL 或未被檢視,觸發 Workflow 產生一封個人化跟進草稿,存入 Deal 的 note,讓業務一鍵編輯寄出——而不是直接自動寄出。自動寄出的風險是語氣不對,特別是繁中商業書信的敬語層級很難靠模板拿捏。

Custom Code Action 中呼叫外部 LLM 的骨架:

1const res = await fetch('https://api.openai.com/v1/chat/completions', {
2 method: 'POST',
3 headers: {
4 'Authorization': `Bearer ${process.env.LLM_KEY}`,
5 'Content-Type': 'application/json'
6 },
7 body: JSON.stringify({
8 model: 'gpt-4o-mini',
9 messages: [{
10 role: 'user',
11 content: `以繁體中文商業書信語氣,為以下報價撰寫一封簡短跟進郵件草稿。\n客戶:${event.inputFields.company_name}\n報價金額:${event.inputFields.quote_total}\n報價日期:${event.inputFields.sent_date}\n不要誇大,不要催促,重點放在回答可能的疑慮。`
12 }]
13 })
14});
15const data = await res.json();
16callback({ outputFields: { draft: data.choices[0].message.content } });

資料保護提醒:把客戶資料送到第三方 LLM 前,確認符合香港《個人資料(私隱)條例》的六項保障資料原則,特別是原則 3(使用限制)。個人資料私隱專員公署已就 AI 使用發布指引。實務上建議只傳公司名稱與金額等業務資料,避免傳送聯絡人姓名、電話與電郵。

Ready to Transform Your Ecommerce Operations?

Branch8 specializes in ecommerce platform implementation and AI-powered automation solutions. Contact us today to discuss your ecommerce automation strategy.

常見問題排查

報價單建立成功但金額是 0

最常見原因是 Line Items 沒有正確關聯到 Quote。Quote 的總額是由關聯的 line items 加總,不是從 Deal amount 複製。檢查 association type ID 是否正確,以及 Line Items 是否已經被其他 Quote 佔用(一個 line item 只能關聯一個 quote)。若要重複使用,需先 clone line items。

Custom Code Action 逾時

HubSpot 的 Custom Code Action 有執行時間上限。若你在迴圈裡逐一建立多個 association,item 數量一多就會逾時。改用 batch API:

1curl -X POST \
2 'https://api.hubapi.com/crm/v4/associations/quotes/line_items/batch/create' \
3 -H "Authorization: Bearer $HUBSPOT_PRIVATE_APP_TOKEN" \
4 -H 'Content-Type: application/json' \
5 -d '{ "inputs": [ { "from": {"id":"QUOTE_ID"}, "to": {"id":"LI_ID"}, "types": [{"associationCategory":"HUBSPOT_DEFINED","associationTypeId":67}] } ] }'

收到 429 Too Many Requests

HubSpot API 有速率限制,詳見官方 API usage guidelines。在 Custom Code 內加入指數退避:

1async function withRetry(fn, attempts = 4) {
2 for (let i = 0; i < attempts; i++) {
3 try { return await fn(); }
4 catch (e) {
5 if (e.code !== 429 || i === attempts - 1) throw e;
6 await new Promise(r => setTimeout(r, 2 ** i * 500));
7 }
8 }
9}

PDF 中繁體字變方框

如前述,加入 CJK 字型 fallback 並上傳字型檔。另外檢查報價單屬性中是否混入全形空白或特殊符號(例如「※」),部分字型子集不含這些字元。

多幣別報價與 Deal amount 不符

HubSpot 用你在 Settings 設定的匯率換算,不是即時匯率。若你的報價週期長、匯率波動大,建議在報價單上明確標註「匯率以報價日 XXXX-XX-XX 為準」,並定期更新 HubSpot 的匯率設定。

一個跨境實作觀察

Branch8 曾為一家透過經銷商網絡銷售的製造業客戶(總部在大中華區,經銷商遍及東南亞與澳洲)重建 HubSpot 報價流程。當時的關鍵發現不在技術層面,而在資料建模:經銷商報價與終端客戶報價的價格邏輯不同,硬塞進同一個 Product Library 會讓折扣規則互相污染。

解法是在 Products 上加一層 price_tier 屬性,並在 Workflow 分支中依 Deal 的 channel_type 決定套用哪一層價格與哪一份範本。技術上只是多幾個分支,但如果一開始沒把這層模型拆開,後面每加一個市場就要重寫一次 workflow。

報價單自動化的價值不在「省下打字時間」,而在於讓每一張報價都成為結構化資料——之後才談得上折扣分析、贏率預測與跨市場定價比較。

Ready to Transform Your Ecommerce Operations?

Branch8 specializes in ecommerce platform implementation and AI-powered automation solutions. Contact us today to discuss your ecommerce automation strategy.

上線前的檢查清單

  1. Private App token 的 scope 已收斂到最小必要範圍,並存在 Workflow Secrets 而非程式碼中。
  2. Association type ID 已用 API 查證,非照抄文件範例。
  3. 每個目標市場都跑過一次端到端測試:建立 Deal → 加 Line Items → 推進階段 → 檢查報價單 → 匯出 PDF → 檢查繁中顯示 → 電子簽署 → 付款測試。
  4. 審批門檻已與財務確認,並記錄在內部 SOP。
  5. 匯率更新有指定負責人與週期。
  6. LLM 呼叫的資料範圍已通過私隱檢視。

把這六項做完,報價流程才算真的從 Excel 搬進 CRM。

如果你的團隊正在跨多個 APAC 市場運作 HubSpot,而報價、審批與收款仍散落在不同工具裡,Branch8 在香港、新加坡、台北與雪梨都有 CRM 實作團隊,可以協助檢視你目前的 Sales Hub 設定並規劃自動化路線——歡迎與我們聯絡討論。

Sources

FAQ

Starter 可以手動建立報價單,但無法使用 Workflows 的 Custom Code Action 與 Quote Approvals,因此無法自動生成或設定審批門檻。要做真正的自動化,至少需要 Sales Hub Professional。

About the Author

Matt Li

Co-Founder & CEO, Branch8 & Second Talent

Matt Li is Co-Founder and CEO of Branch8, a Y Combinator-backed (S15) Adobe Solution Partner and e-commerce consultancy headquartered in Hong Kong, and Co-Founder of Second Talent, a global tech hiring platform ranked #1 in Global Hiring on G2. With 12 years of experience in e-commerce strategy, platform implementation, and digital operations, he has led delivery of Adobe Commerce Cloud projects for enterprise clients including Chow Sang Sang, HomePlus (HKBN), Maxim's, Hong Kong International Airport, Hotai/Toyota, and Evisu. Prior to founding Branch8, Matt served as Vice President of Mid-Market Enterprises at HSBC. He serves as Vice Chairman of the Hong Kong E-Commerce Business Association (HKEBA). A self-taught software engineer, Matt graduated from the University of Toronto with a Bachelor of Commerce in Finance and Economics.