Skip to content
MyFam360 Blog
App Guide

Credit Card Annual Fees and the 'Worth Keeping' Verdict in MyFam360

How MyFam360 charges and tracks annual fees automatically, and the Family+ 'Worth Keeping' verdict that tells you whether the card is paying for itself.

MyFam360 Team 7 min read
MyFam360 worth-keeping verdict showing rewards vs annual fee comparison

An Axis Magnus charges a ₹12,500 annual fee. A SimplyClick is ₹499. A Tata Neu Infinity is ₹1,499 (often waived). At any given moment, a typical cardholder owns 2–4 cards costing somewhere between ₹3,000 and ₹20,000 a year just to exist — fees the bank charges whether or not you use the card.

The question every cardholder should answer once a year: is this card paying for itself?

MyFam360’s annual fee tracking and the Family+ Worth Keeping verdict are built to answer that question with real numbers rather than gut feel.

This post explains how the annual-fee scheduler works, how waivers are detected, and what the Worth Keeping verdict actually computes.


The Annual-Fee Scheduler

A separate scheduler from the statement materialiser runs daily at 03:35 UTC. (The 5-minute offset from the data-retention job at 03:30 prevents the two long-running jobs from colliding on a shared connection.)

The job:

  1. Iterates every active, non-deleted credit_account row.
  2. Checks the card’s anniversary_month (computed from created_at).
  3. If the current month matches the anniversary month:
    • Computes the current year_marker (e.g., 2026-Y2 for the second year since opening).
    • Queries audit_logs for any existing row with (card_id, action IN ('annual_fee_charged', 'annual_fee_waived'), year=year_marker).
    • If no row exists, evaluates the waiver threshold (next section) and writes the appropriate audit row.

The idempotency check is the key — by querying for an existing audit row before writing, the job is safe to run any number of times in the same day.


How Waiver Detection Works

Most Indian issuers waive the annual fee if you meet a spend milestone in the qualifying year. MyFam360 models this with a single field on the card’s economics record:

FieldTypeDefaultMeaning
annual_feeDecimalvariesThe fee charged if not waived
annual_fee_waiver_thresholdDecimalnullThe 12-month spend needed to waive
surcharge_waiver_amountDecimalnullPer-transaction surcharge waiver (e.g., fuel)

When the scheduler runs in the anniversary month, it sums the card’s mirror-account expenses over the past 12 months (Python Decimal accumulator, per Critical Learning v1.43). If the sum meets or exceeds annual_fee_waiver_threshold, the job writes annual_fee_waived; otherwise annual_fee_charged.

Both writes include the spend total in the audit log’s after JSONB, so you can always trace why a fee was charged or waived.


What an Annual Fee Looks Like in the App

Once charged, the fee appears in two places:

The Card’s Transaction List

A system-generated entry with:

  • Date: the anniversary day
  • Description: “Annual fee charged for Y2 (2026-04-19 to 2027-04-18)”
  • Amount: the configured annual fee
  • Category: a system “Card Fees” category
  • Source: marked as system-generated, not editable

The entry increments the card’s current_outstanding (so your next statement will include the fee) and shows up in your Reports as a fee line item.

A small “Last fee charged” line showing the date, amount, and whether it was charged or waived. The line is informational; the audit log is the source of truth.


The Worth Keeping Verdict (Family+)

The verdict is a simple comparison wrapped in a useful UI.

For each card, MyFam360 computes:

  • Rewards earned (last 12 months) — sum of all earn and bonus rows in the ledger.
  • Annual fee paid (last 12 months) — from the audit log.
  • Net = rewards earned − annual fee paid.

The verdict:

NetVerdictUI
≥ 0Worth keepingGreen check
-₹0 to -₹1,000BorderlineAmber question mark
> -₹1,000ReconsiderRed X

The borderline band reflects the reality that a slightly net-negative card can still be worth keeping for non-monetary reasons (credit score history, larger limit, partner discounts).

A card that’s net-negative for two consecutive years triggers a stronger nudge — a banner suggesting either a downgrade (most issuers have a lower-fee variant of the same card) or closure.

The verdict is endpoint-backed at GET /rewards/economics/worth-keeping. Pro plans can view the underlying economics fields read-only; only Family+ unlocks the verdict surface.


Editing Economics (Pro+)

