<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Richard C</title>
    <description>The latest articles on DEV Community by Richard C (@richardc_ailstudio).</description>
    <link>https://dev.to/richardc_ailstudio</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4208209%2F83830afb-9163-4856-88bd-a56c5b5f3442.png</url>
      <title>DEV Community: Richard C</title>
      <link>https://dev.to/richardc_ailstudio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/richardc_ailstudio"/>
    <language>en</language>
    <item>
      <title>How to catch a subscription price increase in Google Sheets</title>
      <dc:creator>Richard C</dc:creator>
      <pubDate>Tue, 27 Oct 2026 06:11:48 +0000</pubDate>
      <link>https://dev.to/richardc_ailstudio/how-to-catch-a-subscription-price-increase-in-google-sheets-5c4</link>
      <guid>https://dev.to/richardc_ailstudio/how-to-catch-a-subscription-price-increase-in-google-sheets-5c4</guid>
      <description>&lt;p&gt;By Richard C · AIL Studio&lt;/p&gt;

&lt;p&gt;A $2 bump on a weekly meal kit looks small on the statement. Put it on a monthly scale and it's about $8.67 more every month, or roughly $104 a year. Merchants rarely email a clear "we're raising your price" note, so the new amount just shows up. This post builds a small Google Sheets check that compares the old price to the new one, converts the hike to a monthly cost, and flags anything that went up.&lt;/p&gt;

&lt;p&gt;It works the same way in Excel. No scripts.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Still hunting for the charges themselves?&lt;/strong&gt; Start with &lt;a href="https://ailstudio.gumroad.com/l/ipnphp?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=how-to-catch-a-subscription-price-increase-in-google-sheets" rel="noopener noreferrer"&gt;Subscription Audit Lite (free, $0+)&lt;/a&gt;, a 30-row sheet that totals recurring charges and shows what cancelling would save. Then come back and add the price-change columns below.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  1. The columns
&lt;/h2&gt;

&lt;p&gt;One row per subscription. You type the name, the last price you paid, the new price, and the billing cycle. Everything else is a formula.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;A&lt;/th&gt;
&lt;th&gt;B&lt;/th&gt;
&lt;th&gt;C&lt;/th&gt;
&lt;th&gt;D&lt;/th&gt;
&lt;th&gt;E&lt;/th&gt;
&lt;th&gt;F&lt;/th&gt;
&lt;th&gt;G&lt;/th&gt;
&lt;th&gt;H&lt;/th&gt;
&lt;th&gt;I&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Service&lt;/td&gt;
&lt;td&gt;Old cost&lt;/td&gt;
&lt;td&gt;New cost&lt;/td&gt;
&lt;td&gt;Billing cycle&lt;/td&gt;
&lt;td&gt;Delta ($)&lt;/td&gt;
&lt;td&gt;Monthly impact&lt;/td&gt;
&lt;td&gt;% change&lt;/td&gt;
&lt;td&gt;Flag&lt;/td&gt;
&lt;td&gt;Keep/Cancel&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Example data&lt;/strong&gt; (made-up subscriptions for illustration, not real charges):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Row&lt;/th&gt;
&lt;th&gt;A: Service&lt;/th&gt;
&lt;th&gt;B: Old cost&lt;/th&gt;
&lt;th&gt;C: New cost&lt;/th&gt;
&lt;th&gt;D: Cycle&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Streaming service&lt;/td&gt;
&lt;td&gt;15.49&lt;/td&gt;
&lt;td&gt;17.99&lt;/td&gt;
&lt;td&gt;Monthly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Cloud storage&lt;/td&gt;
&lt;td&gt;9.99&lt;/td&gt;
&lt;td&gt;11.99&lt;/td&gt;
&lt;td&gt;Monthly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;News site&lt;/td&gt;
&lt;td&gt;79.00&lt;/td&gt;
&lt;td&gt;99.00&lt;/td&gt;
&lt;td&gt;Yearly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Music app&lt;/td&gt;
&lt;td&gt;10.99&lt;/td&gt;
&lt;td&gt;10.99&lt;/td&gt;
&lt;td&gt;Monthly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Fitness app&lt;/td&gt;
&lt;td&gt;39.99&lt;/td&gt;
&lt;td&gt;49.99&lt;/td&gt;
&lt;td&gt;Yearly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Meal kit&lt;/td&gt;
&lt;td&gt;12.00&lt;/td&gt;
&lt;td&gt;14.00&lt;/td&gt;
&lt;td&gt;Weekly&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Row 5 did not change. Leave it in the list so unchanged plans stay visible next to the ones that moved. Column I is optional: type Keep, Cancel or Review after you decide.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. A small cycle lookup (so weekly hikes count correctly)
&lt;/h2&gt;

&lt;p&gt;Nested &lt;code&gt;IF&lt;/code&gt;s break when you add a cycle. Put the cycles on a &lt;code&gt;Lists&lt;/code&gt; sheet instead:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cycle (A)&lt;/th&gt;
&lt;th&gt;Payments per year (B)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Weekly&lt;/td&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Biweekly&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monthly&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quarterly&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Every 6 months&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Yearly&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every hike uses the same rule: &lt;strong&gt;dollar change × payments per year ÷ 12&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Dollar change (E2)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(OR(B2="",C2=""),"",C2-B2)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Positive means the merchant raised the price. Zero means no change. Negative means a cut (rare, but keep the formula honest).&lt;/p&gt;

&lt;p&gt;With the example data, E2 is &lt;code&gt;2.50&lt;/code&gt;, E4 is &lt;code&gt;20.00&lt;/code&gt;, and E5 is &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Monthly impact of the hike (F2)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(E2="","",E2*IFERROR(INDEX(Lists!$B$2:$B$7,MATCH(D2,Lists!$A$2:$A$7,0)),0)/12)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reading it inside-out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;MATCH&lt;/code&gt; finds the billing cycle on &lt;code&gt;Lists&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;INDEX&lt;/code&gt; returns payments per year.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;IFERROR(...,0)&lt;/code&gt; stops a blank or mistyped cycle from spraying &lt;code&gt;#N/A&lt;/code&gt; down the sheet.&lt;/li&gt;
&lt;li&gt;Multiply by the dollar change, then divide by 12 to get the monthly hit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Worked results for the example rows:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Row&lt;/th&gt;
&lt;th&gt;Delta ($)&lt;/th&gt;
&lt;th&gt;Monthly impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2.50&lt;/td&gt;
&lt;td&gt;2.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;2.00&lt;/td&gt;
&lt;td&gt;2.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;20.00&lt;/td&gt;
&lt;td&gt;1.67 (20 × 1 / 12)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;10.00&lt;/td&gt;
&lt;td&gt;0.83 (10 × 1 / 12)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;2.00&lt;/td&gt;
&lt;td&gt;8.67 (2 × 52 / 12)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The weekly meal kit is the useful surprise: a $2 weekly bump costs more per month than a $20 yearly hike on the news site.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Percent change (G2)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(OR(B2="",B2=0,E2=""),"",E2/B2)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Format column G as a percent. Example results: Streaming ≈ 16.1%, Cloud ≈ 20.0%, News ≈ 25.3%, Music = 0%, Fitness = 25.0%, Meal kit ≈ 16.7%.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. A plain-language flag (H2)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(E2="","",IF(E2&amp;gt;0,"Hike",IF(E2&amp;lt;0,"Cut","Same")))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Optional: only flag hikes above a threshold (for example 10%) by changing the middle test to &lt;code&gt;AND(E2&amp;gt;0,G2&amp;gt;=0.1)&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Conditional formatting
&lt;/h2&gt;

&lt;p&gt;Select &lt;code&gt;A2:H101&lt;/code&gt; (or just the Flag / Monthly impact columns) and add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Red fill when &lt;code&gt;=$E2&amp;gt;0&lt;/code&gt; (any hike), or tighten it with &lt;code&gt;=AND($E2&amp;gt;0,$G2&amp;gt;=0.1)&lt;/code&gt; for 10%+ only.&lt;/li&gt;
&lt;li&gt;Grey text when &lt;code&gt;=$H2="Same"&lt;/code&gt; so unchanged rows fade into the background.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You will see the raised prices without scanning every number.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Totals worth reading
&lt;/h2&gt;

&lt;p&gt;Pick empty cells under the table (or a tiny &lt;code&gt;Summary&lt;/code&gt; sheet):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hikes this pass:              =COUNTIF(H2:H7,"Hike")
Monthly cost of those hikes:  =SUMIF(H2:H7,"Hike",F2:F7)
Yearly cost of those hikes:   =SUMIF(H2:H7,"Hike",F2:F7)*12
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With the example data that is &lt;strong&gt;5 hikes&lt;/strong&gt;, about &lt;strong&gt;$15.67 more per month&lt;/strong&gt;, and about &lt;strong&gt;$188 more per year&lt;/strong&gt; if nothing is cancelled.&lt;/p&gt;

&lt;p&gt;Add a Keep / Cancel / Review column if you want a savings line the same way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=SUMIF(I2:I7,"Cancel",F2:F7)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That number is only the &lt;em&gt;increase&lt;/em&gt; you would avoid by cancelling, not the full subscription cost. For a full keep-or-cancel audit of the whole bill, use Audit Lite linked above.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Where the "old cost" comes from
&lt;/h2&gt;

&lt;p&gt;You need a baseline. Practical options:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Last statement vs this statement.&lt;/strong&gt; Put last month's (or last cycle's) amount in Old cost and the new charge in New cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email receipts.&lt;/strong&gt; Search for the merchant plus &lt;code&gt;receipt&lt;/code&gt; or &lt;code&gt;invoice&lt;/code&gt; and copy the prior amount.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A running tracker.&lt;/strong&gt; Once you keep a subscription list with a Cost column, copy Cost into Old cost before you type a new amount. That is the habit that makes this check take two minutes next time.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you do not know the old price, leave Old cost blank. The formulas stay blank instead of inventing a hike.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. After you flag a hike
&lt;/h2&gt;

&lt;p&gt;Cancelling is a separate step. For each row marked Cancel, cancel in the same place the charge lives (the merchant account, Apple, Google Play or PayPal), then confirm the next statement. Annual plans sometimes need a cancel several days before the renewal date; check the merchant's own page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap-up
&lt;/h2&gt;

&lt;p&gt;That is the whole check: old vs new, one lookup table, three formula columns, a flag and a couple of totals. Build it from this post in about 15 minutes.&lt;/p&gt;

&lt;p&gt;If you want a finished sheet that already normalizes six billing cycles, counts days until renewal (yellow at 30 days, red at 7) and rolls the numbers onto a dashboard, the &lt;strong&gt;&lt;a href="https://ailstudio.gumroad.com/l/qkwkix?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=how-to-catch-a-subscription-price-increase-in-google-sheets" rel="noopener noreferrer"&gt;Subscription Tracker&lt;/a&gt;&lt;/strong&gt; is $1+ (pay what you want) for Excel and Google Sheets. Pair it with &lt;a href="https://ailstudio.gumroad.com/l/ipnphp?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=how-to-catch-a-subscription-price-increase-in-google-sheets" rel="noopener noreferrer"&gt;Subscription Audit Lite (free, $0+)&lt;/a&gt; when you are still listing charges for the first time.&lt;/p&gt;

&lt;p&gt;By Richard C · AIL Studio&lt;/p&gt;

</description>
      <category>googlesheets</category>
      <category>productivity</category>
      <category>personalfinance</category>
      <category>spreadsheets</category>
    </item>
    <item>
      <title>How to calculate a trailing drawdown in Google Sheets for a prop firm challenge</title>
      <dc:creator>Richard C</dc:creator>
      <pubDate>Tue, 27 Oct 2026 04:20:32 +0000</pubDate>
      <link>https://dev.to/richardc_ailstudio/how-to-calculate-a-trailing-drawdown-in-google-sheets-for-a-prop-firm-challenge-1pn3</link>
      <guid>https://dev.to/richardc_ailstudio/how-to-calculate-a-trailing-drawdown-in-google-sheets-for-a-prop-firm-challenge-1pn3</guid>
      <description>&lt;p&gt;By Richard C · AIL Studio&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Not financial advice.&lt;/strong&gt; This is a spreadsheet tutorial for record-keeping. Prop firm rules change, and firms define trailing drawdown differently. Verify with your firm's current rules page before you buy or trade. Nothing here is a trading recommendation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://ailstudio.gumroad.com/l/cbjdeq?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=trailing-drawdown" rel="noopener noreferrer"&gt;Prop Firm Rules Cheat Sheet (Free, Oct 2026)&lt;/a&gt;&lt;/strong&gt;: a free .xlsx that puts drawdown type, daily loss, profit target, minimum days, payout split and price for 10 prop firms side by side (checked Oct 2026 against each firm's own site).&lt;/p&gt;

&lt;p&gt;A trailing drawdown is the rule that ends many prop firm accounts. Unlike a static drawdown, the floor can move up after you make money. Two accounts with the same starting balance and the same dollar limit can fail on different days, depending on whether the firm trails at end of day or intraday, and whether the floor locks at the starting balance.&lt;/p&gt;

&lt;p&gt;This article builds only that check in Google Sheets: end-of-day trailing, intraday trailing, the lock, and the mistakes that hide a breach. For a full challenge tracker (daily loss, profit target, consistency and the rest), see &lt;a href="https://dev.to/richardc_ailstudio/how-to-track-prop-firm-challenge-rules-in-google-sheets-daily-loss-max-drawdown-consistency-4c4n"&gt;How to track prop firm challenge rules in Google Sheets&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "trailing" means (in plain words)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Static drawdown:&lt;/strong&gt; the floor is fixed. On a $50,000 account with a $2,000 max drawdown, you fail at $48,000 no matter how high you climbed first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trailing drawdown:&lt;/strong&gt; the floor follows your highest balance upward. After you grow the account, you can fail above the original static floor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;End-of-day (EOD) trailing:&lt;/strong&gt; the peak (and usually the floor) updates from the balance at the close of the trading day. Intraday open profit that disappears before the close often does not raise the floor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intraday trailing:&lt;/strong&gt; the peak updates from equity while trades are open. A winner that reverses can raise the floor, then leave you too close to it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lock at starting balance:&lt;/strong&gt; many firms stop trailing once the floor reaches the starting balance. After that, the floor does not rise further. Some firms do not lock. Check your plan.&lt;/p&gt;

