Files
leadchat/config/features.yml
Mazen Khalil ca5e112a8c feat: TikTok channel (#12741)
fixes: #11834

This pull request introduces TikTok channel integration, enabling users
to connect and manage TikTok business accounts similarly to other
supported social channels. The changes span backend API endpoints,
authentication helpers, webhook handling, configuration, and frontend
components to support TikTok as a first-class channel.


**Key Notes**
* This integration is only compatible with TikTok Business Accounts
* Special permissions are required to access the TikTok [Business
Messaging
API](https://business-api.tiktok.com/portal/docs?id=1832183871604753).
* The Business Messaging API is region-restricted and is currently
unavailable to users in the EU.
* Only TEXT, IMAGE, and POST_SHARE messages are currently supported due
to limitations in the TikTok Business Messaging API
* A message will be successfully sent only if it contains text alone or
one image attachment. Messages with multiple attachments or those
combining text and attachments will fail and receive a descriptive error
status.
* Messages sent directly from the TikTok App will be synced into the
system
* Initiating a new conversation from the system is not permitted due to
limitations from the TikTok Business Messaging API.


**Backend: TikTok Channel Integration**

* Added `Api::V1::Accounts::Tiktok::AuthorizationsController` to handle
TikTok OAuth authorization initiation, returning the TikTok
authorization URL.
* Implemented `Tiktok::CallbacksController` to handle TikTok OAuth
callback, process authorization results, create or update channel/inbox,
and handle errors or denied scopes.
* Added `Webhooks::TiktokController` to receive and verify TikTok
webhook events, including signature verification and event dispatching.
* Created `Tiktok::IntegrationHelper` module for JWT-based token
generation and verification for secure TikTok OAuth state management.

**Configuration and Feature Flags**

* Added TikTok app credentials (`TIKTOK_APP_ID`, `TIKTOK_APP_SECRET`) to
allowed configs and app config, and registered TikTok as a feature in
the super admin features YAML.
[[1]](diffhunk://#diff-5e46e1d248631a1147521477d84a54f8ba6846ea21c61eca5f70042d960467f4R43)
[[2]](diffhunk://#diff-8bf37a019cab1dedea458c437bd93e34af1d6e22b1672b1d43ef6eaa4dcb7732R69)
[[3]](diffhunk://#diff-123164bea29f3c096b0d018702b090d5ae670760c729141bd4169a36f5f5c1caR74-R79)

**Frontend: TikTok Channel UI and Messaging Support**

* Added `TiktokChannel` API client for frontend TikTok authorization
requests.
* Updated channel icon mappings and tests to include TikTok
(`Channel::Tiktok`).
[[1]](diffhunk://#diff-b852739ed45def61218d581d0de1ba73f213f55570aa5eec52aaa08f380d0e16R16)
[[2]](diffhunk://#diff-3cd3ae32e94ef85f1f2c4435abf0775cc0614fb37ee25d97945cd51573ef199eR64-R69)
* Enabled TikTok as a supported channel in contact forms, channel
widgets, and feature toggles.
[[1]](diffhunk://#diff-ec59c85e1403aaed1a7de35971fe16b7033d5cd763be590903ebf8f1ca25a010R47)
[[2]](diffhunk://#diff-ec59c85e1403aaed1a7de35971fe16b7033d5cd763be590903ebf8f1ca25a010R69)
[[3]](diffhunk://#diff-725b90ca7e3a6837ec8291e9f57094f6a46b3ee00e598d16564f77f32cf354b0R26-R29)
[[4]](diffhunk://#diff-725b90ca7e3a6837ec8291e9f57094f6a46b3ee00e598d16564f77f32cf354b0R51-R54)
[[5]](diffhunk://#diff-725b90ca7e3a6837ec8291e9f57094f6a46b3ee00e598d16564f77f32cf354b0R68)
* Updated message meta logic to support TikTok-specific message statuses
(sent, delivered, read).
[[1]](diffhunk://#diff-e41239cf8dda36c1bd1066dbb17588ae8868e56289072c74b3a6d7ef5abdd696R23)
[[2]](diffhunk://#diff-e41239cf8dda36c1bd1066dbb17588ae8868e56289072c74b3a6d7ef5abdd696L63-R65)
[[3]](diffhunk://#diff-e41239cf8dda36c1bd1066dbb17588ae8868e56289072c74b3a6d7ef5abdd696L81-R84)
[[4]](diffhunk://#diff-e41239cf8dda36c1bd1066dbb17588ae8868e56289072c74b3a6d7ef5abdd696L103-R107)
* Added support for embedded message attachments (e.g., TikTok embeds)
with a new `EmbedBubble` component and updated message rendering logic.
[[1]](diffhunk://#diff-c3d701caf27d9c31e200c6143c11a11b9d8826f78aa2ce5aa107470e6fdb9d7fR31)
[[2]](diffhunk://#diff-047859f9368a46d6d20177df7d6d623768488ecc38a5b1e284f958fad49add68R1-R19)
[[3]](diffhunk://#diff-c3d701caf27d9c31e200c6143c11a11b9d8826f78aa2ce5aa107470e6fdb9d7fR316)
[[4]](diffhunk://#diff-cbc85e7c4c8d56f2a847d0b01cd48ef36e5f87b43023bff0520fdfc707283085R52)
* Adjusted reply policy and UI messaging for TikTok's 48-hour reply
window.
[[1]](diffhunk://#diff-0d691f6a983bd89502f91253ecf22e871314545d1e3d3b106fbfc76bf6d8e1c7R208-R210)
[[2]](diffhunk://#diff-0d691f6a983bd89502f91253ecf22e871314545d1e3d3b106fbfc76bf6d8e1c7R224-R226)

These changes collectively enable end-to-end TikTok channel support,
from configuration and OAuth flow to webhook processing and frontend
message handling.


------------

# TikTok App Setup & Configuration
1. Grant access to the Business Messaging API
([Documentation](https://business-api.tiktok.com/portal/docs?id=1832184145137922))
2. Set the app authorization redirect URL to
`https://FRONTEND_URL/tiktok/callback`
3. Update the installation config with TikTok App ID and Secret
4. Create a Business Messaging Webhook configuration and set the
callback url to `https://FRONTEND_URL/webhooks/tiktok`
([Documentation](https://business-api.tiktok.com/portal/docs?id=1832190670631937))
. You can do this by calling
`Tiktok::AuthClient.update_webhook_callback` from rails console once you
finish Tiktok channel configuration in super admin ( will be automated
in future )
5. Enable TikTok channel feature in an account

---------

Co-authored-by: Sojan Jose <sojan@pepalo.com>
Co-authored-by: iamsivin <iamsivin@gmail.com>
2025-12-17 07:54:50 -08:00

233 lines
5.9 KiB
YAML

# DO NOT change the order of features EVER
############################################
# name: the name to be used internally in the code
# display_name: the name to be used in the UI
# enabled: whether the feature is enabled by default
# help_url: the url to the help center article
# chatwoot_internal: whether the feature is internal to Chatwoot and should not be shown in the UI for other self hosted installations
# deprecated: purpose of feature flag is done, no need to show it in the UI anymore
- name: inbound_emails
display_name: Inbound Emails
enabled: true
- name: channel_email
display_name: Email Channel
enabled: true
help_url: https://chwt.app/hc/email
- name: channel_facebook
display_name: Facebook Channel
enabled: true
help_url: https://chwt.app/hc/fb
- name: channel_twitter
display_name: Twitter Channel
enabled: true
deprecated: true
- name: ip_lookup
display_name: IP Lookup
enabled: false
- name: disable_branding
display_name: Disable Branding
enabled: false
premium: true
- name: email_continuity_on_api_channel
display_name: Email Continuity on API Channel
enabled: false
- name: help_center
display_name: Help Center
enabled: true
help_url: https://chwt.app/hc/help-center
- name: agent_bots
display_name: Agent Bots
enabled: true
help_url: https://chwt.app/hc/agent-bots
- name: macros
display_name: Macros
enabled: true
- name: agent_management
display_name: Agent Management
enabled: true
- name: team_management
display_name: Team Management
enabled: true
help_url: https://chwt.app/hc/teams
- name: inbox_management
display_name: Inbox Management
enabled: true
- name: labels
display_name: Labels
enabled: true
help_url: https://chwt.app/hc/labels
- name: custom_attributes
display_name: Custom Attributes
enabled: true
help_url: https://chwt.app/hc/custom-attributes
- name: automations
display_name: Automations
enabled: true
- name: canned_responses
display_name: Canned Responses
enabled: true
help_url: https://chwt.app/hc/canned
- name: integrations
display_name: Integrations
enabled: true
help_url: https://chwt.app/hc/integrations
- name: voice_recorder
display_name: Voice Recorder
enabled: true
- name: mobile_v2
display_name: Mobile App V2
enabled: false
deprecated: true
- name: channel_website
display_name: Website Channel
enabled: true
- name: campaigns
display_name: Campaigns
enabled: true
help_url: https://chwt.app/hc/campaigns
- name: reports
display_name: Reports
enabled: true
help_url: https://chwt.app/hc/reports
- name: crm
display_name: CRM
enabled: true
- name: auto_resolve_conversations
display_name: Auto Resolve Conversations
enabled: true
- name: custom_reply_email
display_name: Custom Reply Email
enabled: false
- name: custom_reply_domain
display_name: Custom Reply Domain
enabled: false
- name: audit_logs
display_name: Audit Logs
enabled: false
premium: true
- name: response_bot
display_name: Response Bot
enabled: false
premium: true
deprecated: true
- name: message_reply_to
display_name: Message Reply To
enabled: false
help_url: https://chwt.app/hc/reply-to
deprecated: true
- name: insert_article_in_reply
display_name: Insert Article in Reply
enabled: false
deprecated: true
- name: inbox_view
display_name: Inbox View
enabled: false
chatwoot_internal: true
- name: sla
display_name: SLA
enabled: false
premium: true
help_url: https://chwt.app/hc/sla
- name: help_center_embedding_search
display_name: Help Center Embedding Search
enabled: false
premium: true
chatwoot_internal: true
- name: linear_integration
display_name: Linear Integration
enabled: false
- name: captain_integration
display_name: Captain
enabled: false
premium: true
- name: custom_roles
display_name: Custom Roles
enabled: false
premium: true
- name: chatwoot_v4
display_name: Chatwoot V4
enabled: true
- name: report_v4
display_name: Report V4
enabled: true
deprecated: true
- name: contact_chatwoot_support_team
display_name: Contact Chatwoot Support Team
enabled: true
chatwoot_internal: true
- name: shopify_integration
display_name: Shopify Integration
enabled: false
chatwoot_internal: true
- name: search_with_gin
display_name: Search messages with GIN
enabled: false
chatwoot_internal: true
- name: channel_instagram
display_name: Instagram Channel
enabled: true
- name: crm_integration
display_name: CRM Integration
enabled: false
- name: channel_voice
display_name: Voice Channel
enabled: false
chatwoot_internal: true
- name: notion_integration
display_name: Notion Integration
enabled: false
- name: captain_integration_v2
display_name: Captain V2
enabled: false
premium: true
- name: whatsapp_embedded_signup
display_name: WhatsApp Embedded Signup
enabled: false
deprecated: true
- name: whatsapp_campaign
display_name: WhatsApp Campaign
enabled: false
- name: crm_v2
display_name: CRM V2
enabled: false
chatwoot_internal: true
- name: assignment_v2
display_name: Assignment V2
enabled: false
chatwoot_internal: true
- name: twilio_content_templates
display_name: Twilio Content Templates
enabled: false
deprecated: true
- name: advanced_search
display_name: Advanced Search
enabled: false
premium: true
chatwoot_internal: true
- name: saml
display_name: SAML
enabled: false
premium: true
- name: advanced_search_indexing
display_name: Advanced Search Indexing
enabled: false
premium: true
chatwoot_internal: true
- name: reply_mailer_migration
# This feature is temporary only to migrate reply mailer to new email builder
# Once the migration is done, this feature can be removed
display_name: Reply Mailer Migration
enabled: false
chatwoot_internal: true
- name: quoted_email_reply
display_name: Quoted Email Reply
enabled: false
- name: companies
display_name: Companies
enabled: false
premium: true
chatwoot_internal: true
- name: channel_tiktok
display_name: TikTok Channel
enabled: true