{% extends "base.html" %} {% load static %} {% comment %} One flow's stats page (SPEC §18: "Flow detail page renders totals and per-node overlay in the builder" — the overlay is the builder's; this is the page). Three things, in the order a reader wants them: what happened in total, how it moved over the range, and which node did it. The builder shows the same counters as chips on the canvas; a table is what you read, a chip is what you glance at. The chart data crosses into JavaScript through `json_script` rather than through an interpolated script body. The page's CSP is nonce-based (SECURITY-BASELINE §8) and Chart.js is served from 'self' (`scripts/vendor-js.mjs` vendored it for this issue), so nothing here reaches a CDN. {% endcomment %} {% block title %}{{ flow.name }} · Analytics · DemandTrail Messaging{% endblock %} {% block page_header %}

{{ flow.name }}

Counters for the last {{ days }} days. {{ flow.get_status_display }}

{% include "analytics/_range.html" %} All analytics Open in builder
{% endblock %} {% block content %} {% include "analytics/_counter_cards.html" %}
Trend One point per UTC day. Preview runs are not counted.
Steps A step you deleted keeps its numbers. Those messages still went out.
{% if node_rows %}
{# Clicks per send, not a click-through rate — it can exceed 100%. #} {% for row in node_rows %} {% endfor %}
Step Sent Delivered Failed ClickedClicks/send
{{ row.node_id }} {% if row.type %}{{ row.type }}{% endif %} {{ row.sent }} {{ row.delivered }} {{ row.failed }} {{ row.clicked }} {% if row.ctr is not None %}{{ row.ctr }}%{% else %}N/A{% endif %}
{% else %}

This flow has not sent anything in this range.

{% endif %}
{{ chart|json_script:"flow-trend-data" }} {% endblock %} {% block extra_js %} {% endblock %}