&lt;p&gt;Examples from the Oct 2026 cheat sheet (still verify on the firm's site): end-of-day trailing appears on plans from Topstep, Take Profit Trader and My Funded Futures; intraday trailing appears on Apex's intraday-trail evaluations; static max loss appears on plans from FTMO and FundedNext. Those are illustrations of &lt;em&gt;types&lt;/em&gt;, not a promise that any one plan still works that way today.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Settings
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cell&lt;/th&gt;
&lt;th&gt;Label (column A)&lt;/th&gt;
&lt;th&gt;Value (column B)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;B1&lt;/td&gt;
&lt;td&gt;Starting balance&lt;/td&gt;
&lt;td&gt;50000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B2&lt;/td&gt;
&lt;td&gt;Max drawdown ($)&lt;/td&gt;
&lt;td&gt;2000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are &lt;strong&gt;example data&lt;/strong&gt; for a $50K-style account. Replace them with your firm's numbers. Whether the floor locks at the starting balance is handled in the floor formula in section 2, not in a separate settings cell.&lt;/p&gt;

&lt;p&gt;Static floor for comparison:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;B4: =B1-B2      → 48000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. End-of-day trailing log
&lt;/h2&gt;

&lt;p&gt;Headers in row 9: &lt;strong&gt;Date, Daily P&amp;amp;L, Running balance, Peak EOD balance, Trailing floor, Trailing check, Static check&lt;/strong&gt; (A–G). Put &lt;code&gt;Example data (not real trades)&lt;/code&gt; in A8.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example data&lt;/strong&gt; (made-up numbers for illustration, not real trades):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Row&lt;/th&gt;
&lt;th&gt;A: Date&lt;/th&gt;
&lt;th&gt;B: Daily P&amp;amp;L&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;2026-10-01&lt;/td&gt;
&lt;td&gt;2500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;2026-10-02&lt;/td&gt;
&lt;td&gt;-1500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;2026-10-03&lt;/td&gt;
&lt;td&gt;800&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;2026-10-06&lt;/td&gt;
&lt;td&gt;-2100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You only type columns A and B.&lt;/p&gt;

&lt;h3&gt;
  
  
  Running balance (column C)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C10: =$B$1+B10
C11: =C10+B11      (fill down to C13)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Peak EOD balance (column D)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;D10: =MAX($B$1,C10)
D11: =MAX(D10,C11)      (fill down to D13)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Trailing floor with lock (column E)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;E10: =MIN(D10-$B$2,$B$1)      (fill down to E13)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;MIN(..., $B$1)&lt;/code&gt; stops the floor rising above the starting balance. If your firm does &lt;strong&gt;not&lt;/strong&gt; lock, use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;E10: =D10-$B$2      (fill down)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Checks (columns F and G)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;F10: =IF(C10&amp;lt;=E10,"BREACH","OK")      (fill down)
G10: =IF(C10&amp;lt;=$B$4,"BREACH","OK")     (fill down)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Results with the example data
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Row&lt;/th&gt;
&lt;th&gt;Balance&lt;/th&gt;
&lt;th&gt;Peak EOD&lt;/th&gt;
&lt;th&gt;Trailing floor (locked)&lt;/th&gt;
&lt;th&gt;Trailing&lt;/th&gt;
&lt;th&gt;Static&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;52500&lt;/td&gt;
&lt;td&gt;52500&lt;/td&gt;
&lt;td&gt;50000&lt;/td&gt;
&lt;td&gt;OK&lt;/td&gt;
&lt;td&gt;OK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;51000&lt;/td&gt;
&lt;td&gt;52500&lt;/td&gt;
&lt;td&gt;50000&lt;/td&gt;
&lt;td&gt;OK&lt;/td&gt;
&lt;td&gt;OK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;51800&lt;/td&gt;
&lt;td&gt;52500&lt;/td&gt;
&lt;td&gt;50000&lt;/td&gt;
&lt;td&gt;OK&lt;/td&gt;
&lt;td&gt;OK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;49700&lt;/td&gt;
&lt;td&gt;52500&lt;/td&gt;
&lt;td&gt;50000&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;BREACH&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;OK&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I checked these formulas against the example table in Python (same arithmetic Google Sheets uses for &lt;code&gt;MAX&lt;/code&gt;, &lt;code&gt;MIN&lt;/code&gt; and running sums). Row 13 is the point: the account is still above the static floor of 48000, but the trailing floor has already locked at 50000 after the Day 1 gain, so −2100 fails the trailing rule.&lt;/p&gt;

&lt;p&gt;Once a row shows &lt;strong&gt;BREACH&lt;/strong&gt;, the firm has usually failed the account. Later rows that look OK do not undo that.&lt;/p&gt;

&lt;p&gt;Without the lock, the same peak of 52500 would set a floor of 50500, and row 13 would still breach (49700 ≤ 50500). With a smaller early gain, lock vs no-lock can disagree, so match your firm's wording.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Intraday trailing (one day of equity snapshots)
&lt;/h2&gt;

&lt;p&gt;EOD formulas cannot see open profit. To approximate an intraday trail, log equity during the day, including open P&amp;amp;L.&lt;/p&gt;

&lt;p&gt;Headers in row 20: &lt;strong&gt;Time, Equity (incl. open P&amp;amp;L), Peak equity, Trailing floor, Check&lt;/strong&gt; (A–E). Label A19 &lt;code&gt;Example data (not real trades)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example data&lt;/strong&gt; for a single day starting at 50000 with a $2,000 trail and a lock at the starting balance:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Row&lt;/th&gt;
&lt;th&gt;A: Time&lt;/th&gt;
&lt;th&gt;B: Equity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;09:35&lt;/td&gt;
&lt;td&gt;50000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;10:10&lt;/td&gt;
&lt;td&gt;52200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;11:40&lt;/td&gt;
&lt;td&gt;49950&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;15:50&lt;/td&gt;
&lt;td&gt;50800&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C21: =MAX($B$1,B21)
C22: =MAX(C21,B22)           (fill down)
D21: =MIN(C21-$B$2,$B$1)     (fill down; drop $B$1 if no lock)
E21: =IF(B21&amp;lt;=D21,"BREACH","OK")  (fill down)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Equity&lt;/th&gt;
&lt;th&gt;Peak&lt;/th&gt;
&lt;th&gt;Floor&lt;/th&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;09:35&lt;/td&gt;
&lt;td&gt;50000&lt;/td&gt;
&lt;td&gt;50000&lt;/td&gt;
&lt;td&gt;48000&lt;/td&gt;
&lt;td&gt;OK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10:10&lt;/td&gt;
&lt;td&gt;52200&lt;/td&gt;
&lt;td&gt;52200&lt;/td&gt;
&lt;td&gt;50000&lt;/td&gt;
&lt;td&gt;OK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11:40&lt;/td&gt;
&lt;td&gt;49950&lt;/td&gt;
&lt;td&gt;52200&lt;/td&gt;
&lt;td&gt;50000&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;BREACH&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15:50&lt;/td&gt;
&lt;td&gt;50800&lt;/td&gt;
&lt;td&gt;52200&lt;/td&gt;
&lt;td&gt;50000&lt;/td&gt;
&lt;td&gt;OK&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Same arithmetic check as above. At 11:40 the account is already failed under an intraday trail. The 15:50 close of 50800 would look fine under an &lt;strong&gt;EOD-only&lt;/strong&gt; rule for that day (peak 50800, locked floor 48800, close OK). That gap is why mixing up EOD and intraday is expensive.&lt;/p&gt;

&lt;p&gt;A sheet like this is a record. The firm's platform is the official clock and the official equity.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Common mistakes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Using only the close for an intraday firm.&lt;/strong&gt; Your EOD log can show OK on a day the live platform already failed you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forgetting the lock.&lt;/strong&gt; If the firm locks at the starting balance and you keep trailing above it, your sheet's floor is too high (stricter than the firm) or, if you never trail at all, too low (looser than the firm).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comparing to starting balance instead of the floor.&lt;/strong&gt; After a winning streak, "I'm still above 50K" is not the trailing test.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logging deposits, resets or payouts in the same balance column.&lt;/strong&gt; Trailing peaks are about trading equity under the plan rules. Keep admin adjustments in a separate column so they do not inflate the peak by accident.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treating the sheet as live risk control.&lt;/strong&gt; Daily and intraday limits on many platforms include open trades and update faster than a manual sheet. Use the sheet to understand the rule and to review after the close.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  5. Conditional formatting
&lt;/h2&gt;

&lt;p&gt;Select the check columns, then &lt;strong&gt;Format → Conditional formatting → Text is exactly&lt;/strong&gt; &lt;code&gt;BREACH&lt;/code&gt;, with a red fill. That makes the first failing day hard to miss when you scroll.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to use a ready-made sheet
&lt;/h2&gt;

&lt;p&gt;Building the formulas once is useful for learning. If you also want a trade log with automatic P&amp;amp;L, win rate, R-multiple, review tabs and a Prop Firm Tracker in one file, &lt;strong&gt;&lt;a href="https://ailstudio.gumroad.com/l/qsnmk?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=trailing-drawdown" rel="noopener noreferrer"&gt;Trader's Edge Journal ($14)&lt;/a&gt;&lt;/strong&gt; is a Google Sheets / Excel template from AIL Studio. You get an .xlsx with 15 sample trades and a short PDF quick-start. It is a record-keeping tool: it does not tell you what to trade and does not guarantee results.&lt;/p&gt;

&lt;p&gt;Related reading:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/how-to-track-prop-firm-challenge-rules-in-google-sheets-daily-loss-max-drawdown-consistency-4c4n"&gt;How to track prop firm challenge rules in Google Sheets (daily loss, max drawdown, consistency)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/prop-firm-rules-compared-oct-2026-2g4f"&gt;Prop firm rules compared (Oct 2026)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Not financial advice. Rules change, verify with the firm before buying.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;By Richard C · AIL Studio&lt;/p&gt;

</description>
      <category>googlesheets</category>
      <category>trading</category>
      <category>spreadsheets</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to catch wrong-parent Contacts after a Salesforce migration</title>
      <dc:creator>Richard C</dc:creator>
      <pubDate>Tue, 27 Oct 2026 00:11:15 +0000</pubDate>
      <link>https://dev.to/richardc_ailstudio/how-to-catch-wrong-parent-contacts-after-a-salesforce-migration-o65</link>
      <guid>https://dev.to/richardc_ailstudio/how-to-catch-wrong-parent-contacts-after-a-salesforce-migration-o65</guid>
      <description>&lt;p&gt;By Richard C · AIL Studio · 7x certified Salesforce professional&lt;/p&gt;

&lt;p&gt;A Contact can keep its name and email after a Salesforce migration and still sit under the wrong Account. Free CSV compare tools miss that case, because the field values still match — you have to check the parent relationship.&lt;/p&gt;

&lt;p&gt;This post walks through that check on a tiny example, first with pandas and then with spreadsheet formulas you can use in Google Sheets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why you can't just compare AccountId
&lt;/h2&gt;

&lt;p&gt;Record IDs usually change between the source and target org. A Contact's &lt;code&gt;AccountId&lt;/code&gt; of &lt;code&gt;SA-01&lt;/code&gt; in the source might legitimately become &lt;code&gt;TA-91&lt;/code&gt; in the target. So "the IDs are different" tells you nothing.&lt;/p&gt;

&lt;p&gt;What you need is a &lt;strong&gt;stable key&lt;/strong&gt;: a value that identifies the same record in both exports, such as an external ID field. The check is then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Source Contact → its source AccountId → that Account's &lt;strong&gt;stable key&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Target Contact (matched by the Contact's stable key) → its target AccountId → that Account's &lt;strong&gt;stable key&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;If the two Account keys differ, the Contact has the &lt;strong&gt;wrong parent&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The example data
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Example data:&lt;/strong&gt; four small, made-up CSVs. All records are invented, and the email uses the reserved &lt;code&gt;example.invalid&lt;/code&gt; domain.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;source-accounts.csv&lt;/code&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ExternalKey&lt;/th&gt;
&lt;th&gt;Id&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Industry&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AC-001&lt;/td&gt;
&lt;td&gt;SA-01&lt;/td&gt;
&lt;td&gt;Aster, Labs&lt;/td&gt;
&lt;td&gt;Science&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AC-002&lt;/td&gt;
&lt;td&gt;SA-02&lt;/td&gt;
&lt;td&gt;Blue Orchard&lt;/td&gt;
&lt;td&gt;Retail&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;target-accounts.csv&lt;/code&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ExternalKey&lt;/th&gt;
&lt;th&gt;Id&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Industry&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AC-001&lt;/td&gt;
&lt;td&gt;TA-91&lt;/td&gt;
&lt;td&gt;Aster, Labs&lt;/td&gt;
&lt;td&gt;Science&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AC-002&lt;/td&gt;
&lt;td&gt;TA-92&lt;/td&gt;
&lt;td&gt;Blue Orchard&lt;/td&gt;
&lt;td&gt;Retail&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;source-contacts.csv&lt;/code&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ExternalKey&lt;/th&gt;
&lt;th&gt;Id&lt;/th&gt;
&lt;th&gt;AccountId&lt;/th&gt;
&lt;th&gt;LastName&lt;/th&gt;
&lt;th&gt;Email&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CT-001&lt;/td&gt;
&lt;td&gt;SC-01&lt;/td&gt;
&lt;td&gt;SA-01&lt;/td&gt;
&lt;td&gt;Renée, Example&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:renee@example.invalid"&gt;renee@example.invalid&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;target-contacts.csv&lt;/code&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ExternalKey&lt;/th&gt;
&lt;th&gt;Id&lt;/th&gt;
&lt;th&gt;AccountId&lt;/th&gt;
&lt;th&gt;LastName&lt;/th&gt;
&lt;th&gt;Email&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CT-001&lt;/td&gt;
&lt;td&gt;TC-91&lt;/td&gt;
&lt;td&gt;TA-92&lt;/td&gt;
&lt;td&gt;Renée, Example&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:renee@example.invalid"&gt;renee@example.invalid&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Look at it by hand first. Source CT-001 points to SA-01, which is AC-001. In the target, AC-001 is TA-91, so that's where CT-001 &lt;em&gt;should&lt;/em&gt; point. It actually points to TA-92, which is AC-002. Same name, same email, wrong Account.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check 1: pandas
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# keep IDs as text; the files have a UTF-8 BOM
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8-sig&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;keep_default_na&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;sa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;source-accounts&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;target-accounts&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;sc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;source-contacts&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;target-contacts&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# lookups only work if keys and IDs are unique on each side
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ta&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;is_unique&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ExternalKey&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;is_unique&lt;/span&gt;

&lt;span class="n"&gt;src_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sa&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;sa&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ExternalKey&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;   &lt;span class="c1"&gt;# SA-01 -&amp;gt; AC-001
&lt;/span&gt;&lt;span class="n"&gt;tgt_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ta&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;ta&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ExternalKey&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;   &lt;span class="c1"&gt;# TA-92 -&amp;gt; AC-002
&lt;/span&gt;&lt;span class="n"&gt;tgt_id&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ta&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ExternalKey&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;ta&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;   &lt;span class="c1"&gt;# AC-001 -&amp;gt; TA-91
&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ExternalKey&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;how&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;left&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;suffixes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;_src&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;_tgt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;expected_parent_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AccountId_src&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src_key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;actual_parent_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AccountId_tgt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tgt_key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;expected_target_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;expected_parent_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tgt_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;expected_parent_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;actual_parent_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PARENT_MATCH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;WRONG_PARENT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ExternalKey&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;expected_target_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AccountId_tgt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wrong parents:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;WRONG_PARENT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output on the example data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  ExternalKey expected_target_id AccountId_tgt        result
0      CT-001              TA-91         TA-92  WRONG_PARENT
wrong parents: 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So there is &lt;strong&gt;1 wrong-parent Contact&lt;/strong&gt; (CT-001: expected TA-91, actual TA-92), and &lt;strong&gt;0 differences&lt;/strong&gt; in LastName or Email. On real data, also check for Contacts whose parent doesn't resolve at all (a &lt;code&gt;NaN&lt;/code&gt; key here). Report those as unresolved, not as matches.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check 2: Google Sheets formulas
&lt;/h2&gt;

