{% extends "portal_base.html" %} {% block title %}{{ campaign.name }} · Campaign{% endblock %} {% block topbar_title %}{{ campaign.name }}{% endblock %} {% block portal_content %}
{{ campaign.get_status_display }} {{ campaign.get_channel_display }} {% if campaign.scheduled_for %} Scheduled {{ campaign.scheduled_for|date:"M j, g:i A" }} {% endif %} Live · updates every 10s
← Campaigns
{% if campaign.channel == "email" or can_send %}

Send

{% if campaign.channel == "email" %}
{% csrf_token %}
Sends one [TEST] copy. Does not notify the recipient list.
{% endif %} {% if can_send %}
{% csrf_token %}

Enqueues draft / scheduled / failed messages via SMTP2GO (dev ImmediateBackend runs inline).

{% endif %}
{% endif %}
Messages
{{ stats.total }}
Sent
{{ stats.sent }}
Delivered
{{ stats.delivered }}
Opens
{{ stats.opens }}
Clicks
{{ stats.clicks }}
Bounced / failed
{{ stats.failed }}
Suppressed
{{ stats.suppressed }}

Engagement

Unique recipients: {{ stats.opens }} opened · {{ stats.clicks }} clicked ({{ stats.open_events }} open events / {{ stats.click_events }} click events from SMTP2GO).

Recent SMTP2GO events

{% for event in recent_events %} {% empty %} {% endfor %}
WhenEventContact
{{ event.created_at|date:"M j, g:i A" }} {{ event.event_type }} {% if event.message %}{{ event.message.contact }}{% else %}—{% endif %}
No webhook events yet. SMTP2GO must POST opens/clicks to /portal/messaging/webhooks/email/ (see messaging README). SMTP2GO’s own “Clicked” feed does not fill this table by itself.

Recipients

{% for message in messages %} {% empty %} {% endfor %}
ContactStatusProvider idError
{{ message.contact }}
{% if message.destination %}
{{ message.destination }}
{% endif %}
{{ message.get_status_display }} {{ message.provider_message_id|default:"—" }} {{ message.error|truncatechars:60|default:"—" }}
No messages on this campaign.
{% endblock %} {% block extra_js %} {% endblock %}