We are making changes to the WhatsApp Business Platform pricing model. See Pricing Updates on the WhatsApp Business Platform.

建立及管理範本

使用雲端 API(Meta 託管)或內部部署 API 傳送範本訊息時,系統會使用範本。雲端 API 使用機器學習來審核範本和變數參數,可保護雲端 API 服務的安全性和完整性。當雲端 API 審核範本和變數文字時,不會與 WhatsApp 分享任何資訊。

您可以使用 Business Management API 或 WhatsApp 企業管理平台建立範本。WhatsApp Business 帳號可擁有的範本數量由其母商家決定。若母商家尚未認證,其每個 WhatsApp Business 帳號僅限擁有 250 個範本。但若母商家已通過認證,且其至少一個 WhatsApp Business 帳號具有已核准顯示名稱的商家電話號碼,其每個 WhatsApp Business 帳號最多可擁有 6,000 個範本。

準備工作

必備資料:

  • 連結商家的系統用戶存取權杖
  • 商家的 WhatsApp Business 帳號編號
  • 要包含在媒體範本中的任何文件、圖像或影片檔案的媒體資產用戶名稱。若要取得媒體資產用戶名稱,您必須使用可續傳的上傳 API 上傳媒體資產。

限制

  • 訊息範本名稱欄位不能超過 512 個字元。
  • 訊息範本內容欄位不能超過 1024 個字元。
  • 只有在範本處於「已核准」、「已拒絕」或「已暫停」狀態時,才能對其進行編輯。您每天可以編輯一次範本,每個月最多可以編輯 10 次。
  • WhatsApp Business 帳號每小時只能建立 100 個訊息範本。
  • 範本若是由 4 個以上按鈕,或是一個快速回覆按鈕和一個以上其他類型按鈕所組成,您將無法在 WhatsApp 桌面版用戶端查看。收到這些範本訊息的 WhatsApp 用戶將收到提示,告知改為在手機上查看。

本地化

您可以在建立範本時,新增特定語言的訊息範本。這些範本會計入您的限制中。提供翻譯時,請保持一致性。請參閱為什麼在我的回呼中會顯示「結構無法使用」錯誤?使用說明文章,以瞭解詳情。

建立範本

請傳送 POST 要求至 WhatsApp Business 帳號 > 訊息範本端點建立範本。

要求語法

POST /<WHATSAPP_BUSINESS_ACCOUNT_ID>/message_templates

貼文內容

{
  "name": "<NAME>",
  "category": "<CATEGORY>",
  "allow_category_change": <ALLOW_CATEGORY_CHANGE>,
  "language": "<LANGUAGE>",
  "components": [<COMPONENTS>]
}

內文屬性

預留位置說明範例值

<NAME>

字串

必要項目。


範本名稱。

最多 512 個字元。

order_confirmation

<CATEGORY>

列舉

必要項目。


範本類別。

請參閱下文的範本類別

UTILITY

<ALLOW_CATEGORY_CHANGE>

布林值

選用項目。


設為 true,允許我們自動指派類別。如果省略,範本可能因分類錯誤而遭拒。

true

<LANGUAGE>

列舉

必要項目。


範本語言和地區設定代碼

en_US

<LIBRARY_TEMPLATE_NAME>

字串

選用項目。


「公用範本庫」範本的確切名稱。

瞭解如何使用公用範本庫來建立範本

delivery_update_1

<COMPONENTS>

物件陣列

必要項目。


組成範本的元件。

請參閱下文的範本元件

請參閱下文的範本元件

預留位置說明範例值

<LIBRARY_TEMPLATE_BUTTON_INPUTS>

JSON 物件

選用項目。


從範本庫建立範本期間的選用資料。這些是按鈕元件的選用欄位。


注意:對於包含按鈕的公用範本,這不是選用屬性。

瞭解如何使用範本庫來建立範本

“[ {'type': 'URL', 'url': {'base_url' : 'https://www.example.com/{{1}}', 'url_suffix_example' : 'https://www.example.com/demo'}}, {type: 'PHONE_NUMBER', 'phone_number': '+16315551010'} ]"

type

列舉

按鈕類型

QUICK_REPLY、URL、PHONE_NUMBER、OTP、MPM、CATALOG、FLOW、VOICE_CALL、APP

必要項目

OTP

phone_number

字串

按鈕的電話號碼。

