Copy-paste formulas are only useful when the database contract is equally copy-pasteable. In Notion, the same expression can fail because a property was renamed, a rollup returns a list instead of a number, an empty denominator is treated as zero, or a percentage is scaled twice.

This guide defines the properties first, then gives formulas for per-trade values and period summaries. Every percentage formula below returns a decimal fraction for Notion’s Percent number format: 0.5714 displays as 57.14%.

The short answer: paste formulas only after matching every property name and type exactly. Guard each denominator, filter summaries to reconciled eligible trades, and test zero, blank, win, loss, and breakeven rows before trusting a dashboard. Notion’s formula editor is case-sensitive.

1. Create the Database Contract First

Use one Trade Log database for source rows and one Performance Summary database for a month, strategy, account, or other declared cohort. Link them with a Relation. A summary row only describes the trade rows actually related to it.

Trade Log — source properties
Net P&Lafter the costs included in your policy
Number
Planned Riskpositive amount in the same unit
Number
Stop Distancepositive pips, points, ticks, or price units
Number
Target Distancesame unit as Stop Distance
Number
OutcomeWin, Loss, or Breakeven
Select
Eligiblechecked only after reconciliation
Checkbox
In Planchecked from a predeclared rule
Checkbox

Property names must match, including capitalization, spaces, and punctuation. If you prefer another name or currency, change both the property and every prop("…") reference. The broader trading-journal field guide explains why source IDs, timestamps, costs, account currency, and strategy version belong beside these inputs.

2. Notion Formula Syntax That Causes Silent Errors

  • Percent format expects a fraction. Return 0.25 to display 25%; do not return 25 and then apply Percent formatting.
  • empty(0) is true. A generic empty check can treat a legitimate zero like a blank. Use a separate eligibility or readiness field when zero and missing must be distinguished.
  • Formula output is not a cohort. A summary depends on which pages are related, not which rows happen to be visible in a filtered view.
  • Types must line up. A rollup configured to “Show original” is a list; the formulas below require numeric Sum rollups.
  • HTML must escape comparison operators. In article source, write &lt; for a literal less-than sign inside a formula block. The reader must see <.

3. Copy-Paste Per-Trade Formulas

Create these as Formula properties in the Trade Log. Numeric formulas return 0 when the denominator is absent or invalid. Treat that zero as a guard value until Eligible is checked; it is not evidence that the metric was measured.

R Multiple
Number
lets( pnl, prop("Net P&L"), risk, prop("Planned Risk"), if(or(not prop("Eligible"), risk <= 0), 0, round(pnl / risk * 100) / 100) )

Net outcome divided by planned risk. Both inputs need the same currency or normalized unit. A partial loss can be greater or smaller than negative one R; the formula reports the record rather than assuming every loss hit the initial stop.

Planned Reward-to-Risk
Number
lets( stop, prop("Stop Distance"), target, prop("Target Distance"), if(or(empty(stop), stop <= 0, empty(target)), 0, round(target / stop * 100) / 100) )

This describes the plan at entry, not the realized R multiple. Stop and target must use the same distance unit. A zero result is a missing/invalid-input sentinel unless zero target distance is intentionally allowed by your schema.

Eligible Trade
Number: 0 or 1
if(prop("Eligible"), 1, 0)

Use the sum of this helper as the denominator. Cancelled orders, duplicate imports, open trades, and unreconciled rows stay unchecked and do not dilute win rate or expectancy.

Winning Trade
Number: 0 or 1
if(and(prop("Eligible"), prop("Outcome") == "Win"), 1, 0)

The exact spelling of the Select option must match. Breakevens remain eligible but are not wins, so the denominator stays explicit.

In-Plan Trade
Number: 0 or 1
if(and(prop("Eligible"), prop("In Plan")), 1, 0)

Define “in plan” before the session. This flag measures recorded adherence; it does not establish that the plan is profitable or that a profitable exception was good process.

