{% extends "layouts/workspace_settings.html" %} {% load common_extras %} {% comment %} One connection: what it is, whether it is working, what the platform can carry, and the two things you can do to it. The same shape as the connect pages — see channels/telegram_connect.html for why content_wrap is cleared and why the platform key goes through platform_class rather than being interpolated by hand. This is the page those flows land on, so it carries the same hero mark and the same copy field. **State is one sentence, not two rows.** This page used to print "Status: Active" and "Last event received: 3 days ago" as separate entries in a
, which is precisely the split apps.channels.views._health exists to close: a bot pointed at the wrong URL looks exactly like a bot nobody has messaged, and only the elapsed time tells them apart. The list page's cards have said it as one sentence since the redesign; now this one does too. Never renders the webhook secret — see the views module docstring. {% endcomment %} {% block title %}{{ connection.display_name }} · DemandTrail Messaging{% endblock %} {% block content_wrap %}{% endblock %} {% block content %}
{% include "partials/_platform_icon.html" with platform=connection.platform size="lg" only %}

{{ connection.display_name }}

{{ label }}

{{ health.text }}

This connection

Account identifier {{ connection.external_id }}
{% if settings_url %} {% endif %}
{% include "partials/_copy_field.html" with label="Webhook URL" value=webhook_url hint="Where this platform delivers to. It contains the connection's id, so it is unique to this channel." only %}
{% comment %} Read from the static tables in apps.channels.capabilities / .policy, not from the adapter (ROADMAP contract 4), so this panel is complete for a platform whose adapter has not shipped. {% endcomment %}

What this platform carries

Text Up to {{ capabilities.max_text_len }} characters
Buttons {% if capabilities.max_buttons %}Up to {{ capabilities.max_buttons }}{% else %}Not supported: buttons become numbered replies{% endif %}
Quick replies {% if capabilities.max_quick_replies %}Up to {{ capabilities.max_quick_replies }}{% else %}Not supported: quick replies become numbered replies{% endif %}
Carousels {% if capabilities.gallery %}Supported{% else %}Sent as sequential messages{% endif %}
Messaging window {% if policy.window_hours %}{{ policy.window_hours }} hours after the contact's last message{% else %}None{% endif %}
Broadcasts {% if policy.broadcast_allowed %}Allowed{% else %}Not allowed on this platform{% endif %}
{% if connection.platform == "email" %} {% comment %} The test posts to a JSON endpoint that answers 200 even when the send fails. The request succeeded; what it reports is the state of somebody else's mail configuration. Rendered as a plain form so it works without JavaScript; the response is a small JSON document the browser shows. {% endcomment %}
{% csrf_token %}

Bounce handling

Both of these can only be set after the channel exists, because the webhook URL above contains its id, so you create the endpoint in your provider first, then paste back what it gives you. Until the relevant one is set, bounce and complaint notifications are ignored rather than trusted.

From the Resend webhook you pointed at the URL above. Stored encrypted.

Only this topic's notifications are accepted.

Leave a field blank to keep what is already stored.
{% csrf_token %}

Send a test email

Sends one real email to your own account address, through this connection, carrying the same List-Unsubscribe headers and footer every other send does, so a provider that strips them shows up here rather than after a campaign.

{% endif %}
{% csrf_token %}

Webhook secret

Stored encrypted and never displayed again. Rotating issues a new secret immediately, so deliveries carrying the old one are rejected until the platform has the new one. Where the platform accepts it over its own API, as Telegram does, that happens as part of rotating, and the next page says so.

Back to channels
{% endblock %}