{% extends "layouts/workspace_settings.html" %} {% load common_extras %} {% comment %} Connect a WhatsApp number. Same shape as telegram_connect.html — see the note there for why content_wrap is cleared and why the platform key is written once. The one page here with a real Django form, so the fields come from partials/_auth_form_fields.html rather than being written out longhand. That also gets the form's help_text and per-field errors rendered, which {{ form.as_p }} was dropping into unstyled markup. .cn-form is what styles the controls: _auth_form_fields.html emits {{ field }} and cannot put a class on a widget. Do NOT add attrs={"class": ...} in forms_whatsapp.py instead — @source in styles.css does not scan apps/, so a class name generated there never reaches the bundle. access_token is a PasswordInput(render_value=False), which is what keeps the token out of the response on a failed submit. Nothing here re-renders it. {% endcomment %} {% block title %}Connect WhatsApp · DemandTrail Messaging{% endblock %} {% block content_wrap %}{% endblock %} {% block content %} {% with platform_key="whatsapp" %}
This is the direct-from-Meta path: you generate a permanent system user token in Business Manager and paste it here. It is stored encrypted and never shown again.
whatsapp_business_messaging and
whatsapp_business_management, then generate a permanent token for it.
We prove the token against Meta before anything is written, then subscribe the account to this deployment.
{% include "partials/_copy_field.html" with label="Deliveries arrive at" value=webhook_url hint="Paste this into the app's WhatsApp webhook configuration, with the verify token shown there. Full setup notes are in docs/channels/whatsapp.md." only %}