選用項目

"+13057652345"

url

JSON 物件

在此處查看 JSON 物件網址參數 base_urlurl_suffix_example

選用項目

zero_tap_terms_accepted

布林值

用戶是否接受免點按使用條款。

選用項目

TRUE

otp_type

列舉

一次性密碼類型。

COPY_CODE、ONE_TAP、ZERO_TAP

選用項目

TRUE

supported_apps

JSON 物件陣列

在此處查看 JSON 物件支援的應用程式參數 package_namesignature_hash

選用項目

預留位置說明範例值

<LIBRARY_TEMPLATE_BODY_INPUTS>

JSON 物件

選用項目。


從範本庫建立範本期間的選用資料。這些是按鈕元件的選用欄位。


瞭解如何使用範本庫來建立範本

add_contact_number

布林值

布林值,用於在範本中新增電話號碼上聯絡商家的相關資訊。

選用項目

TRUE

add_learn_more_link

布林值

布林值,用於在範本中新增使用網址連結瞭解更多資訊的相關資訊。

未廣泛使用,若未提供將忽略。

選用項目

TRUE

add_security_recommendation

布林值

布林值,用於在範本中新增不與任何人分享驗證碼的相關資訊。

選用項目

TRUE

add_track_package_link

布林值

布林值,用於在範本中新增資訊以追蹤投遞包裹。

未廣泛使用,若未提供將忽略。

選用項目

TRUE

code_expiration_minutes

int64

整數值,用於在範本中新增代碼過期時間的相關資訊。

選用項目

5

範本類別

必須使用下列類別其中之一將範本分類。類別會影響定價,且建立範本的同時將驗證您指定的類別。

  • AUTHENTICATION
  • MARKETING
  • UTILITY

請參閱我們的範本類別文件,以決定建立範本時要使用的類別。

範本元件

範本由各種文字、影音素材和互動式元件組成,具體取決於您的商家需求。請參閱範本元件文件,瞭解所有可能的元件清單及其必備條件以及範例和範例查詢。

建立範本時,可以透過將元件物件的陣列指派給要求本文中的 components 屬性來定義其元件。

例如,以下是一個陣列,內容包含一個具有兩個變數和範例值的內文主體元件、一個電話號碼按鈕元件和一個網址按鈕元件:

[
  {
    "type": "BODY",
    "text": "Thank you for your order, {{1}}! Your confirmation number is {{2}}. If you have any questions, please use the buttons below to contact support. Thank you for being a customer!",
    "example": {
      "body_text": [
        [
          "Pablo","860198-230332"
        ]
      ]
    }
  },
  {
    "type": "BUTTONS",
    "buttons": [
      {
        "type": "PHONE_NUMBER",
        "text": "Call",
        "phone_number": "15550051310"
      },
      {
        "type": "URL",
        "text": "Contact Support",
        "url": "https://www.luckyshrub.com/support"
      }
    ]
  }
]

請參閱範本元件文件,瞭解所有可能的元件清單及其必備條件以及範例和範例查詢。

請注意,分類為 AUTHENTICATION 的範本具有不重複的元件必備條件。請參閱驗證範本

類別驗證

傳送範本建立要求時,我們會立即使用範本分類指南驗證其類別。

  • 如果我們同意您指定的類別,我們將建立範本並將其 status 設為 PENDING。接著對範本進行範本審查
  • 如果我們不同意您的指定,我們會建立範本,但將其 status 設為 REJECTED,然後觸發訊息範本狀態更新 Webhook,並將 reason 設為 INCORRECT_CATEGORY。建議您偵聽此 Webhook 以識別遭拒的範本,或要求新建立的範本上的 rejected_reason 欄位,欄位的值將是 TAG_CONTENT_MISMATCH

在這兩種情況下,範本的初始狀態都會作為 API 回應的一部分傳回。

如果您的範本狀態已作為類別驗證的一部分設定為 REJECTED,則您有幾個選擇:

自動分類

您可以在要求中包含 allow_category_change 屬性,讓我們可以根據範本的內容和範本分類指南自動指定類別。這樣做可避免因分類錯誤立即將您的範本狀態設定為 REJECTED

注意,自動分類只能在建立範本時使用。

範本審查