&lt;p&gt;Import each CSV into its own tab named &lt;strong&gt;SourceAccounts&lt;/strong&gt;, &lt;strong&gt;TargetAccounts&lt;/strong&gt;, &lt;strong&gt;SourceContacts&lt;/strong&gt; and &lt;strong&gt;TargetContacts&lt;/strong&gt;, with headers in row 1. Keep IDs as text. "Aster, Labs" and "Renée, Example" each belong in one cell.&lt;/p&gt;

&lt;p&gt;First, confirm the lookups are safe. Each Account &lt;code&gt;Id&lt;/code&gt; and &lt;code&gt;ExternalKey&lt;/code&gt; must be unique:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=SUMPRODUCT((COUNTIF(SourceAccounts!$B$2:$B$3,SourceAccounts!$B$2:$B$3)=1)*1)   → 2 (both IDs unique)
=SUMPRODUCT((COUNTIF(TargetAccounts!$A$2:$A$3,TargetAccounts!$A$2:$A$3)=1)*1)   → 2 (both keys unique)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add a &lt;strong&gt;Check&lt;/strong&gt; tab. Put the labels in row 1 and these formulas in row 2:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A2  Contact key:                =SourceContacts!A2
B2  Source Account ID:          =SourceContacts!C2
C2  Source Account key:         =INDEX(SourceAccounts!$A$2:$A$3,MATCH(B2,SourceAccounts!$B$2:$B$3,0))
D2  Expected target Account ID: =INDEX(TargetAccounts!$B$2:$B$3,MATCH(C2,TargetAccounts!$A$2:$A$3,0))
E2  Actual target Account ID:   =INDEX(TargetContacts!$C$2:$C$3,MATCH(A2,TargetContacts!$A$2:$A$3,0))
F2  Actual target Account key:  =INDEX(TargetAccounts!$A$2:$A$3,MATCH(E2,TargetAccounts!$B$2:$B$3,0))
G2  Relationship check:         =IF(EXACT(C2,F2),"PARENT_MATCH","WRONG_PARENT")
H2  Source LastName:            =SourceContacts!D2
I2  Target LastName:            =INDEX(TargetContacts!$D$2:$D$3,MATCH(A2,TargetContacts!$A$2:$A$3,0))
J2  LastName check:             =IF(EXACT(H2,I2),"MATCH","DIFFERENCE")
K2  Source Email:               =SourceContacts!E2
L2  Target Email:               =INDEX(TargetContacts!$E$2:$E$3,MATCH(A2,TargetContacts!$A$2:$A$3,0))
M2  Email check:                =IF(EXACT(K2,L2),"MATCH","DIFFERENCE")
B4  Wrong-parent count:         =COUNTIF(G2:G2,"WRONG_PARENT")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected results:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cell&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A2&lt;/td&gt;
&lt;td&gt;CT-001&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B2&lt;/td&gt;
&lt;td&gt;SA-01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C2&lt;/td&gt;
&lt;td&gt;AC-001&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D2&lt;/td&gt;
&lt;td&gt;TA-91&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E2&lt;/td&gt;
&lt;td&gt;TA-92&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F2&lt;/td&gt;
&lt;td&gt;AC-002&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;G2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;WRONG_PARENT&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;J2&lt;/td&gt;
&lt;td&gt;MATCH&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M2&lt;/td&gt;
&lt;td&gt;MATCH&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B4&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I recalculated this exact workbook and got these values, matching the pandas result. As a sanity check, change &lt;code&gt;TargetContacts!C2&lt;/code&gt; to &lt;code&gt;TA-91&lt;/code&gt;. F2 becomes AC-001 and G2 becomes PARENT_MATCH.&lt;/p&gt;

