{#- About Zakat & Methodology. Deliberately a Jinja template rather than a string inside JavaScript or Python, so the educational content stays reviewable in diffs and testable by the template checks in tests/test_templates.py. Facts that are universally agreed are stated as such. Everything this tool *chooses* -- above all the layered pro-rata model -- is labelled as a choice. -#}

What zakat is

Zakat is the obligatory annual charitable due on qualifying wealth, one of the five pillars of Islam. It is a transfer of a defined share of accumulated wealth to defined categories of recipients, not a voluntary donation and not a tax on income. The Qur’an pairs it repeatedly with prayer (for example al-Baqarah 2:110) and sets out its recipients in al-Tawbah 9:60.

The three ideas this tool works with

Nisab
The minimum amount of wealth at which zakat becomes due. It is defined by a weight of metal, not a fixed currency amount, so its value in your currency moves with the metal price.
Sahib-e-nisab
A person whose zakatable net wealth meets or exceeds the nisab. This tool treats you as sahib-e-nisab for a basis whenever net zakatable wealth is greater than or equal to that basis’s nisab.
Hawl
The holding period: wealth must be held for one complete lunar year before zakat falls due on it. (Spelt hawl throughout; you will also see “haul” elsewhere.)

The constants

Values this extension uses. The rate and the hawl are universally agreed; the gram equivalents are not — see Limitations.
QuantityValue Status
Zakat rate{{ ctx.constants.rate }} (one fortieth) Universally agreed
Hawlone complete lunar year Universally agreed
Gold nisab {{ ctx.constants.gold_grams }} g = {{ ctx.constants.gold_tola }} tola Common standard; gram figure varies by institution
Silver nisab {{ ctx.constants.silver_grams }} g = {{ ctx.constants.silver_tola }} tola Common standard; gram figure varies by institution
Tola{{ ctx.constants.tola_grams }} g Definition used here, consistent across both weights
Mean lunar year{{ ctx.constants.lunar_year_days }} days Calculation constant — see Methodology step 6

The two bases are alternatives

The nisab is classically given either as a weight of gold or as a weight of silver. Because the metals have diverged enormously in relative price since those weights were set, the two thresholds are now very far apart — in this ledger, {{ m(gold.nisab) }} against {{ m(silver.nisab) }}.

This extension therefore computes both, completely independently, from the same wealth history, and presents them side by side. It does not pick one for you, and the two figures must never be added together. The silver basis is lower, so it captures more people and yields a larger liability; the gold basis is higher and yields a smaller one. Both positions are held by recognised scholarship, and which applies to you depends on your madhab and your own scholar’s guidance.

Methodology — exactly what this extension computes

Read this section carefully. The layered, pro-rata model below is this tool’s method for reconstructing historical liability from a ledger. It is not a standard scholarly formula, and most zakat guidance instead has you value your wealth once a year on your zakat anniversary and pay 2.5% of that. See Limitations.

  1. Select accounts. Only accounts carrying beancount_zakat metadata on their Open directive take part — as an asset, a liability, or an expense (zakat payments). Classification is exact: sub-accounts are not pulled in automatically.
  2. Build a wealth timeline. Postings to those accounts are replayed into running balances. Net zakatable wealth is sum(assets) + sum(liabilities). Liabilities keep their natural negative Beancount sign, so a debt reduces wealth by simple addition.
  3. Value everything. Holdings in a commodity other than the operating currency are converted at the most recent price dated at or before the valuation date. A snapshot is taken on every date a posting occurs and on every date a relevant price moves, so a holding is re-valued when its price changes even if you did not trade.
  4. Compute the nisab over time. Metal prices come from ordinary price directives in your own ledger. A day with no price of its own reuses the last known price. If no price exists at or before a date, the nisab is unknown and the report says so loudly — it is never quietly treated as zero.
  5. Slice the wealth into levels. Every distinct positive value your net wealth has ever taken becomes a level. Sorted ascending, each level’s marginal amount is the gap to the level below it. Each marginal slice then carries its own independent hawl, because that portion of your wealth was acquired at a different time.
  6. Time each slice. A slice’s holding period runs while net wealth stays at or above that slice’s level and total net wealth stays at or above the nisab. Period length is the inclusive day count, (end − start) + 1, converted to lunar years by dividing by {{ ctx.constants.lunar_year_days }} days.
  7. Handle resets. Falling below a slice’s level ends that slice’s period. Falling below the nisab ends it too, and is recorded as an explicit nisab-break row on the Calculation Detail tab. When wealth recovers, a new period begins from scratch — elapsed time is not carried over. Every period is judged entirely on its own.
  8. Charge each qualifying period. A period counts only once it reaches a full lunar year. Then:
    zakat_due = marginal_amount × elapsed_lunar_years × {{ ctx.constants.rate }}

    The stated position of this tool: the hawl is the condition that makes wealth zakatable — wealth must sit at or above the nisab for one complete lunar year before anything is owed on it — and not a restriction limiting liability to whole years. Once that condition is met, liability accrues in proportion to the time the wealth has been held. A slice held 3.34 lunar years is therefore charged 8.35% of that slice, not 7.5% for three completed anniversaries.

    This is a deliberate interpretive choice, and it is the single point on which this tool most clearly differs from the common practice of valuing wealth once a year on a fixed anniversary and paying 2.5% of that figure. It is well suited to paying accumulated zakat in Ramadan across however many years are outstanding. Raise the method itself with your scholar, not only the numbers. Year-by-year figures are on the Yearly Summary tab.

  9. Repeat for the other metal. Steps 5–8 run again, unchanged, against the other basis’s nisab.
  10. Apply payments last. Historical liability is computed first and is never altered by what you have paid. Payments are then subtracted to give a signed balance: positive means still owed, zero means discharged, negative means paid in excess. It is never clamped to zero.

Rounding

Every amount is computed in exact decimal arithmetic — never binary floating point. Each period’s zakat is rounded to {{ cur }} 0.01 using round-half-up at the moment it is computed; those rounded figures are what get summed. Only chart pixel coordinates are ever converted to floating point.

Allocation to reporting years

A reporting year on the Yearly Summary tab is a Hijri calendar year, 1 Muharram to the day before the next 1 Muharram, with exact Gregorian bounds from the Umm al-Qura calendar. A qualifying period that spans several years has its liability split across them pro rata by overlapping days, with the rounding residual placed on the period’s final year. The rows therefore sum to the cumulative total exactly; this is enforced by an automated test.

Calendar handling

Two different notions of “lunar year” are deliberately kept apart. The calculation uses only the mean lunar-year length of {{ ctx.constants.lunar_year_days }} days — pure arithmetic on day counts. The Umm al-Qura calendar is used only to label reporting years and show their Gregorian ranges. The choice of calendar library therefore cannot change a zakat amount. Exact conversion is supported for Hijri years 1343–1500 (1924-08-01 to 2077-11-16); a date outside that range is refused rather than silently approximated.

The as of date

The report cutoff is {{ report.as_of }}{% if ctx.filter_active %}, taken from Fava’s time filter{% else %}, which is today{% endif %}. Setting Fava’s time filter changes the cutoff: a filter ending 2026-10-01 gives you the position as at 2026-10-01. The filter moves the end only — the timeline always starts at inception, because hawl has to be measured from when wealth was actually acquired.

Two consequences matter. First, nothing dated after the cutoff can affect the result, so a forward-dated entry cannot inflate today’s figure. Second, your final balances are carried forward to the cutoff and keep accruing hawl even if your ledger has had no entry for years — a quiet ledger is not a zakat-free ledger.

Setting up your ledger

1. Tag your accounts

2020-01-01 open Assets:Bank:Savings      {{ cur }}
  beancount_zakat: "asset"

2020-01-01 open Liabilities:Loan-Payable {{ cur }}
  beancount_zakat: "liability"

2020-01-01 open Expenses:Donations:Zakat {{ cur }}
  beancount_zakat: "expense"

Metadata anywhere in your ledger tree works, including inside included files. Untagged accounts are ignored entirely, which is how you exclude personal-use assets such as a home or a car.

2. Record metal prices

2026-01-01 price GLDTOLA  280000.00 {{ cur }}
2026-01-01 price SLVTOLA    3300.00 {{ cur }}

GLDTOLA and SLVTOLA are understood out of the box as a price per tola. To quote per gram, or to use different symbols, declare them explicitly — being unambiguous about the unit is required:

2020-01-01 custom "fava-extension" "beancount_zakat.fava_extension" "{
  'metal_commodities': {'XAUGRAM': ['gold', 'gram'],
                        'XAGGRAM': ['silver', 'gram']},
}"

Other options: zakat_rate (write it as '2.5%' or 0.025), gold_nisab_grams, silver_nisab_grams, price_staleness_days.

Limitations and assumptions

Sources

Cited for the factual and religious claims above. The methodology in the previous section is not drawn from these sources — it is this software’s own construction, as stated. Web sources retrieved 2026-08-19.

Disclaimer

This tool is for informational and record-keeping purposes only. Zakat rulings can vary by school of jurisprudence, asset type, debt treatment, personal circumstances, locality, and scholar. The software may contain errors and does not constitute religious, legal, tax, accounting, or financial advice. Verify the inputs and calculations and consult a qualified Islamic scholar and appropriate professional before acting.