The card’s annual fee and waiver threshold are user-editable on the Economics tab. This is gated to Pro and Family+ plans.

Why edit? Most often:

  • The issuer changes the fee structure (HDFC switched several cards from ₹499 to ₹999 in 2023).
  • You negotiated a fee waiver directly with the issuer.
  • You picked the wrong preset and the defaults don’t match your card.

The form fields:

FieldDescription
APRAnnual percentage rate for finance charges
Annual feeCard-level fee in rupees
Waiver threshold12-month spend needed to waive
Base earn rateThe fallback rate when no rule matches

Editing the annual fee doesn’t retroactively change historical audit entries — only the next scheduler run uses the new value.


The Audit Trail

Every annual-fee event lands in audit_logs with rich context:

{
  "action": "annual_fee_charged",
  "entity_type": "credit_account",
  "entity_id": "card-uuid",
  "after": {
    "year": "Y2",
    "fee_amount": 999.0,
    "spend_in_qualifying_period": 184500.0,
    "waiver_threshold": 300000.0,
    "decision_reason": "spend below waiver threshold"
  }
}

You can query this in the Activity feed or — for admins — through the database directly. The audit log is the source of truth for fee history; the card’s “Last fee charged” line is a cached projection of the most recent entry.


What This Means For You

The single high-leverage habit: on Family+, check the Worth Keeping verdict once a year, in the month before each card’s anniversary.

For each card showing as borderline or net-negative:

  1. Look at the rewards earned figure. If it’s low and you’re rarely using the card, downgrade or close it.
  2. Check if the issuer has a lower-fee variant. Most issuers will downgrade you on request rather than lose the customer.
  3. If you decide to keep a net-negative card, make a deliberate choice. The non-monetary reasons (credit history, limit headroom) are real but should be conscious.

Across a typical Indian middle-income cardholder with 3 cards, this exercise saves ₹2,000–₹5,000 a year just from cutting one underperforming card.


See Also

Take control of your family finances — free

MyFam360 lets your whole family track expenses, set budgets, and hit savings goals together. Free to start, no credit card needed.

Free plan available · No credit card required · Cancel anytime

Frequently Asked Questions

When does the annual fee get charged in MyFam360?

Daily at 03:35 UTC, a scheduled job walks every active card whose anniversary month matches the current month and checks whether the annual fee has been charged for the current year. If not (and the fee is non-waived), the job writes an audit_logs row with action='annual_fee_charged' and the configured amount. The check is idempotent per (card_id, year), so the same fee can't be charged twice.

Why doesn't the annual fee insert a credit_payments row?

Because credit_payment.credit_statement_id is NOT NULL. Every payment must belong to a statement, and an annual fee charge isn't tied to a specific statement — it's a card-level event. Also, record_payment decrements outstanding (the wrong direction for a fee charge, which should increase outstanding). The audit_logs row captures the event without polluting the payment ledger. The fee shows up in the card's transaction list as a system-generated entry.

How does the fee waiver work?

Most issuers waive the annual fee if you meet a spend milestone (e.g., ₹3,00,000 spend in the year). You configure the milestone on the card's economics page (annual_fee_waiver_threshold). When the annual-fee scheduler runs and your last 12 months of spend on the card meet the threshold, it writes action='annual_fee_waived' instead of charged. The card's audit log shows both the threshold check and the waiver decision.

What is the 'Worth Keeping' verdict?

A Family+ feature that compares the card's accumulated rewards (over the last 12 months) against its annual fee, factoring in any waiver. The verdict is a simple boolean — net positive or net negative — with the underlying numbers visible. If the card's net is negative for two consecutive years, MyFam360 flags it as a candidate for closure or downgrade.

Can I see historical annual fee charges and waivers?

Yes. The card's audit log (visible in the Activity feed filtered by entity_type='credit_account' and action prefix 'annual_fee_') shows every fee event. Each entry has the year, the amount, the decision (charged or waived), and the spend at the time of decision if a waiver threshold was checked. The list is exportable to CSV from the card detail page.

What if I closed the card mid-year?

Closing a card in MyFam360 is a soft-delete on the credit_accounts row. The annual-fee scheduler skips soft-deleted cards. If you closed the card after the fee was already charged for the current year, the fee stays as a historical audit_log entry — that matches reality, since the issuer already charged you. If you closed before the anniversary, no fee is charged.

Share this article