擁有 PENDING 狀態的範本表示正在進行範本審查。我們會審查每個新建立或編輯的範本的內容,確保其符合我們的內容指南和政策。根據審查結果,我們會自動將其狀態變更為 APPROVEDREJECTED,這會觸發 訊息範本狀​​態更新 Webhook。

範本狀態

根據類別驗證和範本審查的結果,我們會將您範本的 status 設定或變更為下列其中一個值:

  • APPROVED — 此範本已通過範本審查並獲得核准,現在可以在範本訊息中傳送
  • PENDING — 範本已通過類別驗證,正在進行範本審查。
  • REJECTED — 範本未通過類別驗證或範本審查。您可要求範本上的 rejected_reason 欄位,以取得原因。

請參閱 WhatsApp 訊息範本端點參考資料,以取得所有可能的欄位和狀態。

回應

成功後,API 會使用新建的範本編號、狀態和類別回覆。有三種可能的結果:

  • 我們同意您指定的類別,範本現正進行範本審查(statusPENDING)。
  • 我們不同意您指定的類別(statusREJECTED
  • 我們自動核准範本(statusAPPROVED)。這只適用於含一次性密碼按鈕的驗證範本
{
    "id": "<ID>",
    "status": "<STATUS>",
    "category": "<CATEGORY>"
}

回應屬性

預留位置說明範例值

<ID>

範本編號。

572279198452421

<STATUS>

範本狀態

PENDING

<CATEGORY>

您指定或我們指定範本類別

MARKETING

要求範例

這是建立季節性促銷活動範本的要求範例,由下列元件組成:

  • 文字標頭
  • 內文主體
  • 頁尾
  • 兩個快速回覆按鈕

如需其他範例,請參閱範例要求

curl 'https://graph.facebook.com/v21.0/102290129340398/message_templates' \
-H 'Authorization: Bearer EAAJB...' \
-H 'Content-Type: application/json' \
-d '
{
  "name": "seasonal_promotion",
  "language": "en_US",
  "category": "MARKETING",
  "components": [
    {
      "type": "HEADER",
      "format": "TEXT",
      "text": "Our {{1}} is on!",
      "example": {
        "header_text": [
          "Summer Sale"
        ]
      }
    },
    {
      "type": "BODY",
      "text": "Shop now through {{1}} and use code {{2}} to get {{3}} off of all merchandise.",
      "example": {
        "body_text": [
          [
            "the end of August","25OFF","25%"
          ]
        ]
      }
    },
    {
      "type": "FOOTER",
      "text": "Use the buttons below to manage your marketing subscriptions"
    },
    {
      "type":"BUTTONS",
      "buttons": [
        {
          "type": "QUICK_REPLY",
          "text": "Unsubscribe from Promos"
        },
        {
          "type":"QUICK_REPLY",
          "text": "Unsubscribe from All"
        }
      ]
    }
  ]
}'

回應範例

{
    "id": "572279198452421",
    "status": "PENDING",
    "category": "MARKETING"
}

傳送範本

使用雲端 API內部部署 API 在範本訊息中傳送範本。

存留時間(TTL):自訂、預設、最小/最大值和相容性

如果我們無法將訊息投遞給 WhatsApp 用戶,會嘗試重新投遞一段時間,這段時間稱為存留時間(TTL)或訊息有效期限。

您可以自訂驗證、公用和行銷範本的預設 TTL。

我們鼓勵您為所有驗證範本設定 TTL,最好等於或小於驗證碼過期時間,以確保顧客只在驗證碼仍可用時才收到訊息。

預設、最小/最大值和相容性資料表

驗證公用行銷

預設 TTL

10 分鐘

30 天

30 天

相容性

雲端 API + 內部部署 API

僅適用於雲端 API

行銷訊息(MM)Lite API

可自訂範圍

30 秒到 15 分鐘

30 秒到 12 小時

12 小時到 30 天

如何自訂範本的 TTL

2024 年 10 月 23 日之前建立的驗證範本的預設 TTL 為 30 天。

若要設定驗證、公用或行銷範本的自訂 TTL,請在 POST /<PHONE_NUMBER_ID>/messages 呼叫中包含並設定 message_send_ttl_seconds 屬性的值。

您可以自訂 TTL 的增量為 1 秒。

有效的 message_send_ttl_seconds 屬性值

  • 驗證範本:30900 秒(30 秒到 15 分鐘)
  • 公用範本:3043200 秒(30 秒到 12 小時)
  • 行銷範本:432002592000(12 小時到 30 天)

若是驗證和公用範本,您可以將 message_send_ttl_seconds 屬性值設為 -1,這會自訂 TTL 為 30 天。

超出 TTL 時:捨棄的訊息

無法在預設或自訂 TTL 內投遞的訊息,系統會將其捨棄。

如果您在超出 TTL 之前,未收到已投遞訊息 Webhook,請假設系統已捨棄該訊息。

如果您傳送的訊息投遞失敗,可能會稍微延遲才收到 Webhook,因此您可能會希望在假設訊息遭捨棄之前建置一個小緩衝區。

行銷範本的最佳作法

「選擇不接收行銷訊息」按鈕

建議您在分類為 MARKETING 的範本中新增「快速回覆」按鈕,讓顧客可以輕鬆選擇不接收行銷訊息。如此可讓您的顧客選擇不接收行銷訊息,而不需封鎖您的商家。您因此可以更快速地擴展傳訊數量。請參閱本文章,詳細瞭解在行銷範本中新增選擇不接收按鈕的好處。

商家必須採取必要措施,停止傳送行銷訊息給選擇不接收行銷訊息的顧客。否則,將會對您的封鎖率和品質評分產生負面影響。

取得範本

傳送 GET 要求至 WhatsApp Business 帳號 > 訊息範本端點,可取得 WhatsApp Business 帳號擁有的範本清單。

要求語法

GET /<WHATSAPP_BUSINESS_ACCOUNT_ID>/message_templates
  ?fields=<FIELDS>
  &limit=<LIMIT>

查詢字串參數

預留位置說明範例值

<FIELDS>

逗號分隔的清單

選用項目。


要傳回的範本欄位清單。

name,status

<LIMIT>

整數

選用項目。


要在每頁結果中傳回的最大範本數量。

10

要求範例

curl 'https://graph.facebook.com/v21.0/102290129340398/message_templates?fields=name,status&limit=3' \
-H 'Authorization: Bearer EAAJB...'

回應範例

{
  "data": [
    {
      "name": "seasonal_promotion_text_only",
      "status": "APPROVED",
      "id": "564750795574598"
    },
    {
      "name": "seasonal_promotion_video",
      "status": "PENDING",
      "id": "1252715608684590"
    },
    {
      "name": "seasonal_promotion_image_header",
      "status": "PENDING",
      "id": "1372429296936443"
    }
  ],
  "paging": {
    "cursors": {
      "before": "MAZDZD",
      "after": "MgZDZD"
    },
    "next": "https://graph.facebook.com/v21.0/102290129340398/message_templates?fields=name%2Cstatus&limit=3&after=MgZDZD"
  }
}

要求範例(已拒絕的範本)

透過在要求中包含欄位和所需值,您可以僅傳回具有特定欄位值的範本。例如,包含 status=REJECTED 可以僅取得已拒絕的範本。

curl 'https://graph.facebook.com/v21.0/104996122399160/message_templates?fields=name,status&status=REJECTED' \
-H 'Authorization: Bearer EAAJB...'

回應範例

{
  "data": [
    {
      "name": "seasonal_promotion_text_only_v4",
      "status": "REJECTED",
      "id": "564750795574598"
    },
    {
      "name": "discount_qualifier",
      "status": "REJECTED",
      "id": "163917509772674"
    },
    {
      "name": "limited_time_offer_tuscan_getaway_2023",
      "status": "REJECTED",
      "id": "202389039167147"
    },
    {
      "name": "2023_mar_promo_2",
      "status": "REJECTED",
      "id": "1116034925734553"
    },
    {
      "name": "2023_mar_promo",
      "status": "REJECTED",
      "id": "952600926095321"
    }
  ]
}

擷取範本命名空間

必須要有訊息範本命名空間,才能使用訊息範本來傳送訊息。

若要取得範本的命名空間,請傳送 GET 要求至 /{whatsapp-business-account-ID} 端點,並包含 message_template_namespace 欄位。

要求範例

格式化使讀取更為方便。
curl -i -X GET "https://graph.facebook.com/v21.0/{whatsapp-business-account-ID}
  ?fields=message_template_namespace
  &access_token={system-user-access-token}"

如果成功,系統會傳回 JSON 物件以及 WhatsApp Business 帳號編號和命名空間:

{
    "id": "1972385232742141",
    "message_template_namespace": "12abcdefghijk_34lmnop" 
}

編輯範本

請傳送 POST 要求至 WhatsApp 訊息範本端點編輯範本。您也可以使用 WhatsApp 管理工具 > 帳號工具 > 訊息範本面板手動編輯範本。

限制

  • 只能編輯狀態為 APPROVEDREJECTEDPAUSED 的範本。
  • 只能編輯範本的 categorycomponents
  • 無法編輯已核准範本的 category
  • 已核准的範本在 30 天的時限內最多可以編輯 10 次,或在 24 小時的時限內可以編輯 1 次。已拒絕或已暫停的範本可以無限次編輯。
  • 已核准或已暫停的範本在編輯之後,除非未通過範本審查,否則將自動獲得核准。

要求語法

POST /<WHATSAPP_MESSAGE_TEMPLATE_ID>

張貼內容

{
  "category": "<CATEGORY>",
  "components": [<COMPONENTS>]
}

屬性

預留位置說明範例值

<CATEGORY>

字串

若省略元件屬性,則為必要項目。


範本類別。

AUTHENTICATION

<COMPONENTS>

陣列

若省略類別屬性,則為必要項目。


範本元件物件的陣列。

請參閱下文的要求範例(編輯元件)

要求範例(編輯元件)

此要求範例為同時包含行銷和公用內容的範本本文,以僅包含行銷內容。

curl 'https://graph.facebook.com/v21.0/564750795574598' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer EAAJB...' \
-d '
{
  "components": [
    {
      "type": "HEADER",
      "format": "TEXT",
      "text": "Our {{1}} is on!",
      "example": {
        "header_text": [
          "Spring Sale"
        ]
      }
    },
    {
      "type": "BODY",
      "text": "Shop now through {{1}} and use code {{2}} to get {{3}} off of all merchandise.",
      "example": {
        "body_text": [
          [
            "the end of April",
            "25OFF",
            "25%"
          ]
        ]
      }
    },
    {
      "type": "FOOTER",
      "text": "Use the buttons below to manage your marketing subscriptions"
    },
    {
      "type": "BUTTONS",
      "buttons": [
        {
          "type": "QUICK_REPLY",
          "text": "Unsubcribe from Promos"
        },
        {
          "type": "QUICK_REPLY",
          "text": "Unsubscribe from All"
        }
      ]
    }
  ]
}'

要求範例(僅編輯類別)

將範本的類別從 UTILITY 變更為 MARKETING 的要求範例。

curl 'https://graph.facebook.com/v21.0/1252715608684590' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer EAAJB...' \
-d '
{
  "category": "MARKETING"
}'

回應範例

成功後的回應範例。

{
  "success": true
}

刪除範本

請使用 WhatsApp Business 帳號 > 訊息範本端點依名稱或依編號刪除範本。

備註

  • 如果您刪除已在範本訊息中傳送但尚未送達的範本(例如,因為顧客的電話已關機),則該範本的狀態將設為 PENDING_DELETION,我們將嘗試在 30 天內投遞該訊息。在此時間之後,您將收到「結構無法使用」的錯誤,且顧客不會收到訊息。
  • 已刪除之已核准範本的名稱會有 30 天無法再次使用。

依名稱刪除

依名稱刪除範本會刪除與該名稱相符的所有範本(這表示名稱相同但語言不同的範本也將遭刪除)。

要求語法

DELETE /<WHATSAPP_BUSINESS_ACCOUNT_ID>/message_templates
  ?name=<NAME>

要求範例

curl -X DELETE 'https://graph.facebook.com/v16.0/102290129340398/message_templates?name=order_confirmation' \
-H 'Authorization: Bearer EAAJB...'

回應範例

{
  "success": true
}

依編號刪除

若要依編號刪除範本,請在要求中包含範本的編號及其名稱;只有具備相符範本編號的範本才會遭刪除。

要求語法

DELETE /<WHATSAPP_BUSINESS_ACCOUNT_ID>/message_templates
  ?hsm_id=<HSM_ID>,
  &name=<NAME>

要求範例

curl -X DELETE 'https://graph.facebook.com/v21.0/102290129340398/message_templates?hsm_id=1407680676729941&name=order_confirmation' \
-H 'Authorization: Bearer EAAJB...'

回應範例

{
  "success": true
}