{% 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" %}
{% include "partials/_platform_icon.html" with platform=platform_key size="lg" only %}

Connect a WhatsApp number

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.

{% if error %}
{{ error }}
{% endif %}

Before you paste

  1. In Business Manager, open WhatsApp Accounts and copy the WhatsApp Business Account ID.
  2. Open the number under that account and copy its phone number ID (the API ID, not the number).
  3. Create a system user with whatsapp_business_messaging and whatsapp_business_management, then generate a permanent token for it.
{% csrf_token %}

Paste the three values

{% include "partials/_auth_form_fields.html" with form=form %}

What happens next

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 %}
Back to channels
{% endwith %} {% endblock %}