Gross Profit
Number
if(and(prop("Eligible"), prop("Net P&L") > 0), prop("Net P&L"), 0)

Positive eligible outcomes only. Sum this property in the summary database.

Gross Loss
Positive magnitude
if(and(prop("Eligible"), prop("Net P&L") < 0), abs(prop("Net P&L")), 0)

The source loss stays negative in Net P&L; this helper returns its positive magnitude for profit-factor arithmetic. The escaped less-than operator prevents the web page from truncating the formula.

4. Copy-Paste Performance Summary Formulas

Relate the intended Trade Log rows to one Performance Summary row. Add numeric Rollups using Sum for Eligible Trade, Winning Trade, Net P&L, Gross Profit, Gross Loss, R Multiple, and In-Plan Trade. Name the results exactly as follows:

Summary rollupTrade Log propertyCalculation
Eligible TradesEligible TradeSum
Winning TradesWinning TradeSum
Total Net P&LNet P&LSum
Total Gross ProfitGross ProfitSum
Total Gross LossGross LossSum
Total RR MultipleSum
In-Plan TradesIn-Plan TradeSum
Summary Readiness
Text
ifs( prop("Eligible Trades") == 0, "No eligible trades", prop("Total Gross Loss") == 0 and prop("Total Gross Profit") > 0, "Profit factor undefined: no losing trades", prop("Total Gross Loss") == 0, "Profit factor not available", "Ready" )

Read this beside every numeric summary. A guarded zero prevents an error but must not masquerade as a measured profit factor.

Win Rate
Number → Percent
lets( n, prop("Eligible Trades"), if(n == 0, 0, round(prop("Winning Trades") / n * 10000) / 10000) )

Format as Percent with two decimal places. The output stays on a zero-to-one scale; do not multiply it by 100 again. Interpret it with payoff distribution and the expectancy formula.

Profit Factor
Number
lets( loss, prop("Total Gross Loss"), if(loss <= 0, 0, round(prop("Total Gross Profit") / loss * 100) / 100) )

Gross profit divided by the positive magnitude of gross loss. When loss is zero, the numeric guard returns zero and Summary Readiness explains why the ratio is undefined. Do not label a fixed range “good” without costs, exposure, path, concentration, dependence, and uncertainty; see the profit-factor interpretation guide.

Net Expectancy per Eligible Trade
Number
lets( n, prop("Eligible Trades"), if(n == 0, 0, round(prop("Total Net P&L") / n * 100) / 100) )

This is the historical mean of the included net outcomes, not a daily-income promise. Keep the unit, date range, eligibility policy, costs, sample size, uncertainty, and strategy version visible.

Average R per Eligible Trade
Number
lets( n, prop("Eligible Trades"), if(n == 0, 0, round(prop("Total R") / n * 100) / 100) )

This averages realized R multiples. It is not “average R:R”: reward-to-risk is the entry plan, while realized R is an outcome normalized by planned risk.

Plan Adherence
Number → Percent
lets( n, prop("Eligible Trades"), if(n == 0, 0, round(prop("In-Plan Trades") / n * 10000) / 10000) )

Format as Percent. Use a predeclared checklist and audit missing labels; no universal adherence percentage proves discipline or future profitability.

5. Test the Formulas Before Using Them

Create a temporary summary linked to controlled test rows. The minimum acceptance matrix is:

CaseExpected resultFailure it catches
No eligible tradesAll guarded metrics 0; readiness explains absenceDivision by zero
Eligible win onlyWin rate 100%; PF undefined stateFalse finite profit factor
Eligible loss onlyWin rate 0%; gross loss positiveNegative PF denominator
One win, one loss, one breakevenThree-trade denominatorBreakeven silently excluded
Unreconciled duplicateNo change until Eligible is checkedDuplicate dilution
Zero or blank Planned RiskR guard returns 0; row remains not readyInfinite or misleading R
Win-rate result 0.5714Percent display 57.14%Double percentage scaling