&lt;p&gt;A few notes for real exports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MATCH is case-insensitive&lt;/strong&gt;, so &lt;code&gt;EXACT&lt;/code&gt; does the final comparisons. Keep keys consistently cased.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extend ranges deliberately.&lt;/strong&gt; For more Contacts, fill row 2 down and widen every range (&lt;code&gt;$A$2:$A$5000&lt;/code&gt; and so on), then change B4 to cover the whole G column range.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A lookup error (#N/A) means unresolved.&lt;/strong&gt; Investigate it. Don't treat it as a match or hide it with IFERROR.&lt;/li&gt;
&lt;li&gt;This checks one relationship on the files you load. It doesn't certify a whole migration.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  If you'd rather skip the setup
&lt;/h2&gt;

&lt;p&gt;I packaged these four example CSVs, the README and the exact Check-tab formulas into a free guide ($0). It includes the expected output, so you can confirm your sheet: &lt;a href="https://ailstudio.gumroad.com/l/rjvcjs?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=wrong-parent-contacts" rel="noopener noreferrer"&gt;RecordBridge Free Guide: CSV Example&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For full exports, &lt;a href="https://ailstudio.gumroad.com/l/ufgfjf?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=recordbridge48" rel="noopener noreferrer"&gt;RecordBridge&lt;/a&gt; (US$49, one-time) runs the same check across Accounts, Contacts and Opportunities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Related tool:&lt;/strong&gt; if you'd rather not build these checks by hand, RecordBridge runs them on your exported CSVs.&lt;br&gt;
&lt;a href="https://ailstudio.gumroad.com/l/ufgfjf?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=recordbridge48" rel="noopener noreferrer"&gt;RecordBridge by AIL Studio&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;RecordBridge by AIL Studio is not affiliated with Salesforce.&lt;/p&gt;

</description>
      <category>salesforce</category>
      <category>data</category>
      <category>csv</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>7 ChatGPT prompts that turn messy spreadsheets into clean reports</title>
      <dc:creator>Richard C</dc:creator>
      <pubDate>Mon, 26 Oct 2026 22:53:28 +0000</pubDate>
      <link>https://dev.to/richardc_ailstudio/7-chatgpt-prompts-that-turn-messy-spreadsheets-into-clean-reports-3g5k</link>
      <guid>https://dev.to/richardc_ailstudio/7-chatgpt-prompts-that-turn-messy-spreadsheets-into-clean-reports-3g5k</guid>
      <description>&lt;p&gt;Most spreadsheets don't start clean. Dates come in three formats, someone types "office supplies" while someone else types "Office Supplies", and the same row gets pasted twice. ChatGPT can help you tidy that up and turn it into a report, but only if you give it clear instructions and check what comes back.&lt;/p&gt;

&lt;p&gt;Below are seven copy-paste prompts, all run against the same small dataset. For each one I've worked out &lt;strong&gt;what a correct answer should look like&lt;/strong&gt;, so you can compare what ChatGPT gives you against known-good numbers. Chat tools can and do get arithmetic wrong, so always double-check their numbers against spreadsheet formulas (there are some at the end).&lt;/p&gt;

&lt;h2&gt;
  
  
  The example dataset
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Example data&lt;/strong&gt; (made up for this tutorial, not real transactions). It has 10 rows with deliberate problems: mixed date formats, mixed currency formats, a duplicate row with different formatting, an exact duplicate row, a blank amount, a blank customer and inconsistent category names.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Customer&lt;/th&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Amount&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2026-09-03&lt;/td&gt;
&lt;td&gt;Acme&lt;/td&gt;
&lt;td&gt;Office Supplies&lt;/td&gt;
&lt;td&gt;$120.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;09/05/2026&lt;/td&gt;
&lt;td&gt;Brightside&lt;/td&gt;
&lt;td&gt;office supplies&lt;/td&gt;
&lt;td&gt;85.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Sept 7 2026&lt;/td&gt;
&lt;td&gt;Cole &amp;amp; Co&lt;/td&gt;
&lt;td&gt;Software&lt;/td&gt;
&lt;td&gt;$1,200.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;2026-09-07&lt;/td&gt;
&lt;td&gt;Cole &amp;amp; Co&lt;/td&gt;
&lt;td&gt;␣software␣&lt;/td&gt;
&lt;td&gt;1200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;09/12/2026&lt;/td&gt;
&lt;td&gt;Dunmore&lt;/td&gt;
&lt;td&gt;Travel&lt;/td&gt;
&lt;td&gt;USD 340&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;2026-09-15&lt;/td&gt;
&lt;td&gt;Acme&lt;/td&gt;
&lt;td&gt;Office supplies&lt;/td&gt;
&lt;td&gt;&lt;em&gt;(blank)&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Sep 18 2026&lt;/td&gt;
&lt;td&gt;Evergreen&lt;/td&gt;
&lt;td&gt;TRAVEL&lt;/td&gt;
&lt;td&gt;$95.25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;09/20/2026&lt;/td&gt;
&lt;td&gt;Brightside&lt;/td&gt;
&lt;td&gt;Software&lt;/td&gt;
&lt;td&gt;4,999.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;2026-09-22&lt;/td&gt;
&lt;td&gt;&lt;em&gt;(blank)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Travel&lt;/td&gt;
&lt;td&gt;410&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;2026-09-03&lt;/td&gt;
&lt;td&gt;Acme&lt;/td&gt;
&lt;td&gt;Office Supplies&lt;/td&gt;
&lt;td&gt;$120.00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;(␣ marks a stray space. Row 4's category is " software " with spaces on both sides.)&lt;/p&gt;

&lt;p&gt;The same data as CSV, ready to paste:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Date,Customer,Category,Amount
2026-09-03,Acme,Office Supplies,$120.00
09/05/2026,Brightside,office supplies,85.5
Sept 7 2026,Cole &amp;amp; Co,Software,"$1,200.00"
2026-09-07,Cole &amp;amp; Co, software ,1200
09/12/2026,Dunmore,Travel,USD 340
2026-09-15,Acme,Office supplies,
Sep 18 2026,Evergreen,TRAVEL,$95.25
09/20/2026,Brightside,Software,"4,999.00"
2026-09-22,,Travel,410
2026-09-03,Acme,Office Supplies,$120.00
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dates in the MM/DD/YYYY style are US format here (09/05/2026 is September 5). Tell ChatGPT that explicitly, or it may guess.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompt 1: Clean and standardise
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Here is a CSV of transactions. Clean it and return the result as a CSV.
Rules:
- Convert every date to YYYY-MM-DD. Dates like 09/05/2026 are US format (month/day/year).
- Convert Amount to a plain number with two decimals: no $, no "USD", no thousands separators.
- Trim spaces from Category and use Title Case (e.g. "Office Supplies").
- If Customer is blank, write "(unknown)". If Amount is blank, leave it blank. Do not guess values.
- Keep all rows, including duplicates, in the original order.
Then list every change you made, row by row.

[paste CSV here]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What a correct answer should look like&lt;/strong&gt; (10 rows, same order):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Date,Customer,Category,Amount
2026-09-03,Acme,Office Supplies,120.00
2026-09-05,Brightside,Office Supplies,85.50
2026-09-07,Cole &amp;amp; Co,Software,1200.00
2026-09-07,Cole &amp;amp; Co,Software,1200.00
2026-09-12,Dunmore,Travel,340.00
2026-09-15,Acme,Office Supplies,
2026-09-18,Evergreen,Travel,95.25
2026-09-20,Brightside,Software,4999.00
2026-09-22,(unknown),Travel,410.00
2026-09-03,Acme,Office Supplies,120.00
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check that row 6's amount is still blank. A common mistake is filling it with 0 or a guess.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompt 2: Remove duplicates and flag them
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Using the cleaned CSV, find rows that are exact duplicates of an earlier row
(same Date, Customer, Category and Amount after cleaning).
- Add a Status column: "Duplicate" for the repeat, "Unique" for everything else.
- Tell me how many duplicates there are and which original row numbers they are.
- Then give me the de-duplicated table (Unique rows only).

[paste cleaned CSV here]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What a correct answer should look like:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;2 duplicates:&lt;/strong&gt; row 4 (repeat of row 3, which only looked different before cleaning) and row 10 (exact repeat of row 1).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;8 unique rows&lt;/strong&gt; remain: rows 1, 2, 3, 5, 6, 7, 8 and 9.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prompt 3: Summarise by category
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Using only the Unique rows, give me a summary by Category:
- number of rows
- total Amount
- average Amount (ignore blank amounts; do not treat them as 0)
Show the working for each total (list the amounts you added).
Also give the grand total.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What a correct answer should look like:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Rows&lt;/th&gt;
&lt;th&gt;Total&lt;/th&gt;
&lt;th&gt;Average&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Office Supplies&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;205.50 (120.00 + 85.50, one blank)&lt;/td&gt;
&lt;td&gt;102.75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Software&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;6,199.00 (1,200.00 + 4,999.00)&lt;/td&gt;
&lt;td&gt;3,099.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Travel&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;845.25 (340.00 + 95.25 + 410.00)&lt;/td&gt;
&lt;td&gt;281.75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Grand total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7,249.75&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If the Office Supplies average comes back as 68.50, the blank was counted as 0 (205.50 / 3). That's the most likely error here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompt 4: Build a pivot-style summary table
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build a pivot-style table from the Unique rows:
- rows = Customer, columns = Category, values = sum of Amount
- include row totals and column totals
- show blank cells as "-" rather than 0
Return it as a Markdown table.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What a correct answer should look like:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Customer&lt;/th&gt;
&lt;th&gt;Office Supplies&lt;/th&gt;
&lt;th&gt;Software&lt;/th&gt;
&lt;th&gt;Travel&lt;/th&gt;
&lt;th&gt;Total&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;(unknown)&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;410.00&lt;/td&gt;
&lt;td&gt;410.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Acme&lt;/td&gt;
&lt;td&gt;120.00&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;120.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Brightside&lt;/td&gt;
&lt;td&gt;85.50&lt;/td&gt;
&lt;td&gt;4,999.00&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;5,084.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cole &amp;amp; Co&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;1,200.00&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;1,200.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dunmore&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;340.00&lt;/td&gt;
&lt;td&gt;340.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evergreen&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;95.25&lt;/td&gt;
&lt;td&gt;95.25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;205.50&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;6,199.00&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;845.25&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7,249.75&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Acme's Office Supplies total is 120.00, not 240.00, because the duplicate row is excluded. Acme's row 6 has no amount.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompt 5: Write the spreadsheet formulas
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;My cleaned data is in A1:E11 with headers Date, Customer, Category, Amount, Status.
Rows 2-11 are data. Write Google Sheets formulas (that also work in Excel) for:
1. A Status column (E) marking the second and later copies of a row as "Duplicate", otherwise "Unique".
2. Count, total and average Amount per category, using only Unique rows, with the category name in G2:G4.
3. Grand total, number of duplicates, number of blank amounts, and the largest amount.
Give exact cell references and explain each formula in one sentence.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What a correct answer should look like.&lt;/strong&gt; These are formulas I tested in a spreadsheet with this data. Put "Office Supplies", "Software" and "Travel" in G2:G4.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;E2:  =IF(COUNTIFS($A$2:A2,A2,$B$2:B2,B2,$C$2:C2,C2,$D$2:D2,D2)&amp;gt;1,"Duplicate","Unique")   (fill down to E11)

H2:  =COUNTIFS($C$2:$C$11,G2,$E$2:$E$11,"Unique")                  (fill down to H4)
I2:  =SUMIFS($D$2:$D$11,$C$2:$C$11,G2,$E$2:$E$11,"Unique")         (fill down to I4)
J2:  =AVERAGEIFS($D$2:$D$11,$C$2:$C$11,G2,$E$2:$E$11,"Unique")     (fill down to J4)

I6:  =SUM(I2:I4)                                  → 7249.75   grand total
I7:  =COUNTIF(E2:E11,"Duplicate")                 → 2
I8:  =COUNTIFS(D2:D11,"",E2:E11,"Unique")         → 1         blank amounts
I9:  =MAXIFS(D2:D11,E2:E11,"Unique")              → 4999
I10: =COUNTIF(E2:E11,"Unique")                    → 8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;H2:J4 should give 3 / 205.50 / 102.75, 2 / 6199 / 3099.50 and 3 / 845.25 / 281.75. The E2 formula uses an expanding range (&lt;code&gt;$A$2:A2&lt;/code&gt;), so only the later copy is marked Duplicate. AVERAGEIFS ignores blank cells, which is why Office Supplies averages 102.75.&lt;/p&gt;

&lt;p&gt;The answer you get may be written differently and still be right. Paste it into your sheet and check it gives these numbers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompt 6: Spot anomalies
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Look at the Unique rows and list anything that looks unusual or needs a human check:
- amounts far larger or smaller than the rest
- missing values
- anything else inconsistent
For each, give the row number, what's unusual, and a question I should ask about it.
Don't change or remove anything.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What a correct answer should look like.&lt;/strong&gt; It should at least flag:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Row 8:&lt;/strong&gt; Brightside, Software, 4,999.00. That's more than 4× the next largest amount (1,200.00) and about 69% of the grand total. Worth confirming it isn't a typo for 49.99.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Row 6:&lt;/strong&gt; Acme, Office Supplies, blank amount. Find the missing figure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Row 9:&lt;/strong&gt; Travel, 410.00, blank customer. Find out who it was for.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It might also mention that two rows were duplicates, which is fine. If it flags the 1,200.00 Cole &amp;amp; Co row as the outlier instead of row 8, push back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompt 7: Write a short plain-English report
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Write a short report (under 150 words) for a busy manager about this September data,
using only the Unique rows. Include: total spend, the biggest category with its share
of the total, the number of transactions, and the data issues found (duplicates removed,
missing values, anything unusual). Use plain language, no jargon.
Only use numbers you can show from the data.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What a correct answer should look like.&lt;/strong&gt; The wording will vary, but these numbers should all be in it and match:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total: &lt;strong&gt;7,249.75&lt;/strong&gt; across &lt;strong&gt;8&lt;/strong&gt; transactions (after removing &lt;strong&gt;2&lt;/strong&gt; duplicates).&lt;/li&gt;
&lt;li&gt;Biggest category: &lt;strong&gt;Software, 6,199.00&lt;/strong&gt;, about &lt;strong&gt;85.5%&lt;/strong&gt; of the total. Then Travel 845.25 (11.7%) and Office Supplies 205.50 (2.8%).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One large item (4,999.00)&lt;/strong&gt; makes up most of the Software total.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One missing amount&lt;/strong&gt; (Acme, Office Supplies) and &lt;strong&gt;one missing customer&lt;/strong&gt; (a 410.00 Travel charge).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the report's percentages don't add up to roughly 100%, or the total isn't 7,249.75, check the numbers before you send it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Don't paste sensitive data.&lt;/strong&gt; Remove or replace names, account numbers, emails, addresses and anything confidential before pasting into any chat tool. Check your company's policy first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify totals with formulas.&lt;/strong&gt; Treat a chat answer as a draft. Recalculate the totals with SUMIFS/COUNTIFS (like the ones in Prompt 5) and make sure they match.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask for the working.&lt;/strong&gt; "Show the amounts you added" makes mistakes much easier to spot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State your assumptions.&lt;/strong&gt; Date format, currency and how to treat blanks change the answer, so put them in the prompt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Work on a copy.&lt;/strong&gt; Keep the original file untouched so you can always compare.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If you'd like more ready-made prompts for other parts of running a business, &lt;strong&gt;&lt;a href="https://ailstudio.gumroad.com/l/ineoz?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=7-chatgpt-prompts-that-turn-messy-spreadsheets-into-clean-reports" rel="noopener noreferrer"&gt;50 AI Prompts for Busy Small Business Owners&lt;/a&gt;&lt;/strong&gt; is pay what you want, from $1. It's a 4-page PDF (plus the Markdown source) with 50 copy-paste prompts across marketing (13), email (12), customer service (12) and planning &amp;amp; operations (13). Examples include review replies, late-payment reminders, a 30-day social calendar, SOPs and pricing checks. Each prompt has fill-in [BRACKETS] for your own details, and they work in any chat tool. The output still needs your review.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Related tool:&lt;/strong&gt; the full prompt pack has more fill-in prompts like these for everyday small business tasks.&lt;br&gt;
&lt;a href="https://ailstudio.gumroad.com/l/ineoz?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=crosslink" rel="noopener noreferrer"&gt;50 AI Prompts for Busy Small Business Owners&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By Richard C · AIL Studio&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Related from AIL Studio&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/trading-journal-in-google-sheets-vs-a-journaling-app-what-you-actually-need-284m"&gt;Trading journal in Google Sheets vs. a journaling app: what you actually need&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/how-to-find-every-subscription-youre-paying-for-in-15-minutes-a-simple-google-sheets-audit-29fo"&gt;How to find every subscription you're paying for in 15 minutes (a simple Google Sheets audit)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/how-to-track-prop-firm-challenge-rules-in-google-sheets-daily-loss-max-drawdown-consistency-4c4n"&gt;How to track prop firm challenge rules in Google Sheets (daily loss, max drawdown, consistency)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/prop-firm-rules-compared-oct-2026-2g4f"&gt;Prop firm rules compared (Oct 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/the-5-trading-stats-every-trader-should-track-with-formulas-and-worked-examples-4lgh"&gt;The 5 Trading Stats Every Trader Should Track (With Formulas and Worked Examples)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/how-i-built-a-subscription-tracker-in-google-sheets-formulas-to-normalize-any-billing-cycle-5gc7"&gt;How I built a subscription tracker in Google Sheets (formulas to normalize any billing cycle)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>chatgpt</category>
      <category>productivity</category>
      <category>spreadsheets</category>
      <category>excel</category>
    </item>
    <item>
      <title>Trading journal in Google Sheets vs. a journaling app: what you actually need</title>
      <dc:creator>Richard C</dc:creator>
      <pubDate>Mon, 26 Oct 2026 22:48:59 +0000</pubDate>
      <link>https://dev.to/richardc_ailstudio/trading-journal-in-google-sheets-vs-a-journaling-app-what-you-actually-need-284m</link>
      <guid>https://dev.to/richardc_ailstudio/trading-journal-in-google-sheets-vs-a-journaling-app-what-you-actually-need-284m</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Not financial advice.&lt;/strong&gt; This is about record-keeping tools, not about what or how to trade.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://ailstudio.gumroad.com/l/cbjdeq?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=trading-journal-in-google-sheets-vs-a-journaling-app-what-you-actually-need" rel="noopener noreferrer"&gt;Get the Prop Firm Rules Cheat Sheet (xlsx)&lt;/a&gt;&lt;/strong&gt;: a free sheet comparing daily loss, drawdown, profit target, minimum days and payout rules for 10 prop firms. Handy whichever journal you end up using.&lt;/p&gt;

&lt;p&gt;Most traders who start a journal ask the same question within a week: should I keep this in a spreadsheet, or pay for a journaling app? Both work. Both get abandoned. The better question is what you actually need the journal to do, and which tool you'll still be opening in three months.&lt;/p&gt;

&lt;p&gt;Here is a practical way to decide.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a trading journal has to do
&lt;/h2&gt;

&lt;p&gt;Strip away the features and a journal does four jobs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Record each trade&lt;/strong&gt; with the same fields every time: date, instrument, direction, entry, exit, size, fees, and the stop you planned.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calculate the numbers&lt;/strong&gt; so you don't do arithmetic by hand: net P&amp;amp;L, risk, R multiple, running balance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Summarise&lt;/strong&gt; by week, month, setup or session, so patterns show up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make you review it.&lt;/strong&gt; A log you never reread is just a list.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If a tool does those four things and you'll actually use it, it's good enough. Everything else is a bonus.&lt;/p&gt;

&lt;h2&gt;
  
  
  What journaling apps usually offer
&lt;/h2&gt;

&lt;p&gt;Dedicated apps differ, and their feature lists change often, so check each one's own site. Going by how they describe themselves publicly, the common selling points are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Broker imports.&lt;/strong&gt; Many connect to brokers or accept trade-history files, so trades arrive without typing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ready-made reports.&lt;/strong&gt; Breakdowns by time of day, symbol, tag, setup and holding time, with charts already built.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chart replay or screenshots&lt;/strong&gt; attached to each trade.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tagging and notes&lt;/strong&gt; for mistakes, emotions and setups.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access anywhere&lt;/strong&gt; in the browser or on a phone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Typical trade-offs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Recurring cost.&lt;/strong&gt; Most are subscriptions. Pricing varies by tier and changes, so look at the current plan page rather than trusting a blog post (including this one).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your data lives in their system.&lt;/strong&gt; Exports exist on many apps, but the format and completeness vary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fixed definitions.&lt;/strong&gt; The app decides how R, fees or "a trade" are calculated. If your method differs, such as partial exits, futures multipliers or prop-firm rules, you may have to work around it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Import quirks.&lt;/strong&gt; Automatic imports are a big time-saver when your broker is supported. When it isn't, you're back to manual entry or CSV wrangling.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What a Google Sheets journal offers
&lt;/h2&gt;

&lt;p&gt;A spreadsheet is the opposite trade:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;You own the file.&lt;/strong&gt; It sits in your Drive or on your disk. No account to keep, and nothing disappears if a service shuts down.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every formula is visible.&lt;/strong&gt; You can see exactly how P&amp;amp;L or R is calculated and change it. Futures multipliers, commission rules and a custom R definition are a one-cell edit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your own rules.&lt;/strong&gt; Prop-firm daily loss limits, trailing drawdown and consistency rules can be checked right next to your trades.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-time or no cost.&lt;/strong&gt; Build it yourself, or buy a template once.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the downsides, honestly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Manual entry&lt;/strong&gt; unless you paste in a broker export and map the columns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fewer built-in reports.&lt;/strong&gt; Charts and pivot tables are there, but you set them up (or the template does).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's easy to break.&lt;/strong&gt; One overwritten formula can quietly skew a column. Protected ranges help.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobile editing works but isn't pleasant&lt;/strong&gt; for long sessions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A quick example
&lt;/h2&gt;

&lt;p&gt;Here's what one row looks like in a sheet. &lt;strong&gt;Example data, not a real trade:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Ticker&lt;/th&gt;
&lt;th&gt;Side&lt;/th&gt;
&lt;th&gt;Entry&lt;/th&gt;
&lt;th&gt;Exit&lt;/th&gt;
&lt;th&gt;Stop&lt;/th&gt;
&lt;th&gt;Qty&lt;/th&gt;
&lt;th&gt;Fees&lt;/th&gt;
&lt;th&gt;Net P&amp;amp;L&lt;/th&gt;
&lt;th&gt;Risk&lt;/th&gt;
&lt;th&gt;R&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2026-10-01&lt;/td&gt;
&lt;td&gt;AAPL&lt;/td&gt;
&lt;td&gt;Long&lt;/td&gt;
&lt;td&gt;228.50&lt;/td&gt;
&lt;td&gt;231.10&lt;/td&gt;
&lt;td&gt;227.20&lt;/td&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;td&gt;2.00&lt;/td&gt;
&lt;td&gt;778.00&lt;/td&gt;
&lt;td&gt;390.00&lt;/td&gt;
&lt;td&gt;2.00R&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The formulas behind it are short:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Net P&amp;amp;L (long): &lt;code&gt;=(Exit-Entry)*Qty-Fees&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Risk: &lt;code&gt;=ABS(Entry-Stop)*Qty&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;R multiple: &lt;code&gt;=IFERROR(NetPL/Risk,"")&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An app would calculate the same row for you, possibly with slightly different fee or R rules. The sheet makes you see the rule, which some traders find useful and others find tedious. Neither is wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to decide
&lt;/h2&gt;

&lt;p&gt;Ask yourself these five questions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. How many trades do you log per week?&lt;/strong&gt;&lt;br&gt;
If it's dozens of short-term trades, manual entry gets painful fast, and broker imports are the main reason to pay for an app. If it's a handful of swing trades or a few prop-challenge days, typing them in takes minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Do your calculations fit a standard mould?&lt;/strong&gt;&lt;br&gt;
If you trade futures with multipliers, scale in and out, or need to check prop-firm rules, a sheet you can edit is easier to bend. If you trade plain stock shares, most apps handle you fine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Will you review it?&lt;/strong&gt;&lt;br&gt;
The best journal is the one you reopen every Friday. Some people only review because an app emails them a summary. Others like a weekly review tab with a few written prompts. Be honest about which you are.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Where do you want your data to live?&lt;/strong&gt;&lt;br&gt;
If you want a file you control, and can still open years from now, a spreadsheet wins by default.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Do you want to pay monthly?&lt;/strong&gt;&lt;br&gt;
That's a personal budget call, but it's worth putting a number on it before signing up.&lt;/p&gt;

&lt;p&gt;A reasonable path for many people is to &lt;strong&gt;start with a spreadsheet&lt;/strong&gt;, journal for a month, and see what you actually look at. If you keep wishing trades imported themselves or want reports you can't easily build, that's a clear sign an app is worth trying. If you never touch half the columns, you've learned that cheaply.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make a spreadsheet journal you'll stick with
&lt;/h2&gt;

&lt;p&gt;If you go the sheet route, a few habits matter more than the template:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keep inputs and formulas apart.&lt;/strong&gt; Shade input columns one colour and protect the calculated ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use dropdowns&lt;/strong&gt; for setup, session and mistake tags so your summaries group cleanly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add a weekly review tab&lt;/strong&gt; with three prompts: best trade and why, worst trade and lesson, one rule to keep.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Log the plan, not just the result.&lt;/strong&gt; Recording the planned stop and target is what makes R meaningful.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Put rule checks next to the log&lt;/strong&gt; if you're in a prop challenge, so a daily loss limit or drawdown is visible before it's breached.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Apps save typing and give you reports out of the box, usually on a subscription, with their definitions.&lt;/li&gt;
&lt;li&gt;Spreadsheets give you ownership, transparency and custom rules, in exchange for manual entry and some setup.&lt;/li&gt;
&lt;li&gt;Pick based on how much you trade, how custom your maths is, and whether you'll actually review. Not on feature count.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If you'd rather not build the sheet yourself, the &lt;strong&gt;&lt;a href="https://ailstudio.gumroad.com/l/qsnmk?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=trading-journal-in-google-sheets-vs-a-journaling-app-what-you-actually-need" rel="noopener noreferrer"&gt;Trader's Edge Journal ($14)&lt;/a&gt;&lt;/strong&gt; is a trading journal template for Google Sheets and Excel. It has a trade log with automatic P&amp;amp;L, win rate and R multiple, a performance dashboard, daily/weekly/monthly review tabs and a Prop Firm Tracker. It comes as an .xlsx with sample trades and a short quick-start guide. It's a record-keeping tool. It doesn't tell you what to trade or promise any results.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Not financial advice. Example figures are for illustration only.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Related tool:&lt;/strong&gt; the Trader's Edge Journal is the Google Sheets journal and performance dashboard described above.&lt;br&gt;
&lt;a href="https://ailstudio.gumroad.com/l/qsnmk?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=crosslink" rel="noopener noreferrer"&gt;Trader's Edge Journal&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By Richard C · AIL Studio&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Related from AIL Studio&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/7-chatgpt-prompts-that-turn-messy-spreadsheets-into-clean-reports-3g5k"&gt;7 ChatGPT prompts that turn messy spreadsheets into clean reports&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/how-to-find-every-subscription-youre-paying-for-in-15-minutes-a-simple-google-sheets-audit-29fo"&gt;How to find every subscription you're paying for in 15 minutes (a simple Google Sheets audit)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/how-to-track-prop-firm-challenge-rules-in-google-sheets-daily-loss-max-drawdown-consistency-4c4n"&gt;How to track prop firm challenge rules in Google Sheets (daily loss, max drawdown, consistency)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/prop-firm-rules-compared-oct-2026-2g4f"&gt;Prop firm rules compared (Oct 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/the-5-trading-stats-every-trader-should-track-with-formulas-and-worked-examples-4lgh"&gt;The 5 Trading Stats Every Trader Should Track (With Formulas and Worked Examples)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/how-i-built-a-subscription-tracker-in-google-sheets-formulas-to-normalize-any-billing-cycle-5gc7"&gt;How I built a subscription tracker in Google Sheets (formulas to normalize any billing cycle)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>googlesheets</category>
      <category>trading</category>
      <category>spreadsheet</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to find every subscription you're paying for in 15 minutes (a simple Google Sheets audit)</title>
      <dc:creator>Richard C</dc:creator>
      <pubDate>Mon, 26 Oct 2026 22:35:37 +0000</pubDate>
      <link>https://dev.to/richardc_ailstudio/how-to-find-every-subscription-youre-paying-for-in-15-minutes-a-simple-google-sheets-audit-29fo</link>
      <guid>https://dev.to/richardc_ailstudio/how-to-find-every-subscription-youre-paying-for-in-15-minutes-a-simple-google-sheets-audit-29fo</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;a href="https://ailstudio.gumroad.com/l/ipnphp?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=how-to-find-every-subscription-youre-paying-for-in-15-minutes-a-simple-google-sheets-audit" rel="noopener noreferrer"&gt;Get Subscription Audit Lite&lt;/a&gt;&lt;/strong&gt;: a free ($0+) .xlsx audit sheet for Google Sheets or Excel. It has 30 rows, Monthly/Yearly cycles, Keep/Cancel/Review dropdowns, and totals for monthly cost, yearly cost and potential yearly savings.&lt;/p&gt;

&lt;p&gt;The hard part of a subscription audit isn't the math. It's finding the charges. Small recurring payments are spread across cards, app stores and PayPal, and some bill only once a year. This is a 15-minute hunt to list every one of them, then a few formulas to see what they add up to.&lt;/p&gt;

&lt;p&gt;Set a timer and work through the steps in order.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minutes 0–3: gather your statements
&lt;/h2&gt;

&lt;p&gt;Download or open the last &lt;strong&gt;2–3 months&lt;/strong&gt; of statements for every bank account and credit or debit card you use. One month isn't enough, because quarterly and weekly charges are easy to miss in a single month.&lt;/p&gt;

&lt;p&gt;If you can, also skim your card's transactions from the &lt;strong&gt;last 12 months&lt;/strong&gt; for anything with "annual" or a round yearly amount. Yearly renewals are the ones people forget most.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minutes 3–8: search for recurring merchants
&lt;/h2&gt;

&lt;p&gt;Rather than reading every line, search each statement (Ctrl+F / Cmd+F in the PDF or online banking) for words that usually show up on subscription charges:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;subscription&lt;/code&gt;, &lt;code&gt;membership&lt;/code&gt;, &lt;code&gt;monthly&lt;/code&gt;, &lt;code&gt;annual&lt;/code&gt;, &lt;code&gt;renew&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.com&lt;/code&gt;, &lt;code&gt;digital&lt;/code&gt;, &lt;code&gt;premium&lt;/code&gt;, &lt;code&gt;plus&lt;/code&gt;, &lt;code&gt;pro&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;the same merchant name appearing in more than one month&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Any merchant that appears at the same amount every month (or every week) goes on your list. Note the amount exactly as charged and how often it repeats.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minutes 8–12: check the places statements hide
&lt;/h2&gt;

&lt;p&gt;Some subscriptions show up on your statement under a single umbrella name, so check the source too:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Apple:&lt;/strong&gt; Settings → your name → Subscriptions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Play:&lt;/strong&gt; Play Store → profile → Payments &amp;amp; subscriptions → Subscriptions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PayPal:&lt;/strong&gt; Settings → Payments → Manage automatic payments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email:&lt;/strong&gt; search your inbox for &lt;code&gt;receipt&lt;/code&gt;, &lt;code&gt;your subscription&lt;/code&gt;, &lt;code&gt;renewal&lt;/code&gt;, &lt;code&gt;free trial&lt;/code&gt; and &lt;code&gt;invoice&lt;/code&gt;. This catches trials that turned into paid plans.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Add anything new to the list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minutes 12–15: log it and do the math
&lt;/h2&gt;

&lt;p&gt;Open a blank Google Sheet and put these headers in row 1:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;A&lt;/th&gt;
&lt;th&gt;B&lt;/th&gt;
&lt;th&gt;C&lt;/th&gt;
&lt;th&gt;D&lt;/th&gt;
&lt;th&gt;E&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Amount&lt;/td&gt;
&lt;td&gt;Cycle&lt;/td&gt;
&lt;td&gt;Monthly cost&lt;/td&gt;
&lt;td&gt;Keep/Cancel&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Example data&lt;/strong&gt; (made-up subscriptions for illustration, not real charges):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Row&lt;/th&gt;
&lt;th&gt;A: Name&lt;/th&gt;
&lt;th&gt;B: Amount&lt;/th&gt;
&lt;th&gt;C: Cycle&lt;/th&gt;
&lt;th&gt;E: Keep/Cancel&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Streaming service&lt;/td&gt;
&lt;td&gt;15.49&lt;/td&gt;
&lt;td&gt;Monthly&lt;/td&gt;
&lt;td&gt;Keep&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Music app&lt;/td&gt;
&lt;td&gt;10.99&lt;/td&gt;
&lt;td&gt;Monthly&lt;/td&gt;
&lt;td&gt;Keep&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Cloud storage&lt;/td&gt;
&lt;td&gt;29.99&lt;/td&gt;
&lt;td&gt;Yearly&lt;/td&gt;
&lt;td&gt;Keep&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Fitness app&lt;/td&gt;
&lt;td&gt;4.99&lt;/td&gt;
&lt;td&gt;Weekly&lt;/td&gt;
&lt;td&gt;Cancel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;News site&lt;/td&gt;
&lt;td&gt;79.00&lt;/td&gt;
&lt;td&gt;Yearly&lt;/td&gt;
&lt;td&gt;Cancel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Meal kit (after trial)&lt;/td&gt;
&lt;td&gt;12.00&lt;/td&gt;
&lt;td&gt;Monthly&lt;/td&gt;
&lt;td&gt;Cancel&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Turn every charge into a monthly cost (column D)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;D2: =IF(C2="Yearly",B2/12,IF(C2="Weekly",B2*52/12,B2))      (fill down to D7)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yearly charges are divided by 12, weekly charges are multiplied by 52 and divided by 12, and anything else is treated as monthly. With the example data, column D reads:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Row&lt;/th&gt;
&lt;th&gt;Monthly cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;15.49&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;10.99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;2.50 (29.99 / 12)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;21.62 (4.99 × 52 / 12)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;6.58 (79 / 12)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;12.00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Totals
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;D8:  =SUM(D2:D7)                          → 69.19   total per month
D9:  =SUMIF(E2:E7,"Cancel",D2:D7)         → 40.21   saved per month if you cancel
D10: =D9*12                               → 482.48  saved per year
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice the weekly fitness app: $4.99 looks small, but it works out to about $21.62 a month. Converting everything to one cycle is what makes charges like that stand out.&lt;/p&gt;

&lt;h2&gt;
  
  
  After the 15 minutes
&lt;/h2&gt;

&lt;p&gt;Cancelling is a separate job. For each row marked Cancel, cancel through the same place you found it (the app store, PayPal or the merchant's account page), then check your next statement to confirm the charge stopped. Your actual savings depend on what you cancel and when each plan renews.&lt;/p&gt;




&lt;p&gt;If you'd like to keep tracking after the audit, the &lt;strong&gt;&lt;a href="https://ailstudio.gumroad.com/l/qkwkix?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=how-to-find-every-subscription-youre-paying-for-in-15-minutes-a-simple-google-sheets-audit" rel="noopener noreferrer"&gt;Subscription Tracker (name your price, from $1)&lt;/a&gt;&lt;/strong&gt; is an .xlsx template for Google Sheets or Excel. It has room for 100 subscriptions and six billing cycles (weekly, biweekly, monthly, quarterly, every 6 months, yearly). It works out monthly and yearly costs and has a "days left" column that turns rows yellow 30 days and red 7 days before a renewal. It also has a dashboard with totals, upcoming renewals and a category pie chart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Related tool:&lt;/strong&gt; to keep the list current after your audit, the Subscription Tracker shows every renewal before you're charged.&lt;br&gt;
&lt;a href="https://ailstudio.gumroad.com/l/qkwkix?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=crosslink" rel="noopener noreferrer"&gt;Subscription Tracker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By Richard C · AIL Studio&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Related from AIL Studio&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/7-chatgpt-prompts-that-turn-messy-spreadsheets-into-clean-reports-3g5k"&gt;7 ChatGPT prompts that turn messy spreadsheets into clean reports&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/trading-journal-in-google-sheets-vs-a-journaling-app-what-you-actually-need-284m"&gt;Trading journal in Google Sheets vs. a journaling app: what you actually need&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/how-to-track-prop-firm-challenge-rules-in-google-sheets-daily-loss-max-drawdown-consistency-4c4n"&gt;How to track prop firm challenge rules in Google Sheets (daily loss, max drawdown, consistency)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/prop-firm-rules-compared-oct-2026-2g4f"&gt;Prop firm rules compared (Oct 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/the-5-trading-stats-every-trader-should-track-with-formulas-and-worked-examples-4lgh"&gt;The 5 Trading Stats Every Trader Should Track (With Formulas and Worked Examples)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/how-i-built-a-subscription-tracker-in-google-sheets-formulas-to-normalize-any-billing-cycle-5gc7"&gt;How I built a subscription tracker in Google Sheets (formulas to normalize any billing cycle)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>googlesheets</category>
      <category>productivity</category>
      <category>personalfinance</category>
      <category>spreadsheets</category>
    </item>
    <item>
      <title>How to track prop firm challenge rules in Google Sheets (daily loss, max drawdown, consistency)</title>
      <dc:creator>Richard C</dc:creator>
      <pubDate>Mon, 26 Oct 2026 22:13:31 +0000</pubDate>
      <link>https://dev.to/richardc_ailstudio/how-to-track-prop-firm-challenge-rules-in-google-sheets-daily-loss-max-drawdown-consistency-4c4n</link>
      <guid>https://dev.to/richardc_ailstudio/how-to-track-prop-firm-challenge-rules-in-google-sheets-daily-loss-max-drawdown-consistency-4c4n</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Not financial advice.&lt;/strong&gt; This is a spreadsheet tutorial for record-keeping. Rules change, verify with the firm before buying.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://ailstudio.gumroad.com/l/cbjdeq?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=how-to-track-prop-firm-challenge-rules-in-google-sheets-daily-loss-max-drawdown-consistency" rel="noopener noreferrer"&gt;Get the Prop Firm Rules Cheat Sheet (xlsx)&lt;/a&gt;&lt;/strong&gt;: a free sheet comparing drawdown, daily loss, profit target, minimum days, payout split and price for 10 prop firms (checked Oct 2026).&lt;/p&gt;

&lt;p&gt;Prop firm challenges come with a handful of rules that can end an account: a daily loss limit, a max drawdown, a profit target, a minimum number of trading days and sometimes a consistency rule. Each one is simple arithmetic, so a small Google Sheet can check all of them every time you log a day.&lt;/p&gt;

&lt;p&gt;Below we build that sheet from scratch. Every formula uses exact cell references, so you can type it in as you read.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Settings (A1:B6)
&lt;/h2&gt;

&lt;p&gt;Put your challenge's numbers in column B. The values here are placeholders for a $50K-style account. Replace them with your firm's actual rules.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cell&lt;/th&gt;
&lt;th&gt;Label (column A)&lt;/th&gt;
&lt;th&gt;Value (column B)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;B1&lt;/td&gt;
&lt;td&gt;Starting balance&lt;/td&gt;
&lt;td&gt;50000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B2&lt;/td&gt;
&lt;td&gt;Daily loss limit&lt;/td&gt;
&lt;td&gt;1000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B3&lt;/td&gt;
&lt;td&gt;Max drawdown&lt;/td&gt;
&lt;td&gt;2000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B4&lt;/td&gt;
&lt;td&gt;Profit target&lt;/td&gt;
&lt;td&gt;3000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B5&lt;/td&gt;
&lt;td&gt;Min trading days&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B6&lt;/td&gt;
&lt;td&gt;Consistency max (best day / target)&lt;/td&gt;
&lt;td&gt;0.55&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  2. Daily P&amp;amp;L log (A9:H16)
&lt;/h2&gt;

&lt;p&gt;Row 9 holds the headers: &lt;strong&gt;Date, Daily P&amp;amp;L, Running balance, Traded?, Daily loss check, Peak EOD balance, Trailing floor, Trailing DD check&lt;/strong&gt; (columns A–H). Put the label "Example data (not real trades)" in A8.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example data&lt;/strong&gt; (made-up numbers for illustration, not real trades):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Row&lt;/th&gt;
&lt;th&gt;A: Date&lt;/th&gt;
&lt;th&gt;B: Daily P&amp;amp;L&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;2026-10-01&lt;/td&gt;
&lt;td&gt;400&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;2026-10-02&lt;/td&gt;
&lt;td&gt;-300&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;2026-10-05&lt;/td&gt;
&lt;td&gt;0 (no trades)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;2026-10-06&lt;/td&gt;
&lt;td&gt;900&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;2026-10-07&lt;/td&gt;
&lt;td&gt;-1100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;2026-10-08&lt;/td&gt;
&lt;td&gt;600&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;2026-10-09&lt;/td&gt;
&lt;td&gt;700&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You only type columns A and B. Everything else is a formula.&lt;/p&gt;

&lt;h3&gt;
  
  
  Running balance (column C)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C10: =$B$1+B10
C11: =C10+B11      (fill down to C16)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Days traded (column D)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;D10: =IF(B10&amp;lt;&amp;gt;0,"Yes","No")      (fill down to D16)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A day with a P&amp;amp;L of exactly 0 counts as "No" here. If you can trade flat, type Yes/No by hand instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Daily loss limit check (column E)
&lt;/h2&gt;

&lt;p&gt;Flag any day where the loss reached the limit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;E10: =IF(B10&amp;lt;=-$B$2,"BREACH","OK")      (fill down to E16)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example, row 14 (-1100) shows &lt;strong&gt;BREACH&lt;/strong&gt;. Many firms measure daily loss intraday, including open trades, so an end-of-day log is a record, not a live guard.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Max drawdown: two versions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Static drawdown
&lt;/h3&gt;

&lt;p&gt;The floor never moves. It's the starting balance minus the max drawdown.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;B21: =B1-B3                                   → 48000
B22: =IF(MIN(C10:C16)&amp;lt;=B21,"BREACH","OK")      → OK
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  End-of-day trailing drawdown
&lt;/h3&gt;

&lt;p&gt;The floor follows your highest end-of-day balance. Track the peak per row with MAX:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;F10: =MAX($B$1,C10)
F11: =MAX(F10,C11)                (fill down to F16)
G10: =MIN(F10-$B$3,$B$1)          (fill down to G16)
H10: =IF(C10&amp;lt;=G10,"BREACH","OK")  (fill down to H16)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Some firms stop trailing once the floor reaches the starting balance (it "locks" there). The &lt;code&gt;MIN(...,$B$1)&lt;/code&gt; in column G handles that. If your firm doesn't lock, use &lt;code&gt;=F10-$B$3&lt;/code&gt; instead.&lt;/p&gt;

&lt;p&gt;For a one-line summary of the latest values:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;B23: =MAX(B1,MAX(C10:C16))          → 51200   (peak EOD balance)
B24: =MIN(B23-B3,B1)                → 49200   (trailing floor)
B25: =IF(C16&amp;lt;=B24,"BREACH","OK")    → OK
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Profit target progress
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;B19: =C16              → 51200  (current balance)
B20: =SUM(B10:B16)     → 1200   (total P&amp;amp;L)
B26: =B20/B4           → 0.4    (format as %, so 40%)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. Minimum trading days
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;B27: =COUNTIF(D10:D16,"Yes")      → 6
B28: =IF(B27&amp;gt;=B5,"Yes","No")      → Yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  7. Consistency rule
&lt;/h2&gt;

&lt;p&gt;Some firms cap how much of your result can come from a single day. Topstep's wording is to keep your best day below 55% of your profit target. Firms define this differently (some use total profit, some use other percentages, some have no rule), so check your firm's exact definition and change B6 or the formula to match.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;B29: =MAX(B10:B16)                    → 900   (best day)
B30: =B29/B4                          → 0.3   (30%)
B31: =IF(B30&amp;lt;=B6,"OK","Over limit")   → OK
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  8. Optional: conditional formatting
&lt;/h2&gt;

&lt;p&gt;Select E10:E16 and H10:H16, then go to &lt;strong&gt;Format → Conditional formatting → Text is exactly&lt;/strong&gt; &lt;code&gt;BREACH&lt;/code&gt; and pick a red fill. Do the same for B22, B25 and B31 (use &lt;code&gt;Over limit&lt;/code&gt; for B31). For B26, a &lt;strong&gt;Color scale&lt;/strong&gt; gives a quick visual of progress toward the target.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results with the example data
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Cell&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Current balance&lt;/td&gt;
&lt;td&gt;B19&lt;/td&gt;
&lt;td&gt;51200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Daily loss&lt;/td&gt;
&lt;td&gt;E14&lt;/td&gt;
&lt;td&gt;BREACH (-1100 vs 1000 limit)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Static drawdown&lt;/td&gt;
&lt;td&gt;B22&lt;/td&gt;
&lt;td&gt;OK (floor 48000)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trailing drawdown&lt;/td&gt;
&lt;td&gt;B25&lt;/td&gt;
&lt;td&gt;OK (floor 49200)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Profit target&lt;/td&gt;
&lt;td&gt;B26&lt;/td&gt;
&lt;td&gt;40%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trading days&lt;/td&gt;
&lt;td&gt;B27 / B28&lt;/td&gt;
&lt;td&gt;6 / Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Consistency&lt;/td&gt;
&lt;td&gt;B30 / B31&lt;/td&gt;
&lt;td&gt;30% / OK&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I checked these formulas in a real spreadsheet with the example data above, and they gave these results.&lt;/p&gt;

&lt;p&gt;A sheet like this keeps your records honest. It doesn't predict or improve results, and it doesn't replace the firm's own dashboard, which is the official record.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus: trade stats formulas (win rate, R-multiple, profit factor)
&lt;/h2&gt;

&lt;p&gt;The rule checks above work on daily totals. To review the trades behind them, add a second tab called &lt;strong&gt;Trades&lt;/strong&gt;. Put "Example data (not real trades)" in A1 and the headers &lt;strong&gt;Trade #, P&amp;amp;L ($), Risk ($), R-multiple&lt;/strong&gt; in A2:D2. Trades go in rows 3–10.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example data&lt;/strong&gt; (made-up numbers for illustration, not real trades):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Row&lt;/th&gt;
&lt;th&gt;A: Trade #&lt;/th&gt;
&lt;th&gt;B: P&amp;amp;L ($)&lt;/th&gt;
&lt;th&gt;C: Risk ($)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;td&gt;150&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;-150&lt;/td&gt;
&lt;td&gt;150&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;450&lt;/td&gt;
&lt;td&gt;150&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;-200&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;-100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;600&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;-150&lt;/td&gt;
&lt;td&gt;150&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;250&lt;/td&gt;
&lt;td&gt;125&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;"Risk" is what you planned to lose if your initial stop was hit.&lt;/p&gt;

&lt;h3&gt;
  
  
  R-multiple per trade (column D)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;D3: =IFERROR(B3/C3,"")      (fill down to D10)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;IFERROR leaves the cell blank instead of showing &lt;code&gt;#DIV/0!&lt;/code&gt; when Risk is empty or 0. In the example, column D reads 2, -1, 3, -2, -1, 3, -1, 2.&lt;/p&gt;

&lt;h3&gt;
  
  
  Win rate, average R, profit factor
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;B12: =COUNTIF(B3:B10,"&amp;gt;0")/COUNT(B3:B10)      → 0.5    (50%, 4 of 8)
B13: =AVERAGE(D3:D10)                         → 0.625
B14: =IF(SUMIF(B3:B10,"&amp;lt;0")=0,"No losses",SUMIF(B3:B10,"&amp;gt;0")/ABS(SUMIF(B3:B10,"&amp;lt;0")))   → 2.67
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Put the labels Win rate, Average R and Profit factor in A12:A14. Profit factor is gross wins divided by gross losses. Here that's 1600 / 600. The IF guard shows "No losses" instead of a divide-by-zero error.&lt;/p&gt;

&lt;p&gt;AVERAGE skips the blank cells IFERROR leaves, so a trade with no recorded risk isn't counted as 0R. Treat these numbers as a description of past entries. A small sample like eight trades says very little about what comes next.&lt;/p&gt;

&lt;p&gt;These stats sit next to the rule checks, not in place of them. Your daily loss check (column E on the first tab) and max drawdown checks (B22 static, columns F–H and B25 trailing) are still what tell you whether the account is within the firm's rules.&lt;/p&gt;




&lt;p&gt;If you'd rather not build it yourself, the &lt;strong&gt;&lt;a href="https://ailstudio.gumroad.com/l/qsnmk?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=how-to-track-prop-firm-challenge-rules-in-google-sheets-daily-loss-max-drawdown-consistency" rel="noopener noreferrer"&gt;Trader's Edge Journal ($14)&lt;/a&gt;&lt;/strong&gt; is a trading journal template for Google Sheets and Excel. It includes a trade log with automatic P&amp;amp;L, win rate and R-multiple, a performance dashboard, daily/weekly/monthly review tabs and a Prop Firm Tracker. It comes as an .xlsx with 15 sample trades and a short PDF quick-start guide. It's a record-keeping tool: it doesn't tell you what to trade or guarantee any results.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Not financial advice. Rules change, verify with the firm before buying.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Related tool:&lt;/strong&gt; to compare rules across firms before you pick a challenge, see the Prop Firm Rules Cheat Sheet.&lt;br&gt;
&lt;a href="https://ailstudio.gumroad.com/l/cbjdeq?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=crosslink" rel="noopener noreferrer"&gt;Prop Firm Rules Cheat Sheet&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By Richard C · AIL Studio&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Related from AIL Studio&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/7-chatgpt-prompts-that-turn-messy-spreadsheets-into-clean-reports-3g5k"&gt;7 ChatGPT prompts that turn messy spreadsheets into clean reports&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/trading-journal-in-google-sheets-vs-a-journaling-app-what-you-actually-need-284m"&gt;Trading journal in Google Sheets vs. a journaling app: what you actually need&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/how-to-find-every-subscription-youre-paying-for-in-15-minutes-a-simple-google-sheets-audit-29fo"&gt;How to find every subscription you're paying for in 15 minutes (a simple Google Sheets audit)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/prop-firm-rules-compared-oct-2026-2g4f"&gt;Prop firm rules compared (Oct 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/the-5-trading-stats-every-trader-should-track-with-formulas-and-worked-examples-4lgh"&gt;The 5 Trading Stats Every Trader Should Track (With Formulas and Worked Examples)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/how-i-built-a-subscription-tracker-in-google-sheets-formulas-to-normalize-any-billing-cycle-5gc7"&gt;How I built a subscription tracker in Google Sheets (formulas to normalize any billing cycle)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>googlesheets</category>
      <category>trading</category>
      <category>spreadsheets</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Prop firm rules compared (Oct 2026)</title>
      <dc:creator>Richard C</dc:creator>
      <pubDate>Mon, 26 Oct 2026 21:55:10 +0000</pubDate>
      <link>https://dev.to/richardc_ailstudio/prop-firm-rules-compared-oct-2026-2g4f</link>
      <guid>https://dev.to/richardc_ailstudio/prop-firm-rules-compared-oct-2026-2g4f</guid>
      <description>&lt;p&gt;&lt;strong&gt;Not financial advice.&lt;/strong&gt; Rules change, verify with the firm before buying. Checked Oct 2026.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://ailstudio.gumroad.com/l/cbjdeq?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=prop-firm-rules-compared-oct-2026" rel="noopener noreferrer"&gt;Get the Prop Firm Rules Cheat Sheet (xlsx)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Prop firm challenges look alike until you read the rules. Below is one representative plan from each of 10 popular firms, with every value taken from the firm's own website or help center in October 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  The comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Firm&lt;/th&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Max drawdown&lt;/th&gt;
&lt;th&gt;Daily loss limit&lt;/th&gt;
&lt;th&gt;Profit target&lt;/th&gt;
&lt;th&gt;Min trading days&lt;/th&gt;
&lt;th&gt;Payout split&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ftmo.com/en/trading-objectives/" rel="noopener noreferrer"&gt;FTMO&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$100K 2-Step&lt;/td&gt;
&lt;td&gt;10% static ($10,000)&lt;/td&gt;
&lt;td&gt;5% ($5,000)&lt;/td&gt;
&lt;td&gt;10% then 5%&lt;/td&gt;
&lt;td&gt;4 per phase&lt;/td&gt;
&lt;td&gt;80% (up to 90%)&lt;/td&gt;
&lt;td&gt;€540 one-time, refundable with first reward&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.topstep.com/topstep-prop" rel="noopener noreferrer"&gt;Topstep&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$100K Trading Combine&lt;/td&gt;
&lt;td&gt;$3,000 end-of-day trailing&lt;/td&gt;
&lt;td&gt;None by default (optional $2,000)&lt;/td&gt;
&lt;td&gt;$6,000&lt;/td&gt;
&lt;td&gt;None fixed (min 2 days; 55% consistency target)&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;td&gt;$99/month + $149 activation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://apextraderfunding.com/help-center/intraday-trailing-drawdown-accounts/intraday-trailing-drawdown-evaluations/" rel="noopener noreferrer"&gt;Apex Trader Funding&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;100K Intraday Trail&lt;/td&gt;
&lt;td&gt;$3,000 intraday trailing&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;$6,000&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;$790 one-time (30-day eval) (promo $79 at check, Oct 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://the5ers.com/high-stakes/" rel="noopener noreferrer"&gt;The5ers&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$100K High Stakes&lt;/td&gt;
&lt;td&gt;8%&lt;/td&gt;
&lt;td&gt;4%&lt;/td&gt;
&lt;td&gt;8% then 5%&lt;/td&gt;
&lt;td&gt;3 profitable days&lt;/td&gt;
&lt;td&gt;80% (up to 100%)&lt;/td&gt;
&lt;td&gt;$455, refunded on passing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://fundednext.com/cfds/stellar-2-step" rel="noopener noreferrer"&gt;FundedNext&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$100K Stellar 2-Step&lt;/td&gt;
&lt;td&gt;10% static&lt;/td&gt;
&lt;td&gt;5%&lt;/td&gt;
&lt;td&gt;8% then 5%&lt;/td&gt;
&lt;td&gt;5 per phase&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;$549.99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://help.fundingpips.com/hc/en-us/articles/34501809112081-2-Step-Standard" rel="noopener noreferrer"&gt;FundingPips&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$100K 2-Step Standard&lt;/td&gt;
&lt;td&gt;10% static&lt;/td&gt;
&lt;td&gt;3% or 5%&lt;/td&gt;
&lt;td&gt;8% then 5%&lt;/td&gt;
&lt;td&gt;3 per phase&lt;/td&gt;
&lt;td&gt;60% / 80% / 100% by payout cycle&lt;/td&gt;
&lt;td&gt;$652&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://e8markets.com/" rel="noopener noreferrer"&gt;E8 Markets&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$100K E8 One&lt;/td&gt;
&lt;td&gt;$6,000 dynamic&lt;/td&gt;
&lt;td&gt;$4,000&lt;/td&gt;
&lt;td&gt;$9,000&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;$488&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://takeprofittrader.com/" rel="noopener noreferrer"&gt;Take Profit Trader&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$100K Test&lt;/td&gt;
&lt;td&gt;$3,000 end-of-day trailing&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;$6,000&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;80% (90% in PRO+)&lt;/td&gt;
&lt;td&gt;$330/mo + $130 activation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://alphacapitalgroup.uk/resources/alpha-capital-2026-plan-pricing-update" rel="noopener noreferrer"&gt;Alpha Capital Group&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$100K Alpha Pro 10%&lt;/td&gt;
&lt;td&gt;10% static&lt;/td&gt;
&lt;td&gt;5%&lt;/td&gt;
&lt;td&gt;10% then 5%&lt;/td&gt;
&lt;td&gt;3 per phase&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;$497 (bi-weekly) / $447 (on-demand)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://myfundedfutures.com/plans/rapid" rel="noopener noreferrer"&gt;My Funded Futures&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$50K Rapid ($50K size)&lt;/td&gt;
&lt;td&gt;$2,000 end-of-day trailing&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;$3,000&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;td&gt;$209 one-time&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;List prices shown; most firms run promo codes that change often. My Funded Futures is listed at $50K because that is the size its plan page prices.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the rules mean
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Max drawdown: static vs trailing.&lt;/strong&gt; This is the most you can lose before the account fails.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Static&lt;/em&gt; (FTMO, FundedNext, FundingPips, Alpha Capital): the floor is fixed at your starting balance minus the limit. On a $100K account with 10%, you fail at $90,000, no matter how high you climb first.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Trailing&lt;/em&gt; (most futures firms): the floor follows your highest balance upward. &lt;em&gt;End-of-day&lt;/em&gt; trailing (Topstep, Take Profit Trader, My Funded Futures) only moves at the close; &lt;em&gt;intraday&lt;/em&gt; trailing (Apex) moves with open profit in real time, so a winning trade that reverses can tighten your floor. Trailing usually stops once it reaches the starting balance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Daily loss limit.&lt;/strong&gt; A cap on how much you can lose in one trading day, usually measured from the day's starting balance or equity. Breaking it fails the account at most forex/CFD firms; several futures firms have no daily limit at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Profit target.&lt;/strong&gt; The gain needed to pass. Two-step challenges have one target per phase (often 8–10%, then 5%); one-step evaluations have a single target.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Minimum trading days.&lt;/strong&gt; The fewest days you must trade before passing. Some firms also use a &lt;em&gt;consistency rule&lt;/em&gt; (for example, Topstep's best day should stay below 55% of the profit target), which effectively stops you passing on a single lucky day.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Payout split.&lt;/strong&gt; Your share of profits once funded. A 90% split means you keep $90 of every $100 in profit. Some firms raise the split over time or offer it as a paid add-on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before you buy
&lt;/h2&gt;

&lt;p&gt;Read the firm's current rules page, check the exact plan size and drawdown type, and note any activation or monthly fees on top of the challenge price.&lt;/p&gt;

&lt;p&gt;Rules change, verify with the firm before buying. Checked Oct 2026.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://ailstudio.gumroad.com/l/cbjdeq?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=prop-firm-rules-compared-oct-2026" rel="noopener noreferrer"&gt;Get the Prop Firm Rules Cheat Sheet (xlsx)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Related tool:&lt;/strong&gt; once you've picked a firm, the Trader's Edge Journal tracks your trades and performance in Google Sheets.&lt;br&gt;
&lt;a href="https://ailstudio.gumroad.com/l/qsnmk?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=crosslink" rel="noopener noreferrer"&gt;Trader's Edge Journal&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By Richard C · AIL Studio&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Related from AIL Studio&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/7-chatgpt-prompts-that-turn-messy-spreadsheets-into-clean-reports-3g5k"&gt;7 ChatGPT prompts that turn messy spreadsheets into clean reports&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/trading-journal-in-google-sheets-vs-a-journaling-app-what-you-actually-need-284m"&gt;Trading journal in Google Sheets vs. a journaling app: what you actually need&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/how-to-find-every-subscription-youre-paying-for-in-15-minutes-a-simple-google-sheets-audit-29fo"&gt;How to find every subscription you're paying for in 15 minutes (a simple Google Sheets audit)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/how-to-track-prop-firm-challenge-rules-in-google-sheets-daily-loss-max-drawdown-consistency-4c4n"&gt;How to track prop firm challenge rules in Google Sheets (daily loss, max drawdown, consistency)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/the-5-trading-stats-every-trader-should-track-with-formulas-and-worked-examples-4lgh"&gt;The 5 Trading Stats Every Trader Should Track (With Formulas and Worked Examples)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/how-i-built-a-subscription-tracker-in-google-sheets-formulas-to-normalize-any-billing-cycle-5gc7"&gt;How I built a subscription tracker in Google Sheets (formulas to normalize any billing cycle)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>trading</category>
      <category>propfirm</category>
      <category>daytrading</category>
      <category>beginners</category>
    </item>
    <item>
      <title>5 ChatGPT Prompts for Small Business Owners That Do Real Work</title>
      <dc:creator>Richard C</dc:creator>
      <pubDate>Mon, 26 Oct 2026 21:26:48 +0000</pubDate>
      <link>https://dev.to/richardc_ailstudio/5-chatgpt-prompts-for-small-business-owners-that-do-real-work-311</link>
      <guid>https://dev.to/richardc_ailstudio/5-chatgpt-prompts-for-small-business-owners-that-do-real-work-311</guid>
      <description>&lt;p&gt;Most "ChatGPT prompts for small business" lists are one-liners like "write a marketing plan for my business." You get back something generic, because the AI knows nothing about you.&lt;/p&gt;

&lt;p&gt;The prompts below work better for two reasons. They ask for a specific output in a specific format, and they leave clear [BRACKETS] for your own details. They work in ChatGPT, Claude, Gemini, Grok, or any other AI chat tool.&lt;/p&gt;

&lt;p&gt;Replace everything in [BRACKETS]. The more context you give, the better the answer. If the first answer misses, follow up with "Make it shorter," "Make it sound more like me: [paste a sample of your writing]," or "Give me 3 alternatives."&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Clarify your offer
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I run [BUSINESS] serving [CUSTOMER TYPE] in [LOCATION]. Ask me 8 questions, one at a time, to uncover what makes my business different, then write a one-sentence value proposition and three short taglines based on my answers.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;When to use it:&lt;/strong&gt; Before you write a website, a Google Business Profile, or an ad. If you can't say in one sentence why someone should pick you, every other piece of marketing is harder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to tweak it:&lt;/strong&gt; The "one at a time" part matters. It makes the AI interview you instead of guessing. If the questions feel too broad, add "Focus on why customers choose us over [COMPETITOR TYPE]." Answer honestly and in detail. Your answers are the raw material, so short answers get you generic taglines.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Follow up on a quote that went quiet
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I sent a quote for [JOB] to [CLIENT] [X] days ago with no reply. Write a polite follow-up that offers to answer questions, restates the main benefit, and makes it easy to say no. Then write a second, final follow-up for a week later.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;When to use it:&lt;/strong&gt; A few days after sending a quote you haven't heard back on. Plenty of owners never follow up because it feels pushy, and that leaves work on the table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to tweak it:&lt;/strong&gt; "Makes it easy to say no" is deliberate. A reply of "no thanks" is still better than silence, because then you can stop waiting. Add details about the job, such as the client's deadline or the problem they described, so the follow-up sounds like you remember them. If you usually text clients, ask for "a text message under 300 characters" instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Reply to a negative review
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Here's a negative review: [PASTE]. Write a public reply that thanks them, acknowledges the specific issue without making excuses, explains what we're doing about it, and invites them to contact [CONTACT] offline. Under 100 words.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;When to use it:&lt;/strong&gt; When a bad review comes in and your first draft of a reply is defensive. Keep in mind that the reply is written for future customers reading it as much as for the reviewer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to tweak it:&lt;/strong&gt; Tell the AI what actually happened and what you've really changed, for example "We've since added a second person on Saturdays." Don't let it promise fixes you haven't made. If the review is unfair or factually wrong, add "Politely correct this factual error: [FACT]" and keep the tone calm.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Pick this week's priorities
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Here's everything on my plate this week: [LIST]. Help me pick the 3 that matter most for revenue or customers, identify what can be delegated or dropped, and lay out a realistic day-by-day plan.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;When to use it:&lt;/strong&gt; Monday morning, or any time your to-do list is longer than the week.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to tweak it:&lt;/strong&gt; Paste the messy list exactly as it is, with no cleanup needed. Add your constraints: "I'm on job sites Tuesday and Wednesday," "I only have 2 hours a day for admin." If the plan still looks too full, follow up with "Cut this to what's realistic in [X] hours total."&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Check your pricing
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I sell [PRODUCT/SERVICE] for [PRICE]. My costs are [COSTS] and I spend about [HOURS] per job. Calculate my effective margin and hourly rate, and suggest 3 pricing options (including a tiered package) with pros and cons.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;When to use it:&lt;/strong&gt; When you're busy but cash still feels tight, or before you raise prices. Seeing your effective hourly rate written out can be eye-opening.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to tweak it:&lt;/strong&gt; Include all of your costs, including materials, travel, software, and the unpaid time spent quoting and doing admin. Check the math yourself, because AI tools can make arithmetic mistakes. If you want the tiers to make sense to customers, add "Describe each tier the way a customer would see it."&lt;/p&gt;

&lt;h2&gt;
  
  
  A couple of ground rules
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Don't paste passwords, full card numbers, or sensitive customer data into AI tools.&lt;/li&gt;
&lt;li&gt;Read everything before it goes to a customer. Treat the AI's output as a first draft, not a finished one.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;These five come from a larger set of 50 prompts covering marketing, email, customer service, and operations. If you'd like the rest, the full pack is here: &lt;a href="https://ailstudio.gumroad.com/l/ineoz?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=5-chatgpt-prompts-for-small-business-owners-that-do-real-work" rel="noopener noreferrer"&gt;50 AI Prompts for Busy Small Business Owners&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;By Richard C · AIL Studio&lt;/p&gt;

</description>
      <category>chatgpt</category>
      <category>ai</category>
      <category>productivity</category>
      <category>prompts</category>
    </item>
    <item>
      <title>The 5 Trading Stats Every Trader Should Track (With Formulas and Worked Examples)</title>
      <dc:creator>Richard C</dc:creator>
      <pubDate>Mon, 26 Oct 2026 21:26:07 +0000</pubDate>
      <link>https://dev.to/richardc_ailstudio/the-5-trading-stats-every-trader-should-track-with-formulas-and-worked-examples-4lgh</link>
      <guid>https://dev.to/richardc_ailstudio/the-5-trading-stats-every-trader-should-track-with-formulas-and-worked-examples-4lgh</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Not financial advice.&lt;/strong&gt; This article is for education only. It explains how to measure your own trading results. It does not recommend any trade, strategy or product, and trading carries a real risk of loss.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most traders can tell you about their best trade. Far fewer can tell you whether their &lt;em&gt;system&lt;/em&gt; makes money. Your P&amp;amp;L for a single week is mostly noise. Five numbers, calculated from a plain trade log, tell you much more.&lt;/p&gt;

&lt;p&gt;All you need is a log with one row per closed trade: date, instrument, entry, exit, size, and the profit or loss in money. Add one more column if you can, &lt;strong&gt;planned risk&lt;/strong&gt; (how much you would have lost if your stop was hit). That one column unlocks most of what follows.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;All numbers below are made-up examples for illustration, not real results.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The example data set
&lt;/h2&gt;

&lt;p&gt;We'll use one invented sample of &lt;strong&gt;20 closed trades&lt;/strong&gt; throughout:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;th&gt;Average P&amp;amp;L&lt;/th&gt;
&lt;th&gt;Total&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Winners&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;+$150&lt;/td&gt;
&lt;td&gt;+$1,200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Losers&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;−$60&lt;/td&gt;
&lt;td&gt;−$720&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Net&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+$480&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  1. Win rate
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Win rate = Number of winning trades / Total closed trades
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; 8 / 20 = &lt;strong&gt;40%&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to read it:&lt;/strong&gt; On its own, almost nothing. A 40% win rate can be very profitable and a 90% win rate can lose money. Win rate only means something next to the size of your wins and losses (the next stat).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pitfalls:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Decide up front how you count break-even trades (exclude them, or count them as their own bucket) and stay consistent.&lt;/li&gt;
&lt;li&gt;Small samples lie. Twenty trades is enough to practise the maths, not to judge a strategy.&lt;/li&gt;
&lt;li&gt;Chasing a high win rate often leads to cutting winners early and letting losers run, which quietly wrecks the other numbers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Risk:reward (R:R)
&lt;/h2&gt;

&lt;p&gt;There are two versions, and it helps to track both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Planned R:R&lt;/strong&gt; (before the trade):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Planned R:R = |Target − Entry| / |Entry − Stop|
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Realised R:R&lt;/strong&gt; (from your results):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Realised R:R = Average win / |Average loss|
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; $150 / $60 = &lt;strong&gt;2.5&lt;/strong&gt;. The average winner is 2.5 times the size of the average loser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to read it:&lt;/strong&gt; Combine it with win rate to find your break-even point:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Break-even win rate = 1 / (1 + R:R)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With R:R = 2.5, break-even is 1 / 3.5 ≈ &lt;strong&gt;28.6%&lt;/strong&gt;. Our example wins 40% of the time, so it sits above break-even.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pitfalls:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Planned R:R is a wish; realised R:R is what happened. If planned is 3 and realised is 1.2, look at your exits.&lt;/li&gt;
&lt;li&gt;Moving your stop after entry changes your real risk. Log the original stop.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Expectancy
&lt;/h2&gt;

&lt;p&gt;Expectancy is the average amount you expect to make (or lose) per trade, based on your history.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;E = (Win rate × Avg win) − (Loss rate × |Avg loss|)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; (0.40 × $150) − (0.60 × $60) = $60 − $36 = &lt;strong&gt;+$24 per trade&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It's often more useful in &lt;strong&gt;R-multiples&lt;/strong&gt;, where 1R = the amount you risked. If each trade risked $60:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;E_R = (Win rate × Avg win in R) − (Loss rate × 1)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(0.40 × 2.5) − (0.60 × 1) = &lt;strong&gt;+0.4R per trade&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to read it:&lt;/strong&gt; Positive = your process has made money on average so far; negative = it hasn't. R-based expectancy lets you compare periods where your position size changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pitfalls:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fees, commissions and slippage must be in the P&amp;amp;L, or expectancy is overstated.&lt;/li&gt;
&lt;li&gt;One huge outlier win can make expectancy look great. Recalculate without your single best trade and see if it's still positive.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Profit factor
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Profit factor = Gross profit / |Gross loss|
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; $1,200 / $720 ≈ &lt;strong&gt;1.67&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to read it:&lt;/strong&gt; Above 1.0 means winners outweighed losers in total; below 1.0 means the opposite. At 1.67, every $1 lost was matched by about $1.67 won. It's a quick sanity check that you can read at a glance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pitfalls:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;With very few losing trades it can look enormous; that's a small-sample effect, not an edge.&lt;/li&gt;
&lt;li&gt;Like expectancy, it hides &lt;em&gt;when&lt;/em&gt; the losses happened. That's what drawdown is for.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Maximum drawdown
&lt;/h2&gt;

&lt;p&gt;Drawdown measures the worst drop from a peak in your account (or cumulative P&amp;amp;L) before a new peak was made.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Max drawdown = max over t of (Peak_t − Equity_t) / Peak_t
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; an account starts at $10,000, climbs to a peak of $11,200, then falls to $9,800 before recovering.&lt;/p&gt;

&lt;p&gt;($11,200 − $9,800) / $11,200 = $1,400 / $11,200 = &lt;strong&gt;12.5%&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to read it:&lt;/strong&gt; This is the number that tells you whether you could actually live with the strategy. Also note that recovering from a drawdown takes a bigger percentage gain than the loss:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Gain needed to recover = DD / (1 − DD)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A 12.5% drawdown needs about a 14.3% gain to get back to the peak. A 50% drawdown needs 100%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pitfalls:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Measure from the running peak, not from your starting balance.&lt;/li&gt;
&lt;li&gt;Deposits and withdrawals distort the equity curve. Track cumulative trade P&amp;amp;L separately.&lt;/li&gt;
&lt;li&gt;Your historical max drawdown is not the worst you can have. Expect it can be exceeded.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Spreadsheet formulas
&lt;/h2&gt;

&lt;p&gt;Assuming P&amp;amp;L in column &lt;code&gt;E&lt;/code&gt; (rows 2–21), and cumulative equity in column &lt;code&gt;F&lt;/code&gt; (starting balance + running P&amp;amp;L, so the peak is never zero):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Win rate        =COUNTIF(E2:E21,"&amp;gt;0")/COUNT(E2:E21)
Avg win         =AVERAGEIF(E2:E21,"&amp;gt;0")
Avg loss        =AVERAGEIF(E2:E21,"&amp;lt;0")
Realised R:R    =AvgWin/ABS(AvgLoss)
Expectancy      =AVERAGE(E2:E21)
Profit factor   =SUMIF(E2:E21,"&amp;gt;0")/ABS(SUMIF(E2:E21,"&amp;lt;0"))
Running peak    G2: =MAX($F$2:F2)      (fill down)
Drawdown        H2: =(G2-F2)/G2        (fill down)
Max drawdown    =MAX(H2:H21)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: &lt;code&gt;=AVERAGE(E2:E21)&lt;/code&gt; gives the same result as the expectancy formula above, since it's simply the average P&amp;amp;L per trade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting them together
&lt;/h2&gt;

&lt;p&gt;No single number is enough. A quick checklist after every 20–50 trades:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Is &lt;strong&gt;expectancy&lt;/strong&gt; positive after costs?&lt;/li&gt;
&lt;li&gt;Is &lt;strong&gt;win rate&lt;/strong&gt; comfortably above the &lt;strong&gt;break-even win rate&lt;/strong&gt; implied by your R:R?&lt;/li&gt;
&lt;li&gt;Is &lt;strong&gt;profit factor&lt;/strong&gt; above 1, and does it stay above 1 without your best trade?&lt;/li&gt;
&lt;li&gt;Is &lt;strong&gt;max drawdown&lt;/strong&gt; something you could sit through again without breaking your rules?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the answers change a lot between samples, you need more data before drawing conclusions.&lt;/p&gt;

&lt;p&gt;If you want a ready-made place to log trades and have these stats calculated for you, I put together the &lt;a href="https://ailstudio.gumroad.com/l/qsnmk?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=the-5-trading-stats-every-trader-should-track-with-formulas-and-worked-examples" rel="noopener noreferrer"&gt;Trader's Edge Journal&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Related tool:&lt;/strong&gt; the Trader's Edge Journal tracks your trades and performance in Google Sheets.&lt;br&gt;
&lt;a href="https://ailstudio.gumroad.com/l/qsnmk?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=crosslink" rel="noopener noreferrer"&gt;Trader's Edge Journal&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By Richard C · AIL Studio&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Not financial advice.&lt;/strong&gt; Everything above is educational. Past results, real or hypothetical, don't predict future results. Do your own research and consider speaking to a licensed professional before making financial decisions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://medium.com/@madebyailstudio/the-5-trading-stats-every-trader-should-track-with-formulas-and-worked-examples-74581af0e2c9" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Related from AIL Studio&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/7-chatgpt-prompts-that-turn-messy-spreadsheets-into-clean-reports-3g5k"&gt;7 ChatGPT prompts that turn messy spreadsheets into clean reports&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/trading-journal-in-google-sheets-vs-a-journaling-app-what-you-actually-need-284m"&gt;Trading journal in Google Sheets vs. a journaling app: what you actually need&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/how-to-find-every-subscription-youre-paying-for-in-15-minutes-a-simple-google-sheets-audit-29fo"&gt;How to find every subscription you're paying for in 15 minutes (a simple Google Sheets audit)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/how-to-track-prop-firm-challenge-rules-in-google-sheets-daily-loss-max-drawdown-consistency-4c4n"&gt;How to track prop firm challenge rules in Google Sheets (daily loss, max drawdown, consistency)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/prop-firm-rules-compared-oct-2026-2g4f"&gt;Prop firm rules compared (Oct 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/how-i-built-a-subscription-tracker-in-google-sheets-formulas-to-normalize-any-billing-cycle-5gc7"&gt;How I built a subscription tracker in Google Sheets (formulas to normalize any billing cycle)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>trading</category>
      <category>spreadsheets</category>
      <category>datascience</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How I built a subscription tracker in Google Sheets (formulas to normalize any billing cycle)</title>
      <dc:creator>Richard C</dc:creator>
      <pubDate>Mon, 26 Oct 2026 08:51:08 +0000</pubDate>
      <link>https://dev.to/richardc_ailstudio/how-i-built-a-subscription-tracker-in-google-sheets-formulas-to-normalize-any-billing-cycle-5gc7</link>
      <guid>https://dev.to/richardc_ailstudio/how-i-built-a-subscription-tracker-in-google-sheets-formulas-to-normalize-any-billing-cycle-5gc7</guid>
      <description>&lt;p&gt;Subscriptions are sneaky because they bill on different rhythms. A $139/year Prime membership, a $15.49/month Netflix plan and a $9/week meal kit can't be compared until you put them on the same scale. Here's how I built a tracker that does that automatically. It works the same way in Google Sheets and Excel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ailstudio.gumroad.com/l/ipnphp?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=how-i-built-a-subscription-tracker-in-google-sheets-formulas-to-normalize-any-billing-cycle" rel="noopener noreferrer"&gt;Free download: Subscription Audit Lite&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Not sure what your subscriptions really cost?&lt;/strong&gt; Start with Subscription Audit Lite, a free 30-row spreadsheet that totals every recurring charge and shows what cancelling would save: &lt;a href="https://ailstudio.gumroad.com/l/ipnphp?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=how-i-built-a-subscription-tracker-in-google-sheets-formulas-to-normalize-any-billing-cycle" rel="noopener noreferrer"&gt;get Audit Lite (free)&lt;/a&gt;. Then come back and build the full tracker below.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  1. The columns
&lt;/h2&gt;

&lt;p&gt;One row per subscription on a &lt;code&gt;Subscriptions&lt;/code&gt; sheet:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;A&lt;/th&gt;
&lt;th&gt;B&lt;/th&gt;
&lt;th&gt;C&lt;/th&gt;
&lt;th&gt;D&lt;/th&gt;
&lt;th&gt;E&lt;/th&gt;
&lt;th&gt;F&lt;/th&gt;
&lt;th&gt;G&lt;/th&gt;
&lt;th&gt;H&lt;/th&gt;
&lt;th&gt;I&lt;/th&gt;
&lt;th&gt;J&lt;/th&gt;
&lt;th&gt;K&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Service&lt;/td&gt;
&lt;td&gt;Category&lt;/td&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;Billing cycle&lt;/td&gt;
&lt;td&gt;Monthly cost&lt;/td&gt;
&lt;td&gt;Yearly cost&lt;/td&gt;
&lt;td&gt;Next renewal&lt;/td&gt;
&lt;td&gt;Days left&lt;/td&gt;
&lt;td&gt;Payment method&lt;/td&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;Notes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You type into C, D, G and J. Columns E, F and H are formulas.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. A lookup table instead of nested IFs
&lt;/h2&gt;

&lt;p&gt;The tempting approach is &lt;code&gt;IF(D2="Weekly",C2*52/12,IF(D2="Monthly",C2,...))&lt;/code&gt;. It breaks the moment you add a cycle. Instead, make a small &lt;code&gt;Lists&lt;/code&gt; sheet:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cycle (A)&lt;/th&gt;
&lt;th&gt;Payments per year (B)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Weekly&lt;/td&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monthly&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quarterly&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Every 6 months&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Yearly&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Now &lt;strong&gt;every&lt;/strong&gt; cycle is normalized the same way: &lt;em&gt;cost × payments per year ÷ 12&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Monthly cost (E2)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(C2="","",IF(J2="Cancelled",0,C2*IFERROR(INDEX(Lists!$B$2:$B$6,MATCH(D2,Lists!$A$2:$A$6,0)),0)/12))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reading it inside-out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;MATCH(D2, Lists!$A$2:$A$6, 0)&lt;/code&gt; finds the row of the billing cycle (exact match).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;INDEX(Lists!$B$2:$B$6, …)&lt;/code&gt; returns payments per year.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;IFERROR(…, 0)&lt;/code&gt; keeps a typo or a blank cycle from spraying &lt;code&gt;#N/A&lt;/code&gt; across your totals.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;IF(J2="Cancelled", 0, …)&lt;/code&gt; lets you keep cancelled rows for history without counting them.&lt;/li&gt;
&lt;li&gt;The outer &lt;code&gt;IF(C2="","",…)&lt;/code&gt; keeps empty rows blank.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Yearly cost (F2)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(E2="","",E2*12)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once everything is monthly, yearly is trivial. This column is the one that hurts: seeing $14/month as $168/year changes decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Days until renewal (H2)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(G2="","",G2-TODAY())
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dates are just numbers, so subtraction gives days. &lt;code&gt;TODAY()&lt;/code&gt; recalculates on open, so the countdown is always current.&lt;/p&gt;

&lt;p&gt;Add conditional formatting to make it pop: a rule on &lt;code&gt;H2:H101&lt;/code&gt; with a custom formula like &lt;code&gt;=AND($H2&amp;gt;=0,$H2&amp;lt;=7)&lt;/code&gt; and a red fill. I also grey out cancelled rows with &lt;code&gt;=$J2="Cancelled"&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Data validation
&lt;/h2&gt;

&lt;p&gt;Use dropdowns sourced from the &lt;code&gt;Lists&lt;/code&gt; sheet (cycles in &lt;code&gt;Lists!A2:A6&lt;/code&gt;, categories in &lt;code&gt;D2:D11&lt;/code&gt;, statuses in &lt;code&gt;E2:E5&lt;/code&gt;). This matters more than it looks, because the &lt;code&gt;MATCH&lt;/code&gt; in step 3 needs exact text.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. The dashboard
&lt;/h2&gt;

&lt;p&gt;A separate &lt;code&gt;Dashboard&lt;/code&gt; sheet just aggregates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Monthly total:            =SUM(Subscriptions!E2:E101)
Yearly total:             =SUM(Subscriptions!F2:F101)
Active subscriptions:     =COUNTIF(Subscriptions!J2:J101,"Active")+COUNTIF(Subscriptions!J2:J101,"Trial")+COUNTIF(Subscriptions!J2:J101,"Review")
Renewing in next 7 days:  =COUNTIFS(Subscriptions!H2:H101,"&amp;gt;=0",Subscriptions!H2:H101,"&amp;lt;=7")
Renewing in next 30 days: =COUNTIFS(Subscriptions!H2:H101,"&amp;gt;=0",Subscriptions!H2:H101,"&amp;lt;=30")
Marked for review ($/mo): =SUMIF(Subscriptions!J2:J101,"Review",Subscriptions!E2:E101)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And a per-category breakdown, with category names in column E:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=SUMIF(Subscriptions!B2:B101,E2,Subscriptions!E2:E101)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feed that range into a pie chart and you can see where the money goes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftdagrbgz8o057r46sg6x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftdagrbgz8o057r46sg6x.png" alt="Dashboard showing monthly and yearly totals, renewal counts, and spend by category" width="799" height="282"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;"&amp;gt;=0"&lt;/code&gt; condition in &lt;code&gt;COUNTIFS&lt;/code&gt; excludes past dates, so stale renewals don't count as "upcoming". Update the date after each renewal.&lt;/li&gt;
&lt;li&gt;A "Review" status is a gentle middle ground between Active and Cancelled. The dashboard tells you how much per month is riding on those decisions.&lt;/li&gt;
&lt;li&gt;Excel and Sheets both handle every formula here with no scripts or add-ons.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wrap-up
&lt;/h2&gt;

&lt;p&gt;That's the whole thing: one lookup table, three formula columns and a summary sheet. Build it yourself in about 20 minutes with the formulas above.&lt;/p&gt;

&lt;p&gt;If you'd rather not copy the formulas by hand, I made a finished template built on the formulas in this post, with the billing-cycle normalizer, days-left column, yellow/red renewal warnings and a dashboard, for Excel and Google Sheets. It's $1+ (pay what you want): &lt;a href="https://ailstudio.gumroad.com/l/qkwkix?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=how-i-built-a-subscription-tracker-in-google-sheets-formulas-to-normalize-any-billing-cycle" rel="noopener noreferrer"&gt;get the Subscription Tracker&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ailstudio.gumroad.com/l/ipnphp?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=how-i-built-a-subscription-tracker-in-google-sheets-formulas-to-normalize-any-billing-cycle" rel="noopener noreferrer"&gt;Free download: Subscription Audit Lite&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Related tool:&lt;/strong&gt; the finished Subscription Tracker uses these formulas, with a dashboard and renewal warnings built in.&lt;br&gt;
&lt;a href="https://ailstudio.gumroad.com/l/qkwkix?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=crosslink" rel="noopener noreferrer"&gt;Subscription Tracker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By Richard C · AIL Studio&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Related from AIL Studio&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/7-chatgpt-prompts-that-turn-messy-spreadsheets-into-clean-reports-3g5k"&gt;7 ChatGPT prompts that turn messy spreadsheets into clean reports&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/trading-journal-in-google-sheets-vs-a-journaling-app-what-you-actually-need-284m"&gt;Trading journal in Google Sheets vs. a journaling app: what you actually need&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/how-to-find-every-subscription-youre-paying-for-in-15-minutes-a-simple-google-sheets-audit-29fo"&gt;How to find every subscription you're paying for in 15 minutes (a simple Google Sheets audit)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/how-to-track-prop-firm-challenge-rules-in-google-sheets-daily-loss-max-drawdown-consistency-4c4n"&gt;How to track prop firm challenge rules in Google Sheets (daily loss, max drawdown, consistency)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/prop-firm-rules-compared-oct-2026-2g4f"&gt;Prop firm rules compared (Oct 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/richardc_ailstudio/the-5-trading-stats-every-trader-should-track-with-formulas-and-worked-examples-4lgh"&gt;The 5 Trading Stats Every Trader Should Track (With Formulas and Worked Examples)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>googlesheets</category>
      <category>productivity</category>
      <category>spreadsheets</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
