feat(whatsapp): add quick setup access request (#15336)

Cloud accounts without access to WhatsApp Quick setup currently fall
directly into manual configuration, with no explanation of how to
request the easier Meta flow.

This adds a compact access-request card above manual setup. It explains
that Quick setup with Meta can connect either a new number or an
eligible existing number from the WhatsApp Business app, then opens the
existing support widget so the account can be reviewed. The enabled
state now uses the same customer-facing language.

Related: https://github.com/chatwoot/chatwoot/pull/15318

<img width="1428" height="1110" alt="CleanShot 2026-08-05 at 14 12
31@2x"
src="https://github.com/user-attachments/assets/914e5fd7-eb5a-438c-9706-0ecd8e004fbf"
/>


### Things to know

- The access card is Cloud-only and appears when the account-level
WhatsApp Quick setup feature is disabled.
- The global Meta incident restriction still takes precedence and
continues to show the existing incident warning.
- Manual setup remains available, and self-hosted behavior is unchanged.
- Requesting access opens Chatwoot support; it does not automatically
enable the account feature.
- Meta documents the existing WhatsApp Business app number path as
coexistence onboarding:
https://developers.facebook.com/documentation/business-messaging/whatsapp/embedded-signup/onboarding-business-app-users

### How to test

1. On Chatwoot Cloud, set `DISABLE_META_INBOX_CREATION` to `false`.
2. Open WhatsApp inbox creation for an account without
`whatsapp_embedded_signup_inbox_creation`.
3. Confirm the Quick setup with Meta request card appears above the
unchanged manual configuration form.
4. Select **Request access** and confirm the support widget opens.
5. Enable `whatsapp_embedded_signup_inbox_creation` for the account and
reload.
6. Confirm the enabled Quick setup with Meta screen appears and
describes both new numbers and eligible existing WhatsApp Business app
numbers.
7. Set `DISABLE_META_INBOX_CREATION` to `true` and confirm the incident
warning appears instead of the access-request card.

Co-authored-by: Muhsin <12408980+muhsin-k@users.noreply.github.com>
This commit is contained in:
Muhsin Keloth
2026-08-05 15:01:34 +04:00
committed by GitHub
parent 0669dc4ea5
commit 343bb15d07
2 changed files with 79 additions and 8 deletions

View File

@@ -301,7 +301,7 @@
"SUBMIT_BUTTON": "Create WhatsApp Channel",
"EMBEDDED_SIGNUP": {
"TITLE": "Quick setup with Meta",
"DESC": "Use the WhatsApp Embedded Signup flow to quickly connect new numbers. You will be redirected to Meta to log into your WhatsApp Business account. Having admin access will help make the setup smooth and easy.",
"DESC": "Use Quick setup with Meta to connect a new number or an existing number from the WhatsApp Business app. You will be redirected to Meta to log into your WhatsApp Business account. Having admin access will help make the setup smooth and easy.",
"BENEFITS": {
"TITLE": "Benefits of Embedded Signup:",
"EASY_SETUP": "No manual configuration required",
@@ -309,7 +309,7 @@
"AUTO_CONFIG": "Automatic webhook and phone number configuration"
},
"LEARN_MORE": {
"TEXT": "To learn more about integrated signup, pricing, and limitations, visit {link}.",
"TEXT": "To learn more about quick setup, pricing, and limitations, visit {link}.",
"LINK_TEXT": "this link"
},
"SUBMIT_BUTTON": "Connect with WhatsApp Business",
@@ -327,6 +327,12 @@
"SUCCESS_FALLBACK": "WhatsApp Business Account has been successfully configured",
"MANUAL_FALLBACK": "If your number is already connected to the WhatsApp Business Platform (API), or if youre a tech provider onboarding your own number, please use the {link} flow",
"MANUAL_LINK_TEXT": "manual setup flow",
"ACCESS_REQUEST": {
"TITLE": "Quick setup with Meta",
"DESCRIPTION": "Connect a new number or an existing number from the WhatsApp Business app without manual configuration. To request this option, tell our team what your business does, how youll use WhatsApp, and which Chatwoot account needs access.",
"FOOTNOTE": "Well review your request and let you know if this option can be enabled. You can also continue with manual setup below.",
"BUTTON": "Request access"
},
"RESTRICTED_WARNING": "WhatsApp Embedded Signup is temporarily unavailable due to an API-level issue on Metas side, not a problem with Chatwoot. You can use manual setup for eligible Cloud API numbers. Were working closely with Meta to resolve it as quickly as possible.",
"STATUS_LINK": "View status updates",
"CALLING_ENABLE_FAILED": "Your WhatsApp inbox is ready, but voice calling couldn't be turned on — this number isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then turn calling on from the inbox's Calls settings."

View File

@@ -8,6 +8,7 @@ import CloudWhatsapp from './CloudWhatsapp.vue';
import WhatsappEmbeddedSignup from './WhatsappEmbeddedSignup.vue';
import ChannelSelector from 'dashboard/components/ChannelSelector.vue';
import Banner from 'dashboard/components-next/banner/Banner.vue';
import Button from 'dashboard/components-next/button/Button.vue';
import Icon from 'dashboard/components-next/icon/Icon.vue';
import { useAccount } from 'dashboard/composables/useAccount';
import { FEATURE_FLAGS } from 'dashboard/featureFlags';
@@ -47,12 +48,27 @@ const isWhatsappEmbeddedSignupDisabled = computed(
() => isMetaInboxCreationDisabled.value
);
const isWhatsappEmbeddedSignupFeatureEnabled = computed(
() =>
!isOnChatwootCloud.value ||
isCloudFeatureEnabled(FEATURE_FLAGS.WHATSAPP_EMBEDDED_SIGNUP_FLOW)
);
const shouldShowWhatsappEmbeddedSignup = computed(() => {
return (
selectedProvider.value === PROVIDER_TYPES.WHATSAPP &&
hasWhatsappAppId.value &&
(!isOnChatwootCloud.value ||
isCloudFeatureEnabled(FEATURE_FLAGS.WHATSAPP_EMBEDDED_SIGNUP_FLOW))
isWhatsappEmbeddedSignupFeatureEnabled.value
);
});
const shouldShowEmbeddedSignupAccessRequest = computed(() => {
return (
selectedProvider.value === PROVIDER_TYPES.WHATSAPP &&
isOnChatwootCloud.value &&
hasWhatsappAppId.value &&
!isWhatsappEmbeddedSignupFeatureEnabled.value &&
!isWhatsappEmbeddedSignupDisabled.value
);
});
@@ -104,6 +120,10 @@ const shouldShowCloudWhatsapp = provider => {
const handleManualLinkClick = () => {
selectProvider(PROVIDER_TYPES.WHATSAPP_MANUAL);
};
const requestEmbeddedSignupAccess = () => {
window.$chatwoot?.toggle();
};
</script>
<template>
@@ -165,11 +185,56 @@ const handleManualLinkClick = () => {
<!-- Show manual setup -->
<div v-else-if="shouldShowCloudWhatsapp(selectedProvider)">
<div
v-if="shouldShowEmbeddedSignupAccessRequest"
class="w-full p-4 mb-6 border rounded-xl border-n-weak bg-n-solid-2"
>
<div class="flex flex-col gap-4 sm:flex-row sm:items-start">
<div
class="flex items-center justify-center flex-shrink-0 rounded-lg size-9 bg-n-blue-3"
>
<Icon icon="i-woot-whatsapp" class="size-5 text-n-slate-10" />
</div>
<div class="flex-1 min-w-0 text-start">
<div class="font-medium text-n-slate-12">
{{
$t(
'INBOX_MGMT.ADD.WHATSAPP.EMBEDDED_SIGNUP.ACCESS_REQUEST.TITLE'
)
}}
</div>
<p class="mt-1 text-sm leading-5 text-n-slate-11">
{{
$t(
'INBOX_MGMT.ADD.WHATSAPP.EMBEDDED_SIGNUP.ACCESS_REQUEST.DESCRIPTION'
)
}}
</p>
<p class="mt-2 text-xs leading-5 text-n-slate-10">
{{
$t(
'INBOX_MGMT.ADD.WHATSAPP.EMBEDDED_SIGNUP.ACCESS_REQUEST.FOOTNOTE'
)
}}
</p>
</div>
<Button
solid
blue
sm
class="self-start flex-shrink-0 sm:mt-0.5"
icon="i-lucide-life-buoy"
:label="
$t(
'INBOX_MGMT.ADD.WHATSAPP.EMBEDDED_SIGNUP.ACCESS_REQUEST.BUTTON'
)
"
@click="requestEmbeddedSignupAccess"
/>
</div>
</div>
<Banner
v-if="
isWhatsappEmbeddedSignupDisabled &&
selectedProvider === PROVIDER_TYPES.WHATSAPP_MANUAL
"
v-if="isWhatsappEmbeddedSignupDisabled"
color="amber"
class="w-full mb-6"
>