{% extends "base.html" %} {% block title %}Recurring Charges - Fin{% endblock %} {% block content %}

Recurring Charges

← Back to Dashboard  |  Showing charges from last {{ days }} days

{% if all_accounts %}
{% for acc in all_accounts %} {% set is_selected = (acc['account_id'] in selected_accounts) if selected_accounts else (not show_no_data) %} {% endfor %}
{% if selected_accounts or show_no_data %} All Accounts {% endif %}
{% endif %}

Subscriptions ({{ subscriptions|length }})

Click to see transactions Export CSV
{% if subscriptions %}
{% for sub in subscriptions %} {% set merchant = sub[0] %} {% set monthly_cents = sub[1] %} {% set cadence = sub[2] %} {% set first_seen = sub[3] %} {% set last_seen = sub[4] %} {% set is_dup = sub[5] %} {% set txn_type = sub[6] %} {% set is_known = sub[7] %} {% set display_name = sub[8] %} {% set actual_charge = sub[9] %} {% set cadence_label = 'Billed annually' if cadence == 'annual' else 'Billed quarterly' if cadence == 'quarterly' else 'Billed weekly' if cadence == 'weekly' else 'Billed biweekly' if cadence == 'biweekly' else '' %}
{% if txn_type == 'insurance' %}🛡{% else %}🔄{% endif %}
{% if display_name %}{{ display_name }}{% else %}{{ merchant }}{% endif %} {% if is_known %}✓ Known{% endif %} {% if is_dup %}duplicate?{% endif %}
{% if cadence_label %}{{ cadence_label }} (${{ "%.2f"|format(actual_charge / 100) }}) • {% endif %}Since {{ first_seen.strftime('%b %Y') }} {% if display_name and display_name != merchant %}• {{ merchant }}{% endif %}
${{ "%.2f"|format(monthly_cents / 100) }}/mo
{% endfor %}
{% else %}

No subscriptions detected yet.

Subscriptions are detected after 3+ recurring charges with consistent timing.

{% endif %}

Utility Bills ({{ bills|length }})

Click to see transactions
{% if bills %}
{% for bill in bills %} {% set merchant = bill[0] %} {% set monthly_cents = bill[1] %} {% set cadence = bill[2] %} {% set first_seen = bill[3] %} {% set last_seen = bill[4] %}
{% set bill_cadence_label = 'Billed annually' if cadence == 'annual' else 'Billed quarterly' if cadence == 'quarterly' else 'Billed bimonthly' if cadence == 'bimonthly' else '' %}
{{ merchant }}
{% if bill_cadence_label %}{{ bill_cadence_label }} • {% endif %}Since {{ first_seen.strftime('%b %Y') }}
${{ "%.2f"|format(monthly_cents / 100) }}/mo
{% endfor %}
{% else %}

No utility bills detected.

Bills include electric, gas, internet, and phone services.

{% endif %}
{% if duplicates %}

Possible Duplicates ({{ duplicates|length }})

{% for dup in duplicates %}
{% if dup.severity == 'high' %}🔴{% else %}🟡{% endif %}
{{ dup.detail }} ${{ "%.2f"|format(dup.total_monthly_cents / 100) }}/mo
{% for item in dup.items %} {{ item[0] }} (${{ "%.2f"|format(item[1] / 100) }}/mo, {{ item[2] }}){% if not loop.last %}, {% endif %} {% endfor %}
{% endfor %}
{% endif %} {% endblock %}