Change one input at a time and compare the Notion result with hand arithmetic. The copy-paste expression is not verified for your workspace until these rows pass with your actual property types.

6. Prop-Rule Formulas: Store the Rule Before Calculating It

A generic percentage of “current balance” is not a universal daily-loss or maximum-drawdown formula. A named program may use balance, equity, a start-of-day reference, an intraday high-water mark, static or trailing thresholds, specific reset timezones, and different treatment of open P&L, fees, payouts, or platform events.

For a rule independently verified as static, store Reference Value, Maximum Loss Amount, Current Rule Value, Rule Type, Verified On, and Official Rule URL. Then these arithmetic helpers are safe only within that snapshot:

Static Loss Floor
Number
if( or(prop("Rule Type") != "Static", empty(prop("Reference Value")), empty(prop("Maximum Loss Amount"))), 0, prop("Reference Value") - prop("Maximum Loss Amount") )
Configured Rule Status
Text
ifs( empty(prop("Verified On")), "Not verified", empty(prop("Official Rule URL")), "Not verified", prop("Rule Type") != "Static", "External calculation required", prop("Current Rule Value") <= prop("Static Loss Floor"), "Boundary reached", "Configured" )

Do not adapt these helpers to trailing or intraday rules by changing one label. Those calculations require a time-ordered path and the exact current rule. The Notion prop-firm tracker guide covers the schema boundary; official program terms remain controlling.

7. What Notion Formulas Cannot Prove by Themselves

Formula 2.0 can work with properties on related pages using list functions such as map and filter. That is more capable than a strict “one row only” model. It still does not create a reliable ordered ledger automatically: previous-event semantics, intraday marks, corrections, partial fills, and deterministic cumulative state must be modeled and sourced.

A relation or rollup can aggregate linked pages, but it does not prove the relation is complete, deduplicated, correctly ordered, or reconciled to the broker or venue. A chart can visualize a prepared series; it cannot recover missing events. Trailing drawdown and breach replay need a source-frequency event path and a versioned rule engine, not a manually updated current-balance cell.

Where TSB Fits When Notion Reaches Its Boundary

Ownership disclosure: Trader’s Second Brain is our product. Notion is flexible for a hand-built log, custom notes, and transparent formulas. TSB is the relevant alternative when the decision needs repeatable imports, source reconciliation, account-aware fields, and a versioned analysis workflow. TSB recognizes 328 structured source profiles through canonical runtime truth.

That is not a claim that every import is complete or that TSB certifies program compliance. Preserve the source export, account and currency, import range, duplicate policy, excluded rows, rule snapshot, and reconciliation totals. Missing decisive data remains Not verified. The import-format guide explains the acceptance checks.

Decision rule: keep Notion when manual entry and custom schema are acceptable; use an import-led workflow when lineage, reproducibility, event volume, or exact rule replay matters.

Compare the TSB workflow →

Methodology and Verification

This guide was reviewed on September 9, 2026 against Notion’s official formula syntax and functions, formula-error guidance, and relations and rollups documentation. The official syntax supports property references, comparisons, logical operators, if/ifs, let/lets, list functions, and numeric rollup calculations; the formula editor requires exact property references and compatible data types.

The prior page’s broken less-than HTML, incomplete challenge-status expression, double-scaled percentages, generic program rules, universal performance thresholds, deterministic profitability claims, and undocumented TSB automation claims were withdrawn. Production remains read-only until a separately authorized import.

Final Verdict: Copy the Contract, Not Just the Formula

A robust Notion trading formula names its input type, cohort, missing state, denominator, output scale, and acceptance test. Start with eligible reconciled rows, use positive loss magnitude only where the metric requires it, keep Percent outputs on a zero-to-one scale, and expose undefined ratios instead of decorating them as zero.

Formulas can make a journal consistent. They cannot make incomplete source data complete or turn a historical mean into proof of an edge. Treat each summary as a versioned calculation whose inputs can be inspected and reproduced.