We are making changes to the WhatsApp Business Platform pricing model. See Pricing Updates on the WhatsApp Business Platform.
Шаблоны используются при отправке сообщений через облачный API на хостинге Meta или локальный API. Облачный API проверяет шаблоны и переменные параметры для защиты безопасности и целостности своих сервисов. Это делается с применением машинного обучения. Когда облачный API проверяет шаблоны и переменный текст, никакая информация в WhatsApp не передается.
Шаблоны можно создавать с помощью Business Management API или WhatsApp Business Manager. Количество возможных шаблонов в аккаунте WhatsApp Business определяется компанией, к которому он относится. Если компания не подтверждена, каждый аккаунт WhatsApp Business может иметь до 250 шаблонов. Если же компания подтверждена и по крайней мере один аккаунт WhatsApp Business использует номер телефона компании и имеет подтвержденное отображаемое имя, каждый аккаунт WhatsApp Business может иметь до 6000 шаблонов.
Вам понадобится:
При создании шаблона можно добавить его вариант на определенном языке. Эти шаблоны учитываются в общем ограничении на количество шаблонов. Соблюдайте единообразие при переводе. См. статью об ошибках Structure Unavailable (Структура недоступна) в обратном вызове в Справочном центре.
Чтобы создать шаблон, отправьте запрос POST к конечной точке WhatsApp Business Account > Шаблоны сообщений.
POST /<WHATSAPP_BUSINESS_ACCOUNT_ID>/message_templates
{ "name": "<NAME>", "category": "<CATEGORY>", "allow_category_change": <ALLOW_CATEGORY_CHANGE>, "language": "<LANGUAGE>", "components": [<COMPONENTS>] }
Заполнитель | Описание | Пример значения |
---|---|---|
Строка | Обязательный параметр. Название шаблона. Не более 512 символов. |
|
Перечисление | Обязательный параметр. Категория шаблона. См. раздел Категории шаблонов ниже. |
|
Логическое значение | Необязательный параметр. Установите значение true, чтобы мы могли автоматически назначить категорию. В противном случае шаблон может быть отклонен из-за неправильной категоризации. |
|
Перечисление | Обязательный параметр. Язык и код региона, используемые в шаблоне. |
|
Строка | Необязательный параметр. Точное имя шаблона из библиотеки шаблонов категории "Услуги". Узнайте, как создавать шаблоны с помощью библиотеки шаблонов категории "Услуги" |
|
Массив объектов | Обязательный параметр. Компоненты шаблона. См. раздел Компоненты шаблонов ниже. | См. раздел Компоненты шаблонов ниже. |
Заполнитель | Описание | Пример значения |
---|---|---|
Объект JSON | Необязательный параметр. Дополнительные данные во время создания шаблона из библиотеки шаблонов. Это необязательные поля для компонента кнопки. Примечание. Для шаблонов категории "Услуги", содержащих кнопки, это обязательное свойство. Узнайте, как создавать шаблоны с помощью библиотеки шаблонов |
|
Перечисление | Тип кнопки QUICK_REPLY, URL, PHONE_NUMBER, OTP, MPM, CATALOG, FLOW, VOICE_CALL, APP Обязательный параметр |
|
Строка | Номер телефона для кнопки. Необязательный параметр |
|
Объект JSON | См. параметры URL объекта JSON Необязательный параметр | |
Логическое значение | Принял ли пользователь условия "Без нажатия". Необязательный параметр |
|
Перечисление | Тип одноразового пароля. COPY_CODE, ONE_TAP, ZERO_TAP Необязательный параметр |
|
Массив объектов JSON | См. параметры поддерживаемых приложений объекта JSON Необязательный параметр |
Заполнитель | Описание | Пример значения |
---|---|---|
Объект JSON | Необязательный параметр. Дополнительные данные во время создания шаблона из библиотеки шаблонов. Это необязательные поля для компонента кнопки. Узнайте, как создавать шаблоны с помощью библиотеки шаблонов | |
Логическое значение | Логическое значение, определяющее, нужно ли добавлять в шаблон информацию о том, как связаться с компанией по телефону. Необязательный параметр |
|
Логическое значение | Логическое значение, определяющее, нужно ли добавлять в шаблон ссылку на дополнительную информацию. Доступно не везде и будет игнорироваться в случае отсутствия. Необязательный параметр |
|
Логическое значение | Логическое значение, определяющее, нужно ли добавлять в шаблон информацию о том, что коды аутентификации нельзя никому передавать. Необязательный параметр |
|
Логическое значение | Логическое значение, определяющее, нужно ли добавлять в шаблон информацию для отслеживания доставки посылок. Доступно не везде и будет игнорироваться в случае отсутствия. Необязательный параметр |
|
64-разрядное целое число | Целое число, добавление в шаблон информации о сроке действия кода. Необязательный параметр |
|
Шаблоны должны быть распределены с использованием следующих категорий. Категории влияют на расценки, и категория, которую вы укажете, будет подтверждена во время создания шаблона.
AUTHENTICATION
MARKETING
UTILITY
См. документ Категории шаблонов для определения, какую категорию выбрать при создании шаблонов.
В зависимости от потребностей компании шаблоны могут содержать текст, медиафайлы и интерактивные компоненты. Список всех доступных компонентов, требования к их использованию, а также примеры переменных и запросов см. в документации по компонентам шаблонов.
При создании шаблона необходимо определить компоненты, назначив массив объектов компонентов свойству "компоненты" в теле запроса.
Например, массив, содержащий компонент тела с текстом с двумя переменными и примерами переменных, компонент кнопки с номером телефона и компонент кнопки с URL:
[ { "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
и запустим Webhooks обновление статуса шаблона сообщения и установим reason
на INCORRECT_CATEGORY
. Мы рекомендуем прослушивать этот Webhooks, чтобы определять отклоненные шаблоны или запрашивать поле rejected_reason
для вновь созданных шаблонов со значением TAG_CONTENT_MISMATCH
.В обоих случаях первичный статус шаблона будет показан как часть ответа API.
Если же в результате подтверждения категории для вашего шаблона установлен статус REJECTED
, у вас есть несколько вариантов:
Вы можете включить свойство allow_category_change
в свой запрос, чтобы мы автоматически назначили категорию для вашего шаблона на основании его содержимого и нашего руководства по категориям шаблонов. Это может предотвратить ситуацию, при которой в качестве статуса вашего шаблона сразу же устанавливается REJECTED
из-за неправильной категории.
Обратите внимание, что автоматические категории возможны только при создании шаблона.
Статус PENDING
означает, что шаблон на стадии проверки. Мы проверяем содержимое каждого нового созданного шаблона, чтобы убедиться, что он соответствует нашему руководству и политике. На основании выводов этой проверки мы автоматически изменим его статус на APPROVED
или REJECTED
, который запустит Webhooks обновления статуса шаблона сообщения.
На основании выводов подтверждения категории и проверки шаблона будет установлен или изменен status
вашего шаблона на одно из следующих значений:
APPROVED
— шаблон прошел проверку шаблона и был одобрен и теперь его можно отправить в шаблоны сообщений.PENDING
— шаблон прошел подтверждение категории и находится на стадии проверки шаблона.REJECTED
— шаблон не прошел подтверждение категории или проверку шаблона. Вы можете запросить поле rejected_reason на шаблон и узнать причину.См. эту справку по конечным точкам Шаблон сообщения WhatsApp для всех возможных полей и статусов.
В случае успеха API возвращает ID, статус и категорию созданного шаблона. Возможны три результата:
status
PENDING
).status
REJECTED
)status
APPROVED
). Это возможно только для шаблонов категории "Аутентификация" с кнопками одноразовых паролей.{ "id": "<ID>", "status": "<STATUS>", "category": "<CATEGORY>" }
Заполнитель | Описание | Пример значения |
---|---|---|
| ID шаблона |
|
|
| |
| Категория шаблона, указанная вами, либо мы назначили. |
|
Пример запроса на создание шаблона с сезонной промоакцией со следующими компонентами:
Дополнительные примеры см. в этом разделе.
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" }
Если нам не удается доставить сообщение пользователю WhatsApp, мы продолжаем попытки в течение некоторого времени. Оно называется временем жизни (TTL) или периодом действия сообщения.
Вы можете настроить используемое по умолчанию время жизни для шаблонов категорий "Аутентификация", "Услуги" и "Маркетинг".
Желательно, чтобы для всех шаблонов категории "Аутентификация" время жизни не выходило за рамки срока действия кода, чтобы клиенты получали сообщения, только если код ещё можно использовать.
Аутентификация | Услуги | Маркетинг | |
---|---|---|---|
Время жизни по умолчанию | 10 минут | 30 дней | 30 дней |
Совместимость | Облачный API и локальный API | Только облачный API | Marketing Messages (MM) Lite API |
Настраиваемый диапазон | От 30 секунд до 15 минут | От 30 секунд до 12 часов | От 12 часов до 30 дней |
Время жизни шаблонов категории "Аутентификация", созданных до 23 октября 2024 года, по умолчанию составляет 30 дней.
Чтобы указать пользовательское время жизни для шаблона категории "Аутентификация", "Услуги" или "Маркетинг", добавьте в вызов POST /<PHONE_NUMBER_ID>/messages
свойство message_send_ttl_seconds
и задайте в нем нужное значение.
Время жизни можно настраивать с шагом в 1 секунду.
message_send_ttl_seconds
30
до 900
секунд (от 30 секунд до 15 минут). 30
до 43200
секунд (от 30 секунд до 12 часов).43200
до 2592000
(от 12 часов до 30 дней).Для шаблонов категорий "Аутентификация" и "Услуги" для свойства message_send_ttl_seconds
можно указать значение -1
. В этом случае будет установлено пользовательское время жизни продолжительностью 30 дней.
Сообщения, которые не удается доставить в течение установленного по умолчанию или настроенного пользователем времени жизни, сбрасываются.
Если вы не получите уведомление Webhooks о доставке сообщения до истечения времени жизни, это сообщение можно считать сброшенным.
Если вы отправляете сообщение, которое не доставляется, уведомление Webhooks может прийти с небольшой задержкой, поэтому сообщение стоит считать сброшенным только по прошествии некоторого времени.
Рекомендуем добавлять в шаблоны категории MARKETING
кнопку быстрого ответа. Так пользователям будет проще подписываться на маркетинговые сообщения или отписываться от них, не блокируя вашу компанию. В результате вы сможете масштабировать переписки быстрее. Подробнее о преимуществах кнопки отказа от маркетинговой рассылки см. в этой статье.
Ваша компания должна предпринять необходимые действия, чтобы прекратить отправку маркетинговых сообщений клиентам, которые отказались от их получения. Если этого не сделать, возможны проблемы с коэффициентом блокировки и оценкой качества.
Чтобы получить список шаблонов, владельцем которых является аккаунт WhatsApp Business, отправьте запрос GET к конечной точке Аккаунт WhatsApp Business > Шаблоны сообщений.
GET /<WHATSAPP_BUSINESS_ACCOUNT_ID>/message_templates ?fields=<FIELDS> &limit=<LIMIT>
Заполнитель | Описание | Пример значения |
---|---|---|
Список значений через запятую | Необязательный параметр. Список полей шаблонов, которые нужно вернуть. |
|
Целое число | Необязательный параметр. Максимальное количество шаблонов на каждой странице результатов. |
|
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 с ID аккаунта WhatsApp Business и пространством имен:
{ "id": "1972385232742141", "message_template_namespace": "12abcdefghijk_34lmnop" }
Чтобы отредактировать шаблон, отправьте запрос POST к конечной точке Шаблон сообщения WhatsApp. Кроме того, отредактировать шаблон можно вручную на панели WhatsApp Manager > Инструменты для управления аккаунтом > Шаблоны сообщений.
APPROVED
, REJECTED
или PAUSED
.category
или components
.category
одобренного шаблона изменить нельзя.POST /<WHATSAPP_MESSAGE_TEMPLATE_ID>
{ "category": "<CATEGORY>", "components": [<COMPONENTS>] }
Заполнитель | Описание | Пример значения |
---|---|---|
Строка | Обязательно, если отсутствует свойство components. Категория шаблона. |
|
Массив | Обязательно, если отсутствует свойство category. Массив компонентов шаблона. | См. раздел Пример запроса (редактирование компонентов) ниже. |
Пример запроса на изменение текста тела шаблона, содержащего одновременно маркетинговый и служебный контент, чтобы он содержал только маркетинговый контент.
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 }
Для удаления шаблона по его имени или по ID используйте конечную точку Аккаунт WhatsApp Business > Шаблоны сообщений.
PENDING_DELETION
, а мы будем пытаться отправить это сообщение в течение 30 дней. По истечении этого периода времени у вас отобразится ошибка "Structure Unavailable" (Структура недоступна), а клиент не получит сообщение.При удалении шаблона по его имени будут удалены все шаблоны, которые соответствуют этому имени (имеются в виду шаблоны с одинаковым именем, однако также будут удалены шаблоны на других языках).
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 }
Чтобы удалить шаблон по его ID, добавьте в свой запрос ID шаблона вместе с его именем; при этом будет удален только шаблон с соответствующим ID.
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 }