<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Ashish's Excel Notes]]></title><description><![CDATA[Ashish's Excel Notes]]></description><link>https://ashishexcelnotes.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Thu, 22 Oct 2026 01:02:06 GMT</lastBuildDate><atom:link href="https://ashishexcelnotes.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[How to Add an Order Status Dropdown That Colours Itself]]></title><description><![CDATA[Subtitle: Data validation, conditional formatting, counts per status, a "stuck" flag, and a check that catches statuses typed by hand Written with AI…]]></description><link>https://ashishexcelnotes.hashnode.dev/order-status-dropdown-conditional-formatting</link><guid isPermaLink="true">https://ashishexcelnotes.hashnode.dev/order-status-dropdown-conditional-formatting</guid><category><![CDATA[excel]]></category><category><![CDATA[spreadsheets]]></category><category><![CDATA[google sheets]]></category><category><![CDATA[Small business]]></category><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Ashish Srivastava]]></dc:creator><pubDate>Wed, 21 Oct 2026 15:47:01 GMT</pubDate><content:encoded><![CDATA[<p><strong>Subtitle:</strong> Data validation, conditional formatting, counts per status, a "stuck" flag, and a check that catches statuses typed by hand</p>
<p><em>Written with AI assistance. I edited it. The formulas below were checked in LibreOffice Calc on sample rows (not in Excel or Google Sheets).</em></p>
<p>A status column is the simplest way to know where every order is. It's also where small sheets go wrong: "Shipped", "shipped", "Shipped " with a trailing space and "Sent" all mean the same thing to you, and four different things to a formula.</p>
<p>Here's how to lock the column to a short list, colour each row by its status, count what's in each stage, and flag orders that have sat still too long. It uses data validation, conditional formatting, COUNTIF and SUMIFS, which work the same way in Excel and Google Sheets.</p>
<h2>1. The status list</h2>
<p>Make a tab called <strong>Lists</strong> and type your stages in A2:A6:</p>
<p>New, Packed, Shipped, Delivered, Cancelled</p>
<p>Keep it short. Five stages you actually use beat twelve you don't.</p>
<h2>2. The dropdown</h2>
<p>Orders from row 5: <strong>A Order ID</strong>, <strong>B Customer</strong>, <strong>C Amount</strong>, <strong>D Status</strong>, <strong>E Status date</strong> (the day the status last changed). Put an <strong>As of</strong> date in B2 (<code>=TODAY()</code> works).</p>
<p>Select D5:D104, then:</p>
<ul>
<li><strong>Excel:</strong> Data → Data Validation → Allow: List → Source: <code>=Lists!$A$2:$A$6</code>. On the Error Alert tab, keep <strong>Stop</strong>.</li>
<li><strong>Google Sheets:</strong> Data → Data validation → Add rule → Dropdown (from a range) → <code>Lists!A2:A6</code> → "Reject the input".</li>
</ul>
<p>New entries now have to come from the list. But a dropdown doesn't clean rows that were already there, and pasted values can slip past it, so section 5 adds a check.</p>
<h2>3. Colour each row by status</h2>
<p>Select A5:G104 and add one conditional formatting rule per status, each with a custom formula:</p>
<table>
<thead>
<tr>
<th>Rule formula</th>
<th>Suggested fill</th>
</tr>
</thead>
<tbody><tr>
<td><code>=$D5="Delivered"</code></td>
<td>light green</td>
</tr>
<tr>
<td><code>=$D5="Shipped"</code></td>
<td>light blue</td>
</tr>
<tr>
<td><code>=$D5="Cancelled"</code></td>
<td>grey</td>
</tr>
<tr>
<td><code>=AND($D5="Packed",$F5&gt;2)</code></td>
<td>light red (stuck, see below)</td>
</tr>
</tbody></table>
<p>The <code>$</code> before D and F keeps every cell in the row looking at the status column. Without it, only the status cell changes colour.</p>
<h2>4. Days in status and a "stuck" flag</h2>
<p>F5, days since the status last changed:</p>
<pre><code>=IF(E5="","",$B$2-E5)
</code></pre>
<p>G5, a flag column:</p>
<pre><code>=IF(D5="","No status",IF(COUNTIF(Lists!$A$2:$A$6,D5)=0,"Not on list",IF(AND(D5="Packed",F5&gt;2),"Stuck",IF(AND(D5="Shipped",F5&gt;7),"Stuck",""))))
</code></pre>
<p>Set your own limits: here an order packed for more than 2 days, or shipped for more than 7 without being marked delivered, gets flagged. Remember to update the status date whenever you change the status.</p>
<h2>5. Counts per status, and the check</h2>
<p>Put the five stages in J5:J9, then:</p>
<table>
<thead>
<tr>
<th>Cell</th>
<th>Formula</th>
</tr>
</thead>
<tbody><tr>
<td>K5: Orders</td>
<td><code>=COUNTIF($D$5:$D$104,J5)</code></td>
</tr>
<tr>
<td>L5: Amount</td>
<td><code>=SUMIFS($C$5:$C$104,$D$5:$D$104,J5)</code></td>
</tr>
<tr>
<td>K11: Status not on the list</td>
<td><code>=SUMPRODUCT(($D$5:$D$104&lt;&gt;"")*(COUNTIF(Lists!$A$2:$A$6,$D$5:$D$104)=0))</code></td>
</tr>
<tr>
<td>K12: Orders with no status</td>
<td><code>=COUNTIFS($A$5:$A$104,"&lt;&gt;",$D$5:$D$104,"")</code></td>
</tr>
<tr>
<td>K13: Accounted for</td>
<td><code>=SUM(K5:K9)+K11+K12</code></td>
</tr>
<tr>
<td>K14: All orders</td>
<td><code>=COUNTA($A$5:$A$104)</code></td>
</tr>
<tr>
<td>K15: Check</td>
<td><code>=IF(K13=K14,"OK","CHECK")</code></td>
</tr>
</tbody></table>
<p>Fill K5 and L5 down to row 9. K11 and K12 are the useful ones: they show orders that the per-status counts silently skip. The check in K15 confirms every order is either in a stage or listed as a problem.</p>
<h2>6. What the sample showed</h2>
<p>Seven made-up orders, as of 21 Oct 2026:</p>
<table>
<thead>
<tr>
<th>Order</th>
<th>Status</th>
<th>Days in status</th>
<th>Flag</th>
</tr>
</thead>
<tbody><tr>
<td>O-101</td>
<td>Delivered</td>
<td>11</td>
<td></td>
</tr>
<tr>
<td>O-102</td>
<td>Shipped</td>
<td>4</td>
<td></td>
</tr>
<tr>
<td>O-103</td>
<td>Packed</td>
<td>5</td>
<td>Stuck</td>
</tr>
<tr>
<td>O-104</td>
<td>New</td>
<td>1</td>
<td></td>
</tr>
<tr>
<td>O-105</td>
<td>Cancelled</td>
<td>9</td>
<td></td>
</tr>
<tr>
<td>O-106</td>
<td>"shipped " (typed, trailing space)</td>
<td>2</td>
<td>Not on list</td>
</tr>
<tr>
<td>O-107</td>
<td>(blank)</td>
<td>(blank)</td>
<td>No status</td>
</tr>
</tbody></table>
<p>Counts: one order in each of the five stages (New 650, Packed 500, Shipped 800, Delivered 1,200, Cancelled 300), plus 1 not on the list and 1 with no status. 7 accounted for out of 7 orders, so the check said OK.</p>
<p>The typed "shipped " is the reason for K11. COUNTIF ignores capital letters, but not the trailing space, so that order would have been missing from the Shipped count without the check. Retype it from the dropdown and it moves into Shipped.</p>
<h2>7. Test it before you trust it</h2>
<p>Add rows you know the answer to, then confirm:</p>
<ul>
<li>a status pasted in with a trailing space (should say "Not on list")</li>
<li>an order with no status (should say "No status" and count in K12)</li>
<li>a Packed order with a status date 3+ days old (should say "Stuck" and turn red)</li>
</ul>
<p>Then delete them.</p>
<hr />
<p><strong>Prefer a ready-made file?</strong> There's a free Order &amp; Payment Tracker (.xlsx workbook, no macros). You log each order once, and it works out what's still owed and whether it's overdue, by customer and in a one-page summary: <a href="https://ashishsrivastavajay.gumroad.com/l/free-order-payment-tracker">https://ashishsrivastavajay.gumroad.com/l/free-order-payment-tracker</a></p>
<p><strong>About me, and a disclosure:</strong> I'm Ashish, a Kolkata-based Excel and Google Sheets builder with 18+ years of work experience, and I write these tutorials and build my workbooks with AI assistance under my direction. The free tracker is mine.</p>
]]></content:encoded></item><item><title><![CDATA[How to Set Up Payment Due Date Reminders in a Spreadsheet]]></title><description><![CDATA[Subtitle: Due dates that skip weekends and holidays, working days left, and a "Remind now" flag with WORKDAY and NETWORKDAYS Written with AI assistance. I…]]></description><link>https://ashishexcelnotes.hashnode.dev/payment-due-date-reminders-workday-networkdays</link><guid isPermaLink="true">https://ashishexcelnotes.hashnode.dev/payment-due-date-reminders-workday-networkdays</guid><category><![CDATA[excel]]></category><category><![CDATA[spreadsheets]]></category><category><![CDATA[google sheets]]></category><category><![CDATA[Small business]]></category><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Ashish Srivastava]]></dc:creator><pubDate>Wed, 21 Oct 2026 15:45:54 GMT</pubDate><content:encoded><![CDATA[<p><strong>Subtitle:</strong> Due dates that skip weekends and holidays, working days left, and a "Remind now" flag with WORKDAY and NETWORKDAYS</p>
<p><em>Written with AI assistance. I edited it. The formulas below were checked in LibreOffice Calc on sample rows (not in Excel or Google Sheets).</em></p>
<p>Chasing an invoice after it's late is awkward. A polite nudge two or three days <em>before</em> the due date is easy, and it often means you never have to chase at all. The problem is remembering which invoices are close.</p>
<p>Here's a small sheet that does the remembering. It works out each due date from the payment terms, moves it off weekends and holidays, counts the working days left, and flags the ones to remind today. WORKDAY and NETWORKDAYS exist in every current version of Excel and in Google Sheets.</p>
<h2>1. The invoice list</h2>
<p>Invoices from row 5: <strong>A Invoice date</strong>, <strong>B Customer</strong>, <strong>C Amount</strong>, <strong>D Terms</strong> (days, e.g. 30), <strong>E Paid</strong> (type Y when the money arrives). Put an <strong>As of</strong> date in B2. <code>=TODAY()</code> works; I used a fixed date so the results below don't change.</p>
<p>List your holidays in <strong>L5:L10</strong> (one date per cell). Leave spare blank cells: the formulas ignore them.</p>
<h2>2. The due date</h2>
<p>F5, the plain due date:</p>
<pre><code>=IF(OR(A5="",D5=""),"",A5+D5)
</code></pre>
<p>G5, moved to the next working day if it lands on a weekend or holiday:</p>
<pre><code>=IF(F5="","",WORKDAY(F5-1,1,$L$5:$L$10))
</code></pre>
<p>The <code>F5-1</code> then <code>+1 working day</code> trick is the useful bit: a weekday due date stays the same, but a Saturday becomes Monday, and a holiday becomes the next working day. Format F and G as dates.</p>
<h2>3. Days left, in calendar and working days</h2>
<p>H5, calendar days left (blank once paid):</p>
<pre><code>=IF(OR(G5="",E5="Y"),"",G5-$B$2)
</code></pre>
<p>I5, working days left (negative when overdue):</p>
<pre><code>=IF(H5="","",IF(H5&gt;=0,NETWORKDAYS($B$2,G5,$L$5:$L$10)-1,-(NETWORKDAYS(G5,$B$2,$L$5:$L$10)-1)))
</code></pre>
<p>NETWORKDAYS counts both end dates, so the <code>-1</code> makes "due today" read 0. The two branches keep the sign right on each side of the due date. Format H and I as <strong>Number</strong>, not Date, or a 5 shows up as a date in 1900.</p>
<h2>4. The reminder column</h2>
<p>J5:</p>
<pre><code>=IF(E5="Y","Paid",IF(G5="","No terms",IF(H5&lt;0,"Overdue",IF(I5&lt;=3,"Remind now","OK"))))
</code></pre>
<p>Change the 3 to suit your customers. Then add a conditional formatting rule on the row (Format → Conditional formatting, custom formula <code>=$J5="Remind now"</code>) to colour it, so the list reads at a glance.</p>
<h2>5. A summary for Monday morning</h2>
<table>
<thead>
<tr>
<th>Cell</th>
<th>Formula</th>
</tr>
</thead>
<tbody><tr>
<td>N5: Remind now</td>
<td><code>=COUNTIF(J5:J104,"Remind now")</code></td>
</tr>
<tr>
<td>N6: Overdue</td>
<td><code>=COUNTIF(J5:J104,"Overdue")</code></td>
</tr>
<tr>
<td>N7: Amount overdue</td>
<td><code>=SUMIFS(C5:C104,J5:J104,"Overdue")</code></td>
</tr>
<tr>
<td>N8: Amount to remind about</td>
<td><code>=SUMIFS(C5:C104,J5:J104,"Remind now")</code></td>
</tr>
<tr>
<td>N9: Invoices with no terms</td>
<td><code>=COUNTIF(J5:J104,"No terms")</code></td>
</tr>
</tbody></table>
<p>N9 is the check. An invoice with no terms has no due date, so it would never be flagged. If N9 isn't 0, fill in the terms.</p>
<h2>6. What the sample showed</h2>
<p>Seven made-up invoices, as of Wednesday 21 Oct 2026, with Friday 23 Oct listed as a holiday:</p>
<table>
<thead>
<tr>
<th>Customer</th>
<th>Due</th>
<th>Due (working day)</th>
<th>Days left</th>
<th>Working days left</th>
<th>Reminder</th>
</tr>
</thead>
<tbody><tr>
<td>Asha Traders</td>
<td>1 Oct</td>
<td>1 Oct</td>
<td>(blank)</td>
<td>(blank)</td>
<td>Paid</td>
</tr>
<tr>
<td>Bose &amp; Co</td>
<td>Sat 10 Oct</td>
<td>Mon 12 Oct</td>
<td>-9</td>
<td>-7</td>
<td>Overdue</td>
</tr>
<tr>
<td>Dutta Mart</td>
<td>Sat 24 Oct</td>
<td>Mon 26 Oct</td>
<td>5</td>
<td>2</td>
<td>Remind now</td>
</tr>
<tr>
<td>Hari Mills</td>
<td>22 Oct</td>
<td>22 Oct</td>
<td>1</td>
<td>1</td>
<td>Remind now</td>
</tr>
<tr>
<td>Ezra Textiles</td>
<td>21 Oct</td>
<td>21 Oct</td>
<td>0</td>
<td>0</td>
<td>Remind now</td>
</tr>
<tr>
<td>Chandra Stores</td>
<td>9 Nov</td>
<td>9 Nov</td>
<td>19</td>
<td>12</td>
<td>OK</td>
</tr>
<tr>
<td>Faiz Stores</td>
<td>(blank)</td>
<td>(blank)</td>
<td>(blank)</td>
<td>(blank)</td>
<td>No terms</td>
</tr>
</tbody></table>
<p>Summary: 3 to remind (500 + 650 + 300 = 1,450), 1 overdue (800), 1 with no terms.</p>
<p>Dutta Mart is the interesting row: five calendar days left looks comfortable, but with a weekend and a holiday in between, it's only two working days.</p>
<h2>7. Test it before you trust it</h2>
<p>Add rows you know the answer to, then confirm:</p>
<ul>
<li>a due date on a Saturday (should move to Monday)</li>
<li>a due date on one of your holidays (should move to the next working day)</li>
<li>an invoice due today (should show 0 and "Remind now")</li>
<li>an invoice with blank terms (should show "No terms" and count in N9)</li>
</ul>
<p>Then delete them.</p>
<hr />
<p><strong>Prefer a ready-made file?</strong> There's a free Order &amp; Payment Tracker (.xlsx workbook, no macros). You log each order once, and it works out what's still owed and whether it's overdue, by customer and in a one-page summary: <a href="https://ashishsrivastavajay.gumroad.com/l/free-order-payment-tracker">https://ashishsrivastavajay.gumroad.com/l/free-order-payment-tracker</a></p>
<p><strong>About me, and a disclosure:</strong> I'm Ashish, a Kolkata-based Excel and Google Sheets builder with 18+ years of work experience, and I write these tutorials and build my workbooks with AI assistance under my direction. The free tracker is mine.</p>
]]></content:encoded></item><item><title><![CDATA[Freelancer invoice tracker in Excel: track clients, projects and who still owes you]]></title><description><![CDATA[Most freelancers start with invoices scattered across email, a notes app and a bank statement. That works until you have five clients and can't say who has…]]></description><link>https://ashishexcelnotes.hashnode.dev/freelancer-invoice-tracker-in-excel-track-clients-projects-and-who-still-owes-you</link><guid isPermaLink="true">https://ashishexcelnotes.hashnode.dev/freelancer-invoice-tracker-in-excel-track-clients-projects-and-who-still-owes-you</guid><category><![CDATA[excel]]></category><category><![CDATA[Freelancing]]></category><category><![CDATA[invoicing]]></category><category><![CDATA[spreadsheets]]></category><dc:creator><![CDATA[Ashish Srivastava]]></dc:creator><pubDate>Wed, 21 Oct 2026 08:40:42 GMT</pubDate><content:encoded><![CDATA[<p>Most freelancers start with invoices scattered across email, a notes app and a bank statement. That works until you have five clients and can't say who has paid. A simple freelancer invoice tracker in Excel fixes that: one list of clients, one list of projects, one log of invoices, and a summary that shows what's outstanding. This guide builds one step by step.</p>
<p><strong>Note:</strong> this covers spreadsheet layout and formulas only. How you charge tax, what an invoice must show and how you report income depend on where you live. It is not tax or legal advice.</p>
<h2>Step 1: A Clients sheet</h2>
<p>Make a sheet called <strong>Clients</strong> with these columns:</p>
<table>
<thead>
<tr>
<th>Col</th>
<th>Field</th>
</tr>
</thead>
<tbody><tr>
<td>A</td>
<td>Client name</td>
</tr>
<tr>
<td>B</td>
<td>Contact person</td>
</tr>
<tr>
<td>C</td>
<td>Email</td>
</tr>
<tr>
<td>D</td>
<td>Payment terms (days), e.g. <code>15</code> or <code>30</code></td>
</tr>
<tr>
<td>E</td>
<td>Currency</td>
</tr>
<tr>
<td>F</td>
<td>Notes</td>
</tr>
</tbody></table>
<p>Select the range and press <strong>Ctrl+T</strong> to make it an Excel Table, then name it <code>tblClients</code> under <strong>Table Design &gt; Table Name</strong>. Tables grow on their own, so new clients appear in dropdowns without editing ranges.</p>
<p>Keep one row per client. If the same client appears as "Acme" and "Acme Pvt Ltd", your totals will split, so pick one spelling and stick to it.</p>
<h2>Step 2: A Projects sheet</h2>
<p>On a <strong>Projects</strong> sheet:</p>
<table>
<thead>
<tr>
<th>Col</th>
<th>Field</th>
</tr>
</thead>
<tbody><tr>
<td>A</td>
<td>Project ID, e.g. <code>P-001</code></td>
</tr>
<tr>
<td>B</td>
<td>Client (dropdown)</td>
</tr>
<tr>
<td>C</td>
<td>Project name</td>
</tr>
<tr>
<td>D</td>
<td>Billing type: <code>Fixed</code> or <code>Hourly</code></td>
</tr>
<tr>
<td>E</td>
<td>Rate or fixed fee</td>
</tr>
<tr>
<td>F</td>
<td>Start date</td>
</tr>
<tr>
<td>G</td>
<td>Status: <code>Active</code>, <code>Paused</code>, <code>Done</code></td>
</tr>
</tbody></table>
<p>For the Client dropdown, select column B and use <strong>Data &gt; Data Validation &gt; List</strong> with the source <code>=INDIRECT("tblClients[Client name]")</code>. Do the same for Status with a typed list: <code>Active,Paused,Done</code>.</p>
<p>Make this a Table too (<code>tblProjects</code>).</p>
<h2>Step 3: An optional Time Log</h2>
<p>If you bill by the hour, add a <strong>TimeLog</strong> sheet: A = date, B = project ID, C = hours, D = description. Then on the Projects sheet add column H, <strong>Hours logged</strong>:</p>
<pre><code>=SUMIFS(tblTime[Hours],tblTime[Project ID],[@[Project ID]])
</code></pre>
<p>And column I, <strong>Billable so far</strong>:</p>
<pre><code>=IF([@[Billing type]]="Hourly",[@Hours logged]*[@Rate],[@Rate])
</code></pre>
<p>Now each hourly project shows what you could invoice today.</p>
<h2>Step 4: The Invoices log</h2>
<p>This is the core of the tracker. Make an <strong>Invoices</strong> sheet:</p>
<table>
<thead>
<tr>
<th>Col</th>
<th>Field</th>
</tr>
</thead>
<tbody><tr>
<td>A</td>
<td>Invoice no.</td>
</tr>
<tr>
<td>B</td>
<td>Invoice date</td>
</tr>
<tr>
<td>C</td>
<td>Client (dropdown)</td>
</tr>
<tr>
<td>D</td>
<td>Project ID</td>
</tr>
<tr>
<td>E</td>
<td>Amount</td>
</tr>
<tr>
<td>F</td>
<td>Due date</td>
</tr>
<tr>
<td>G</td>
<td>Amount paid</td>
</tr>
<tr>
<td>H</td>
<td>Paid date</td>
</tr>
<tr>
<td>I</td>
<td>Balance</td>
</tr>
<tr>
<td>J</td>
<td>Status</td>
</tr>
<tr>
<td>K</td>
<td>Days overdue</td>
</tr>
</tbody></table>
<p>Fill the due date from the client's payment terms:</p>
<pre><code>F2: =IF(B2="","",B2+IFERROR(INDEX(tblClients[Payment terms (days)],MATCH(C2,tblClients[Client name],0)),30))
</code></pre>
<p>If the client isn't found, it falls back to 30 days.</p>
<p>Balance:</p>
<pre><code>I2: =IF(E2="","",E2-N(G2))
</code></pre>
<p>Status:</p>
<pre><code>J2: =IF(E2="","",IF(I2&lt;=0,"Paid",IF(TODAY()&gt;F2,"Overdue",IF(N(G2)&gt;0,"Part-paid","Open"))))
</code></pre>
<p>Days overdue:</p>
<pre><code>K2: =IF(J2="Overdue",TODAY()-F2,"")
</code></pre>
<p>Turn it into a Table (<code>tblInvoices</code>) so these formulas fill down automatically for every new row.</p>
<h2>Step 5: Highlight what needs chasing</h2>
<p>Select the Status column and add <strong>Home &gt; Conditional Formatting &gt; Highlight Cells Rules &gt; Text that Contains</strong>:</p>
<ul>
<li><code>Overdue</code> â†’ light red fill</li>
<li><code>Part-paid</code> â†’ light yellow fill</li>
<li><code>Paid</code> â†’ light green fill</li>
</ul>
<p>For a stronger signal, select the whole table and add a formula rule <code>=$K2&gt;30</code> with bold red text. Anything more than a month late jumps out.</p>
<h2>Step 6: A one-glance Summary sheet</h2>
<p>Make a <strong>Summary</strong> sheet with a client list in column A (you can type it, or in Excel 365/2021 use <code>=SORT(UNIQUE(tblInvoices[Client]))</code>). Then:</p>
<pre><code>B2 (Invoiced):     =SUMIFS(tblInvoices[Amount],tblInvoices[Client],A2)
C2 (Received):     =SUMIFS(tblInvoices[Amount paid],tblInvoices[Client],A2)
D2 (Outstanding):  =B2-C2
E2 (Overdue):      =SUMIFS(tblInvoices[Balance],tblInvoices[Client],A2,tblInvoices[Status],"Overdue")
</code></pre>
<p>Above the table, add three headline numbers:</p>
<pre><code>Total outstanding:  =SUM(tblInvoices[Balance])
Overdue invoices:   =COUNTIF(tblInvoices[Status],"Overdue")
Paid this month:    =SUMIFS(tblInvoices[Amount paid],tblInvoices[Paid date],"&gt;="&amp;EOMONTH(TODAY(),-1)+1,tblInvoices[Paid date],"&lt;="&amp;EOMONTH(TODAY(),0))
</code></pre>
<p><code>UNIQUE</code> and <code>SORT</code> need Excel 365 or Excel 2021. The other formulas work in older desktop versions too.</p>
<h2>Step 7: A weekly 10-minute routine</h2>
<p>The tracker only helps if it stays current. A simple habit:</p>
<ol>
<li><strong>Every time you send an invoice</strong>, add a row to Invoices straight away.</li>
<li><strong>Every time money lands</strong>, fill in Amount paid and Paid date.</li>
<li><strong>Once a week</strong>, filter Status to <code>Overdue</code> and send a polite reminder to each client on the list.</li>
<li><strong>Once a month</strong>, check the Summary sheet for clients who are slow to pay, and consider shorter terms or an advance for their next project.</li>
</ol>
<h2>Common mistakes</h2>
<ul>
<li><strong>Typing client names by hand.</strong> Use the dropdown so the SUMIFS totals match.</li>
<li><strong>Overwriting formulas.</strong> Lock the Balance, Status and Days overdue columns with <strong>Review &gt; Protect Sheet</strong>, leaving the input columns unlocked.</li>
<li><strong>Mixing currencies in one total.</strong> If you bill in more than one currency, add a converted-amount column or keep a separate summary per currency.</li>
<li><strong>Deleting paid invoices.</strong> Keep them. Your paid history is what tells you which clients are reliable.</li>
</ul>
<h2>Wrapping up</h2>
<p>With four sheets (Clients, Projects, Invoices and Summary) you get a freelancer invoice tracker that shows who owes you, how late they are, and what came in this month, without any paid software. Start with the Invoices log alone if that's all you need, and add the rest as your client list grows.</p>
<p><em>This article was drafted with AI tools. It's general spreadsheet guidance for Excel, not tax or legal advice.</em> If you'd rather start from a ready-made Excel (.xlsx) version with client, project and invoice sheets already set up, there's one here: <a href="https://ashishsrivastavajay.gumroad.com/l/vcqscv/LAUNCH30">Freelancer Client &amp; Invoice Tracker</a>. Code <strong>LAUNCH30</strong> gives 30% off until 27 Oct. The template was also made with AI tools.</p>
]]></content:encoded></item><item><title><![CDATA[Salary slip format in Excel (India): a printable layout you fill from one register]]></title><description><![CDATA[If you run a small shop, office or studio in India, staff will sooner or later ask for a salary slip, for a bank loan, a rental agreement or a visa file…]]></description><link>https://ashishexcelnotes.hashnode.dev/salary-slip-format-in-excel-india-a-printable-layout-you-fill-from-one-register</link><guid isPermaLink="true">https://ashishexcelnotes.hashnode.dev/salary-slip-format-in-excel-india-a-printable-layout-you-fill-from-one-register</guid><category><![CDATA[excel]]></category><category><![CDATA[Payroll]]></category><category><![CDATA[Small business]]></category><category><![CDATA[india]]></category><dc:creator><![CDATA[Ashish Srivastava]]></dc:creator><pubDate>Wed, 21 Oct 2026 03:39:17 GMT</pubDate><content:encoded><![CDATA[<p>If you run a small shop, office or studio in India, staff will sooner or later ask for a salary slip, for a bank loan, a rental agreement or a visa file. You don't need payroll software for that. A clear salary slip format in Excel, filled automatically from a simple monthly register, does the job. This guide focuses on the slip itself: what to put on it, how to lay it out and how to fill it with formulas.</p>
<p><strong>Note:</strong> which deductions apply (PF, ESI, professional tax, TDS and so on) depends on your state, headcount and current rules. This article covers spreadsheet layout only. It is not tax, payroll or legal advice; check the rules with an accountant or the official sources.</p>
<h2>What a typical salary slip shows</h2>
<p>Most slips have the same five blocks:</p>
<ol>
<li><strong>Header:</strong> business name, address, "Salary slip for October 2026"</li>
<li><strong>Employee details:</strong> name, employee ID, designation, department, date of joining, bank account (last 4 digits only), PAN or UAN if you record them</li>
<li><strong>Attendance:</strong> working days in the month, days paid, leave taken</li>
<li><strong>Earnings and deductions:</strong> two columns side by side</li>
<li><strong>Net pay:</strong> in figures and in words, plus a line such as "This is a computer-generated slip"</li>
</ol>
<h2>Step 1: The data the slip reads from</h2>
<p>Keep two sheets:</p>
<ul>
<li><strong>Employees:</strong> A = Emp ID, B = Name, C = Designation, D = Department, E = Date of joining, F = Bank (last 4)</li>
<li><strong>Register:</strong> one row per employee per month. A = Month (first day, e.g. 01-10-2026), B = Emp ID, C = Working days, D = Days paid, E = Basic, F = HRA, G = Other allowances, H = Overtime/bonus, I = Gross, Jâ€“L = deductions, M = Total deductions, N = Net pay</li>
</ul>
<p>The slip never holds numbers of its own. It only looks them up, so a mistake fixed in the register fixes the slip.</p>
<h2>Step 2: Lay out the slip</h2>
<p>On a <strong>Slip</strong> sheet, use columns B to E on an A4 portrait page:</p>
<ul>
<li><strong>B2:E2</strong> merged: <code>=Settings!B2</code> (business name), bold, centred</li>
<li><strong>B3:E3</strong> merged: address</li>
<li><strong>B4:E4</strong> merged: <code>="Salary slip for "&amp;TEXT($C$6,"mmmm yyyy")</code></li>
</ul>
<p>Two inputs at the top:</p>
<ul>
<li><strong>C6:</strong> Month (a dropdown of months from the register)</li>
<li><strong>C7:</strong> Emp ID (a dropdown from the Employees list)</li>
</ul>
<p>Then the employee details in rows 9â€“12, labels in B and D, values in C and E.</p>
<h2>Step 3: Pull employee details</h2>
<pre><code>C9:  =IFERROR(INDEX(Employees!$B:$B,MATCH($C$7,Employees!$A:$A,0)),"")
E9:  =IFERROR(INDEX(Employees!$C:$C,MATCH($C$7,Employees!$A:$A,0)),"")
C10: =IFERROR(INDEX(Employees!$D:$D,MATCH($C$7,Employees!$A:$A,0)),"")
E10: =IFERROR(TEXT(INDEX(Employees!$E:$E,MATCH($C$7,Employees!$A:$A,0)),"dd-mm-yyyy"),"")
C11: =IFERROR("XXXX"&amp;INDEX(Employees!$F:$F,MATCH($C$7,Employees!$A:$A,0)),"")
</code></pre>
<h2>Step 4: Pull the month's figures</h2>
<p>Each money field needs a lookup on two conditions: the month and the employee. SUMIFS is the simplest way and works in older Excel too:</p>
<pre><code>=SUMIFS(Register!$E:$E,Register!$A:$A,$C$6,Register!$B:$B,$C$7)
</code></pre>
<p>That gives Basic. Change only the first range for each field: <code>$F:$F</code> for HRA, <code>$G:$G</code> for allowances, <code>$H:$H</code> for overtime, <code>$J:$J</code> to <code>$L:$L</code> for deductions, <code>$D:$D</code> for days paid.</p>
<p>Lay earnings in B:C and deductions in D:E on the same rows, so the slip reads across:</p>
<table>
<thead>
<tr>
<th>Earnings</th>
<th>Amount</th>
<th>Deductions</th>
<th>Amount</th>
</tr>
</thead>
<tbody><tr>
<td>Basic</td>
<td>â€¦</td>
<td>Deduction 1</td>
<td>â€¦</td>
</tr>
<tr>
<td>HRA</td>
<td>â€¦</td>
<td>Deduction 2</td>
<td>â€¦</td>
</tr>
<tr>
<td>Allowances</td>
<td>â€¦</td>
<td>Advance recovered</td>
<td>â€¦</td>
</tr>
<tr>
<td>Overtime / bonus</td>
<td>â€¦</td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>Gross</strong></td>
<td><code>=SUM(C15:C18)</code></td>
<td><strong>Total deductions</strong></td>
<td><code>=SUM(E15:E17)</code></td>
</tr>
</tbody></table>
<p>Name the deduction rows to match what you actually deduct. Leave out rows that don't apply to you rather than showing zeros.</p>
<h2>Step 5: Net pay in figures and words</h2>
<pre><code>C21: =C19-E19
B22: ="Net pay: Rupees "&amp;TEXT(C21,"#,##,##0")&amp;" only"
</code></pre>
<p>The <code>#,##,##0</code> format gives Indian lakh-style grouping (1,25,000). Excel has no built-in function for Indian number words, so type the words if you need them in full.</p>
<h2>Step 6: Catch blanks before printing</h2>
<p>Add a check cell outside the print area:</p>
<pre><code>=IF(COUNTIFS(Register!$A:$A,$C$6,Register!$B:$B,$C$7)=0,"No register row for this month",
 IF(COUNTIFS(Register!$A:$A,$C$6,Register!$B:$B,$C$7)&gt;1,"Duplicate rows: check register","OK"))
</code></pre>
<p>Use <strong>Conditional Formatting</strong> to turn it red when it isn't "OK".</p>
<h2>Step 7: Print a slip for each person</h2>
<ol>
<li>Select B2:E24, <strong>Page Layout &gt; Print Area &gt; Set Print Area</strong>.</li>
<li><strong>Page Setup &gt; Fit to 1 page</strong>, portrait, A4.</li>
<li>Pick the month in C6, then change C7 for each employee and <strong>File &gt; Export &gt; Create PDF</strong>.</li>
<li>Name files like <code>Slip_2026-10_E003.pdf</code>.</li>
</ol>
<p>For a few staff this takes a couple of minutes a month.</p>
<h2>Tips</h2>
<ul>
<li><strong>Protect the slip sheet</strong> (Review &gt; Protect Sheet, leaving C6 and C7 unlocked) so formulas don't get typed over.</li>
<li><strong>Don't store full bank or ID numbers</strong> in a file you email around.</li>
<li><strong>Keep old register rows.</strong> They're your history if anyone asks for a past slip.
<em>This article was drafted with AI tools. It's general spreadsheet guidance for Excel, not tax, payroll or legal advice.</em> If you'd like the register and printable slip already built as an Excel (.xlsx) file, there's one here: <a href="https://ashishsrivastavajay.gumroad.com/l/xbgrzp/LAUNCH30">Salary Slip &amp; Payroll Register</a>. Code <strong>LAUNCH30</strong> gives 30% off until 27 Oct. The template was also made with AI tools.</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[GST invoice format in Excel: a simple layout with automatic CGST/SGST or IGST]]></title><description><![CDATA[Plenty of small businesses in India make GST invoices in Excel instead of paying for billing software. That works fine if the sheet is laid out sensibly…]]></description><link>https://ashishexcelnotes.hashnode.dev/gst-invoice-format-in-excel-a-simple-layout-with-automatic-cgst-sgst-or-igst</link><guid isPermaLink="true">https://ashishexcelnotes.hashnode.dev/gst-invoice-format-in-excel-a-simple-layout-with-automatic-cgst-sgst-or-igst</guid><category><![CDATA[excel]]></category><category><![CDATA[GST]]></category><category><![CDATA[Small business]]></category><category><![CDATA[spreadsheets]]></category><dc:creator><![CDATA[Ashish Srivastava]]></dc:creator><pubDate>Wed, 21 Oct 2026 03:38:30 GMT</pubDate><content:encoded><![CDATA[<p>Plenty of small businesses in India make GST invoices in Excel instead of paying for billing software. That works fine if the sheet is laid out sensibly: one place for your details, one list of customers and items, and an invoice sheet that pulls from both. This guide walks through a practical GST invoice format in Excel, step by step.</p>
<p><strong>Note:</strong> what a GST invoice must contain, which rate applies and how place of supply works depend on your business and current rules. This article covers spreadsheet layout and formulas only. It is not tax or legal advice; check the requirements with your CA or the official GST sources.</p>
<h2>Step 1: A Settings sheet</h2>
<p>Make a sheet called <strong>Settings</strong> and fill in the details that appear on every invoice:</p>
<table>
<thead>
<tr>
<th>Cell</th>
<th>Value</th>
</tr>
</thead>
<tbody><tr>
<td>B2</td>
<td>Business name</td>
</tr>
<tr>
<td>B3</td>
<td>Address</td>
</tr>
<tr>
<td>B4</td>
<td>Your state</td>
</tr>
<tr>
<td>B5</td>
<td>Your GSTIN</td>
</tr>
<tr>
<td>B6</td>
<td>Invoice prefix, e.g. <code>INV-</code></td>
</tr>
<tr>
<td>B7</td>
<td>Bank details for payment</td>
</tr>
</tbody></table>
<p>Every invoice formula points at these cells, so if your address changes you edit one cell.</p>
<h2>Step 2: Customers and Items lists</h2>
<p>On a <strong>Customers</strong> sheet: A = customer name, B = GSTIN (blank if unregistered), C = state, D = billing address.</p>
<p>On an <strong>Items</strong> sheet: A = item or service, B = HSN/SAC code, C = unit price, D = GST rate (for example <code>18%</code>).</p>
<p>Turn both into Excel Tables (<strong>Ctrl+T</strong>). Tables grow automatically, so new customers and items show up in your dropdowns without editing ranges.</p>
<p>Keep state names consistent. The tax split compares text, so "Karnataka" and "Karnatka" count as different states. A dropdown from a fixed state list avoids this.</p>
<h2>Step 3: The invoice header</h2>
<p>On the <strong>Invoice</strong> sheet, lay out the top block:</p>
<ul>
<li><strong>Seller block:</strong> <code>=Settings!B2</code>, <code>=Settings!B3</code>, <code>="GSTIN: "&amp;Settings!B5</code></li>
<li><strong>Invoice number (F3):</strong> type a running number in F2 (e.g. 41) and use <code>=Settings!B6&amp;TEXT(F2,"0000")</code> to get <code>INV-0041</code></li>
<li><strong>Invoice date (F4):</strong> type the date; format as <code>dd-mm-yyyy</code></li>
<li><strong>Customer (B8):</strong> a dropdown via <strong>Data &gt; Data Validation &gt; List</strong> pointing at the customer name column</li>
</ul>
<p>Pull the customer's details from the list:</p>
<pre><code>B9:  =IFERROR(INDEX(Customers!$D:$D,MATCH($B$8,Customers!$A:$A,0)),"")
B10: =IFERROR(INDEX(Customers!$B:$B,MATCH($B$8,Customers!$A:$A,0)),"")
B11: =IFERROR(INDEX(Customers!$C:$C,MATCH($B$8,Customers!$A:$A,0)),"")
</code></pre>
<p>B9 is the address, B10 the customer GSTIN and B11 the place of supply (state).</p>
<h2>Step 4: The line-item table</h2>
<p>Start the item rows at row 15 with these columns:</p>
<table>
<thead>
<tr>
<th>Col</th>
<th>Field</th>
</tr>
</thead>
<tbody><tr>
<td>A</td>
<td>S. No.</td>
</tr>
<tr>
<td>B</td>
<td>Item (dropdown from Items)</td>
</tr>
<tr>
<td>C</td>
<td>HSN/SAC</td>
</tr>
<tr>
<td>D</td>
<td>Qty</td>
</tr>
<tr>
<td>E</td>
<td>Rate</td>
</tr>
<tr>
<td>F</td>
<td>Taxable value</td>
</tr>
<tr>
<td>G</td>
<td>GST rate</td>
</tr>
<tr>
<td>H</td>
<td>CGST</td>
</tr>
<tr>
<td>I</td>
<td>SGST</td>
</tr>
<tr>
<td>J</td>
<td>IGST</td>
</tr>
<tr>
<td>K</td>
<td>Line total</td>
</tr>
</tbody></table>
<p>Lookups for code, rate and GST rate:</p>
<pre><code>C15: =IF($B15="","",IFERROR(INDEX(Items!$B:$B,MATCH($B15,Items!$A:$A,0)),""))
E15: =IF($B15="","",IFERROR(INDEX(Items!$C:$C,MATCH($B15,Items!$A:$A,0)),""))
G15: =IF($B15="","",IFERROR(INDEX(Items!$D:$D,MATCH($B15,Items!$A:$A,0)),""))
F15: =IF($B15="","",ROUND(D15*E15,2))
</code></pre>
<h2>Step 5: Let Excel choose CGST/SGST or IGST</h2>
<p>Compare your state with the customer's state. Same state: split the tax in half. Different state: all of it is IGST.</p>
<pre><code>H15: =IF($B15="","",IF($B$11=Settings!$B$4,ROUND(F15*G15/2,2),0))
I15: =IF($B15="","",IF($B$11=Settings!$B$4,ROUND(F15*G15/2,2),0))
J15: =IF($B15="","",IF($B$11&lt;&gt;Settings!$B$4,ROUND(F15*G15,2),0))
K15: =IF($B15="","",F15+H15+I15+J15)
</code></pre>
<p>Copy row 15 down for as many lines as you need (say 15 rows). These are plain IF and INDEX/MATCH formulas, so they work in older Excel versions as well as Excel 365.</p>
<h2>Step 6: Totals and amount in words</h2>
<p>Below the items:</p>
<pre><code>Taxable total: =SUM(F15:F29)
CGST total:    =SUM(H15:H29)
SGST total:    =SUM(I15:I29)
IGST total:    =SUM(J15:J29)
Grand total:   =ROUND(SUM(K15:K29),0)
</code></pre>
<p>Excel has no built-in function for amounts in Indian words. Either type the words, or show the figure with lakh-style grouping:</p>
<pre><code>="Rupees "&amp;TEXT(K31,"#,##,##0")&amp;" only"
</code></pre>
<p>Add a short tax summary by rate if you use more than one rate, with SUMIF:</p>
<pre><code>=SUMIF($G$15:$G$29,18%,$F$15:$F$29)
</code></pre>
<h2>Step 7: Keep a register of every invoice</h2>
<p>Before you clear the invoice for the next one, copy its key values (number, date, customer, taxable value, CGST, SGST, IGST, total) into an <strong>Invoices</strong> register sheet, one row per invoice. That register is what you'll use for monthly totals and for chasing payments. A pivot table on it (Rows: month; Values: sums of each tax column) gives a quick monthly summary.</p>
<h2>Step 8: Print or save as PDF</h2>
<p>Select the invoice area, <strong>Page Layout &gt; Print Area &gt; Set Print Area</strong>, set <strong>Fit to 1 page wide</strong>, and use <strong>File &gt; Export &gt; Create PDF</strong>. Name the file with the invoice number so it's easy to find later.</p>
<h2>Common mistakes</h2>
<ol>
<li><strong>Hard-coding 18% in formulas.</strong> Keep rates in the Items list.</li>
<li><strong>Typing customer details by hand each time.</strong> That's where GSTIN typos creep in.</li>
<li><strong>Overwriting the last invoice without logging it.</strong> Always add it to the register first.</li>
<li><strong>Rounding only the grand total.</strong> Round each tax line too, so totals match line by line.</li>
<li><strong>Reusing invoice numbers.</strong> A <code>COUNTIF</code> on the register's number column (<code>=COUNTIF(A:A,A2)&gt;1</code>) flags duplicates.
<em>This article was drafted with AI tools. It's general spreadsheet guidance for Excel, not tax or legal advice.</em> If you'd rather start from a ready-made Excel (.xlsx) version with an invoice register and receivables tracking, there's one here: <a href="https://ashishsrivastavajay.gumroad.com/l/bxwjyy/LAUNCH30">GST Invoice &amp; Receivables Tracker</a>. Code <strong>LAUNCH30</strong> gives 30% off until 27 Oct. The template was also made with AI tools.</li>
</ol>
]]></content:encoded></item><item><title><![CDATA[How to make a 30-day social media content calendar in Excel]]></title><description><![CDATA[Most small shops don't stop posting because they lack ideas. They stop because each day starts from a blank page. A 30-day calendar in Excel fixes that…]]></description><link>https://ashishexcelnotes.hashnode.dev/how-to-make-a-30-day-social-media-content-calendar-in-excel</link><guid isPermaLink="true">https://ashishexcelnotes.hashnode.dev/how-to-make-a-30-day-social-media-content-calendar-in-excel</guid><category><![CDATA[excel]]></category><category><![CDATA[social media]]></category><category><![CDATA[Small business]]></category><category><![CDATA[Productivity]]></category><dc:creator><![CDATA[Ashish Srivastava]]></dc:creator><pubDate>Tue, 20 Oct 2026 18:12:47 GMT</pubDate><content:encoded><![CDATA[<p>Most small shops don't stop posting because they lack ideas. They stop because each day starts from a blank page. A 30-day calendar in Excel fixes that: you plan themes once, and every day already has a prompt waiting. Here's how to build one where you change one start date and everything else follows.</p>
<h2>Settings</h2>
<p>On a sheet called <strong>Settings</strong>:</p>
<ul>
<li><strong>B1:</strong> Start date (e.g. 01-11-2026)</li>
<li><strong>A4:A10:</strong> seven weekly themes, one per weekday (for example: Product spotlight, Behind the scenes, Customer question, Tip, Offer, Story, Weekly recap)</li>
</ul>
<h2>Sheet: Calendar</h2>
<p>Headers in row 1: Day, Date, Weekday, Theme, Post idea, Caption no., Caption, Platform, Format, Status, Hashtags.</p>
<p><strong>Day (A2:A31):</strong> type 1 in A2, then <code>=A2+1</code> in A3 and fill down to A31.</p>
<p><strong>Date (B2):</strong></p>
<pre><code>=Settings!$B$1+A2-1
</code></pre>
<p><strong>Weekday (C2):</strong></p>
<pre><code>=TEXT(B2,"dddd")
</code></pre>
<p><strong>Theme (D2)</strong>, cycling through your seven themes:</p>
<pre><code>=INDEX(Settings!$A$4:$A$10,MOD(A2-1,7)+1)
</code></pre>
<p>Change the start date and every date, weekday and theme moves with it.</p>
<h2>A caption bank</h2>
<p>On a sheet called <strong>Captions</strong>, column A = number (1, 2, 3â€¦), column B = theme, column C = caption text with blanks to fill, e.g. "Our [product] is back in stock. Which colour should we restock first?"</p>
<p>On the Calendar, <strong>Caption no. (F2)</strong> can start as the day number, <code>=A2</code>, and you overwrite it when you want a different one. Then <strong>Caption (G2):</strong></p>
<pre><code>=IFERROR(INDEX(Captions!$C:$C,MATCH(F2,Captions!$A:$A,0)),"")
</code></pre>
<p>Want the caption to match the day's theme automatically? In Excel 365/2021:</p>
<pre><code>=IFERROR(INDEX(FILTER(Captions!$C$2:$C$500,Captions!$B$2:$B$500=D2),ROUNDUP(A2/7,0)),"")
</code></pre>
<p>This picks the 1st caption for that theme in week 1, the 2nd in week 2, and so on.</p>
<h2>Dropdowns</h2>
<ul>
<li><strong>Platform:</strong> Instagram, Facebook, WhatsApp Status, YouTube Shorts, Other</li>
<li><strong>Format:</strong> Photo, Carousel, Reel, Story, Text</li>
<li><strong>Status:</strong> Idea, Drafted, Scheduled, Posted, Skipped</li>
</ul>
<p>Select each column, <strong>Data &gt; Data Validation &gt; List</strong>, and type the values separated by commas.</p>
<h2>Make today stand out</h2>
<p>Select A2:K31, <strong>Home &gt; Conditional Formatting &gt; New Rule &gt; Use a formula</strong>:</p>
<pre><code>=$B2=TODAY()
</code></pre>
<p>Pick a light fill. A second rule, <code>=AND($B2&lt;TODAY(),$J2&lt;&gt;"Posted",$J2&lt;&gt;"Skipped")</code>, in light red, shows days you missed.</p>
<h2>Track how you're doing</h2>
<p>A small summary above or beside the calendar:</p>
<pre><code>Posted:  =COUNTIF(J2:J31,"Posted")
Planned: =COUNTA(B2:B31)
Rate:    =IF(COUNTIF(B2:B31,"&lt;="&amp;TODAY())=0,"",COUNTIF(J2:J31,"Posted")/COUNTIF(B2:B31,"&lt;="&amp;TODAY()))
</code></pre>
<p>The rate only counts days that have already arrived, so it doesn't punish you for the future.</p>
<p>If you want to note results, add Reach and Messages columns and fill them a day or two after posting. After a month, sort by Messages to see which themes start conversations.</p>
<h2>Batch it</h2>
<p>The calendar works best if you spend one hour a week on it: on Sunday, read the next seven rows, take the photos, write the captions, and set Status to Drafted or Scheduled. Then each day is just "post the thing".</p>
<h2>Reusing it next month</h2>
<p>When the 30 days are up, right-click the Calendar tab, <strong>Move or Copy &gt; Create a copy</strong>, and rename the copy with the month (for example "Cal 2026-11"). On the new copy, change Settings!B1 to the next start date, clear the Status, Reach and Messages columns, and you're ready. If you keep notes of which caption numbers did well, overwrite the Caption no. column on the new copy to repeat the winners on different days. Old copies stay as a record, so you can see over a few months which themes and formats get replies and which ones you keep skipping.</p>
<h2>Writing better fill-in captions</h2>
<p>Captions with a question at the end ("Which one would you pick?") tend to start more conversations than plain announcements. Keep each caption short, put the blank where the product name goes, and write two or three versions for each theme so the calendar doesn't repeat itself every week. Twenty captions per theme is plenty to start.</p>
<h2>Common mistakes</h2>
<ol>
<li><strong>Typing dates by hand.</strong> One start date plus formulas means you can reuse the calendar every month.</li>
<li><strong>Too many platforms.</strong> Start with one or two you actually use.</li>
<li><strong>Hashtags pasted the same every day.</strong> Keep a few sets per theme in Settings and rotate them.</li>
<li><strong>Deleting last month.</strong> Copy the sheet first; you can reuse what worked.
<em>This article was drafted with AI tools. It's general guidance, not marketing or legal advice.</em> If you'd like a ready-made version, a 30-day Excel (.xlsx) calendar plus a PDF of 150 fill-in captions, there's one here: <a href="https://ashishsrivastavajay.gumroad.com/l/lqvwbh">30-Day Content Calendar + 150 Captions</a>. It was also made with AI tools.</li>
</ol>
]]></content:encoded></item><item><title><![CDATA[How to track multiple income streams in one Excel dashboard]]></title><description><![CDATA[Once you have more than one small income source (a digital product, some freelance work, affiliate links, a newsletter) it gets hard to answer simple…]]></description><link>https://ashishexcelnotes.hashnode.dev/how-to-track-multiple-income-streams-in-one-excel-dashboard</link><guid isPermaLink="true">https://ashishexcelnotes.hashnode.dev/how-to-track-multiple-income-streams-in-one-excel-dashboard</guid><category><![CDATA[excel]]></category><category><![CDATA[Side Projects]]></category><category><![CDATA[personal finance]]></category><category><![CDATA[spreadsheets]]></category><dc:creator><![CDATA[Ashish Srivastava]]></dc:creator><pubDate>Tue, 20 Oct 2026 18:12:24 GMT</pubDate><content:encoded><![CDATA[<p>Once you have more than one small income source (a digital product, some freelance work, affiliate links, a newsletter) it gets hard to answer simple questions. Which one actually earns? Is this month better than last? Am I near my goal? Payment dashboards each show their own slice. One Excel workbook can pull it together.</p>
<h2>Sheet 1: Streams</h2>
<p>A short list of your income sources:</p>
<table>
<thead>
<tr>
<th>Col</th>
<th>Field</th>
</tr>
</thead>
<tbody><tr>
<td>A</td>
<td>Stream name (e.g. "Template shop", "Client work")</td>
</tr>
<tr>
<td>B</td>
<td>Type (dropdown: Product, Service, Affiliate, Ads, Other)</td>
</tr>
<tr>
<td>C</td>
<td>Platform</td>
</tr>
<tr>
<td>D</td>
<td>Currency</td>
</tr>
<tr>
<td>E</td>
<td>Active? (Yes/No)</td>
</tr>
</tbody></table>
<p>Name the stream list range: select A2:A50, type <code>StreamList</code> in the Name Box (left of the formula bar). You'll use it for dropdowns.</p>
<h2>Sheet 2: Income log</h2>
<p>One row per payout or sale:</p>
<table>
<thead>
<tr>
<th>Col</th>
<th>Field</th>
</tr>
</thead>
<tbody><tr>
<td>A</td>
<td>Date</td>
</tr>
<tr>
<td>B</td>
<td>Stream (dropdown from StreamList)</td>
</tr>
<tr>
<td>C</td>
<td>Description</td>
</tr>
<tr>
<td>D</td>
<td>Currency</td>
</tr>
<tr>
<td>E</td>
<td>Gross amount</td>
</tr>
<tr>
<td>F</td>
<td>Fees</td>
</tr>
<tr>
<td>G</td>
<td>Net</td>
</tr>
<tr>
<td>H</td>
<td>Rate to base currency</td>
</tr>
<tr>
<td>I</td>
<td>Net in base currency</td>
</tr>
<tr>
<td>J</td>
<td>Month</td>
</tr>
</tbody></table>
<p><strong>Dropdown on B:</strong> Data &gt; Data Validation &gt; List, source <code>=StreamList</code>.</p>
<p><strong>Formulas:</strong></p>
<pre><code>G2: =IF($A2="","",E2-N(F2))
I2: =IF($A2="","",G2*IF(H2="",1,H2))
J2: =IF($A2="","",TEXT(A2,"yyyy-mm"))
</code></pre>
<p>Type the rate yourself (what you actually received), and leave it blank when the currency already matches your base. Don't add USD and GBP amounts directly.</p>
<h2>Sheet 3: Expenses (optional but honest)</h2>
<p>Same shape: Date, Stream, Description, Amount in base currency, Month. Tools, ads and subscriptions often quietly eat a "passive" stream. Tracking them per stream shows real profit.</p>
<h2>Sheet 4: Dashboard</h2>
<p>Put the month you want to look at in <strong>B1</strong> (e.g. <code>2026-10</code>). List streams in A4 down. Then:</p>
<pre><code>Income this month: =SUMIFS(Log!$I:$I,Log!$B:$B,$A4,Log!$J:$J,$B$1)
Expenses:          =SUMIFS(Exp!$D:$D,Exp!$B:$B,$A4,Exp!$E:$E,$B$1)
Profit:            =B4-C4
Share of income:   =IF(SUM($B$4:$B$20)=0,"",B4/SUM($B$4:$B$20))
</code></pre>
<p><strong>Previous month</strong> for comparison, from the month in B1:</p>
<pre><code>=TEXT(EDATE(DATEVALUE($B$1&amp;"-01"),-1),"yyyy-mm")
</code></pre>
<p>Put that in B2 and copy the income formula pointing at B2 instead of B1. A change column, <code>=IF(E4=0,"",B4/E4-1)</code>, formatted as %, shows growth per stream.</p>
<h2>Goal tracking</h2>
<p>In a Goals cell (say <code>Dashboard!H1</code>) type your monthly target. Then:</p>
<pre><code>Progress: =IF($H$1=0,"",SUM(B4:B20)/$H$1)
</code></pre>
<p>Format as %, and add <strong>Conditional Formatting &gt; Data Bars</strong> for a quick visual.</p>
<h2>A chart that's actually useful</h2>
<p>Make a pivot table from the Log: Rows = Month, Columns = Stream, Values = Sum of Net in base. Insert a <strong>stacked column chart</strong> from it. You'll see at a glance whether growth comes from one stream or several, and which months were carried by a single sale.</p>
<h2>Year-to-date view</h2>
<p>Monthly numbers bounce around, especially for products where one launch week can be most of the year. Add a year-to-date column to the Dashboard with the year in B3 (e.g. <code>2026</code>):</p>
<pre><code>=SUMIFS(Log!$I:$I,Log!$B:$B,$A4,Log!$A:$A,"&gt;="&amp;DATE($B$3,1,1),Log!$A:$A,"&lt;="&amp;DATE($B$3,12,31))
</code></pre>
<p>Sort streams by this column at least once a quarter. It's the fairest way to decide where your next hours should go, and which stream has quietly stopped earning.</p>
<h2>Keep payout proof</h2>
<p>Add a <strong>Reference</strong> column to the Log for the payout or transaction ID. When a platform total and your bank don't agree, the reference lets you match them one by one instead of guessing.</p>
<h2>Common mistakes</h2>
<ol>
<li><strong>Logging gross only.</strong> Platform and payment fees can be significant; log them.</li>
<li><strong>Mixing currencies.</strong> Always convert in a separate column with a rate you entered.</li>
<li><strong>Calling it passive when it isn't.</strong> Add a "Hours spent" column to the log if you want to see income per hour.</li>
<li><strong>Retyping stream names.</strong> Dropdowns keep the dashboard sums correct.</li>
</ol>
<h2>A monthly routine</h2>
<p>On the 1st: export payouts from each platform, paste them into the Log, check the rates, change B1 to the new month. Fifteen minutes gives you one honest picture of all your income.
<em>This article was drafted with AI tools. It's general spreadsheet guidance, not financial, tax or legal advice.</em> If you'd like a ready-made Excel (.xlsx) version with income and expense trackers, goals and a multi-currency dashboard, there's one here: <a href="https://ashishsrivastavajay.gumroad.com/l/hytkwb">Passive Income Command Center</a>. The workbook was also made with AI tools.</p>
]]></content:encoded></item><item><title><![CDATA[How to track export shipment documents and payments in Excel (for small exporters)]]></title><description><![CDATA[A small export order involves a lot of paperwork that has to match: proforma invoice, commercial invoice, packing list, shipping bill, bill of lading or…]]></description><link>https://ashishexcelnotes.hashnode.dev/how-to-track-export-shipment-documents-and-payments-in-excel-for-small-exporters</link><guid isPermaLink="true">https://ashishexcelnotes.hashnode.dev/how-to-track-export-shipment-documents-and-payments-in-excel-for-small-exporters</guid><category><![CDATA[excel]]></category><category><![CDATA[Export]]></category><category><![CDATA[Small business]]></category><category><![CDATA[spreadsheets]]></category><dc:creator><![CDATA[Ashish Srivastava]]></dc:creator><pubDate>Tue, 20 Oct 2026 18:12:01 GMT</pubDate><content:encoded><![CDATA[<p>A small export order involves a lot of paperwork that has to match: proforma invoice, commercial invoice, packing list, shipping bill, bill of lading or airway bill, certificate of origin, and the payment terms you agreed. When you're handling your first few shipments, the risk isn't usually a single big mistake. It's a document nobody chased, or a payment date nobody noticed. A simple Excel tracker helps you see what's still open.</p>
<p><strong>Note:</strong> which documents you need depends on the product, the destination, the Incoterm and your buyer's bank. This article covers spreadsheet mechanics only. It is not export, customs, tax or legal advice; confirm requirements with your CHA, freight forwarder, bank or the official sources.</p>
<h2>Sheet 1: Shipments</h2>
<p>One row per shipment:</p>
<table>
<thead>
<tr>
<th>Col</th>
<th>Field</th>
</tr>
</thead>
<tbody><tr>
<td>A</td>
<td>Shipment ID (e.g. EXP-001)</td>
</tr>
<tr>
<td>B</td>
<td>Buyer</td>
</tr>
<tr>
<td>C</td>
<td>Country</td>
</tr>
<tr>
<td>D</td>
<td>Invoice no.</td>
</tr>
<tr>
<td>E</td>
<td>Invoice date</td>
</tr>
<tr>
<td>F</td>
<td>Currency</td>
</tr>
<tr>
<td>G</td>
<td>Invoice value</td>
</tr>
<tr>
<td>H</td>
<td>Incoterm (dropdown: EXW, FOB, CIF, DAPâ€¦)</td>
</tr>
<tr>
<td>I</td>
<td>Advance received</td>
</tr>
<tr>
<td>J</td>
<td>Balance due</td>
</tr>
<tr>
<td>K</td>
<td>Balance due date</td>
</tr>
<tr>
<td>L</td>
<td>Docs complete?</td>
</tr>
<tr>
<td>M</td>
<td>Payment status</td>
</tr>
</tbody></table>
<p><strong>Balance (J2):</strong></p>
<pre><code>=IF($A2="","",G2-N(I2))
</code></pre>
<p><strong>Payment status (M2):</strong></p>
<pre><code>=IF($A2="","",IF(J2&lt;=0,"Received",IF(AND(K2&lt;&gt;"",TODAY()&gt;K2),"Overdue","Open")))
</code></pre>
<p>Keep currency as its own column and never add USD and EUR invoices together. Totals per currency use SUMIFS with a currency condition.</p>
<h2>Sheet 2: Document checklist</h2>
<p>This is the useful part. Make a long table with one row per <strong>shipment Ã— document</strong>:</p>
<table>
<thead>
<tr>
<th>Col</th>
<th>Field</th>
</tr>
</thead>
<tbody><tr>
<td>A</td>
<td>Shipment ID</td>
</tr>
<tr>
<td>B</td>
<td>Document</td>
</tr>
<tr>
<td>C</td>
<td>Status (dropdown: Pending, Done, NA)</td>
</tr>
<tr>
<td>D</td>
<td>Date done</td>
</tr>
<tr>
<td>E</td>
<td>Note (who has it, file name)</td>
</tr>
</tbody></table>
<p>For each new shipment, paste your standard document list (the 10â€“15 you normally need) and set the ones that don't apply to <strong>NA</strong>. "NA" matters: it's the difference between "we decided this isn't needed" and "we forgot".</p>
<p>Add Data Validation on column C: <strong>Data &gt; Data Validation &gt; List</strong>, <code>Pending,Done,NA</code>.</p>
<h2>Linking the two sheets</h2>
<p>Back on Shipments, column L counts what's still pending:</p>
<pre><code>=IF($A2="","",COUNTIFS(Docs!$A:$A,$A2,Docs!$C:$C,"Pending"))
</code></pre>
<p>Then a readable label in a new column N:</p>
<pre><code>=IF($A2="","",IF(COUNTIFS(Docs!$A:$A,$A2)=0,"No checklist",IF(L2=0,"Ready","HOLD: "&amp;L2&amp;" pending")))
</code></pre>
<p>The "No checklist" case catches a shipment where you forgot to add document rows at all, which would otherwise show 0 pending and look ready.</p>
<p>Colour column N with conditional formatting: text containing "HOLD" in red, "Ready" in green.</p>
<h2>Costs and contribution</h2>
<p>Add cost columns to Shipments: freight, insurance, CHA/forwarder charges, bank charges. Then:</p>
<pre><code>Total cost:   =SUM(P2:S2)
Contribution: =IF($A2="","",G2-T2)
</code></pre>
<p>Keep costs in the same currency as the invoice, or add an explicit rate column you type yourself. Don't let a formula guess an exchange rate; the rate you actually got from the bank is the one that matters.</p>
<h2>A weekly view</h2>
<p>On a Start sheet, a few counts tell you where to look:</p>
<pre><code>Shipments on HOLD:  =COUNTIF(Shipments!N:N,"HOLD*")
Overdue payments:   =COUNTIF(Shipments!M:M,"Overdue")
Due in next 7 days: =COUNTIFS(Shipments!K:K,"&gt;="&amp;TODAY(),Shipments!K:K,"&lt;="&amp;TODAY()+7,Shipments!J:J,"&gt;0")
</code></pre>
<h2>Reusing your document list</h2>
<p>Typing 14 document names for every shipment gets old fast. Keep a <strong>DocList</strong> sheet with your standard list in column A and, in column B, a short note on when each one applies (for example "only if buyer asks", "only for LC payments"). For a new shipment, copy A2:A15, paste it into the Docs sheet, and fill the Shipment ID beside each row by typing it once and double-clicking the fill handle.</p>
<p>If you ship to two very different markets, keep two lists side by side (say "Standard" and "LC shipments") and copy the one that fits. Over time the notes column becomes your own record of what each buyer and bank actually asked for, which is worth more than any generic list.</p>
<h2>Protect the formulas</h2>
<p>Select the formula columns (balance, status, pending count, contribution), shade them light grey, then <strong>Format Cells &gt; Protection</strong> and keep them locked while unlocking the input columns. <strong>Review &gt; Protect Sheet</strong> with no password stops accidental overwrites without getting in your way.</p>
<h2>Common mistakes</h2>
<ol>
<li><strong>Invoice and packing list disagree</strong> on quantity or weight. Add a check column comparing them if you type both.</li>
<li><strong>Ticking "Done" with no file.</strong> Use the Note column to record where the document is saved.</li>
<li><strong>One sheet per shipment.</strong> It looks tidy but you can't count across shipments. Use one long checklist table.</li>
<li><strong>Deleting old shipments.</strong> Filter them; next year's buyer often wants the same documents as last year's.
<em>This article was drafted with AI tools. It's general spreadsheet guidance, not export, customs, tax or legal advice.</em> If you'd rather start from a ready-made Excel (.xlsx) workbook with a shipment log, a 14-document checklist, contribution after costs and a pre-ship HOLD check, there's one here: <a href="https://ashishsrivastavajay.gumroad.com/l/dcbkqg">India Ship Desk</a>. The workbook was also made with AI tools.</li>
</ol>
]]></content:encoded></item><item><title><![CDATA[How to track customer orders and payments in Excel (free template approach)]]></title><description><![CDATA[If you sell on WhatsApp, Instagram or at a stall, orders tend to live in chats and payments in your bank app. The question "who still owes me, and for…]]></description><link>https://ashishexcelnotes.hashnode.dev/how-to-track-customer-orders-and-payments-in-excel-free-template-approach</link><guid isPermaLink="true">https://ashishexcelnotes.hashnode.dev/how-to-track-customer-orders-and-payments-in-excel-free-template-approach</guid><category><![CDATA[excel]]></category><category><![CDATA[Small business]]></category><category><![CDATA[spreadsheets]]></category><category><![CDATA[Productivity]]></category><dc:creator><![CDATA[Ashish Srivastava]]></dc:creator><pubDate>Tue, 20 Oct 2026 18:11:14 GMT</pubDate><content:encoded><![CDATA[<p>If you sell on WhatsApp, Instagram or at a stall, orders tend to live in chats and payments in your bank app. The question "who still owes me, and for what?" ends up taking half an hour. One Excel table with a few formulas answers it in seconds. Here's how to set it up.</p>
<h2>Make it a real Excel Table</h2>
<p>Type these headers in row 1, select them plus a few blank rows, and press <strong>Ctrl+T</strong> (tick "My table has headers"). Name the table <code>Orders</code> in <strong>Table Design &gt; Table Name</strong>.</p>
<table>
<thead>
<tr>
<th>Field</th>
<th>What goes in</th>
</tr>
</thead>
<tbody><tr>
<td>Order date</td>
<td>Date</td>
</tr>
<tr>
<td>Order no.</td>
<td>e.g. 1001, 1002</td>
</tr>
<tr>
<td>Customer</td>
<td>Name</td>
</tr>
<tr>
<td>Phone</td>
<td>Optional</td>
</tr>
<tr>
<td>Item</td>
<td>What they bought</td>
</tr>
<tr>
<td>Qty</td>
<td>Number</td>
</tr>
<tr>
<td>Rate</td>
<td>Price per unit</td>
</tr>
<tr>
<td>Amount</td>
<td>Formula</td>
</tr>
<tr>
<td>Paid</td>
<td>Amount received so far</td>
</tr>
<tr>
<td>Balance</td>
<td>Formula</td>
</tr>
<tr>
<td>Pay mode</td>
<td>Dropdown: Cash, UPI, Bank, Card</td>
</tr>
<tr>
<td>Delivery</td>
<td>Dropdown: Pending, Shipped, Delivered</td>
</tr>
<tr>
<td>Status</td>
<td>Formula</td>
</tr>
</tbody></table>
<p>Tables are worth it because formulas fill down automatically when you add a row, and references read like words.</p>
<h2>The formulas</h2>
<p><strong>Amount:</strong></p>
<pre><code>=[@Qty]*[@Rate]
</code></pre>
<p><strong>Balance:</strong></p>
<pre><code>=[@Amount]-N([@Paid])
</code></pre>
<p><strong>Status:</strong></p>
<pre><code>=IF([@Amount]=0,"",IF([@Balance]&lt;=0,"Paid",IF(N([@Paid])&gt;0,"Part-paid","Unpaid")))
</code></pre>
<p><strong>Days since order</strong> (useful for chasing):</p>
<pre><code>=IF([@Balance]&gt;0,TODAY()-[@[Order date]],"")
</code></pre>
<h2>Dropdowns</h2>
<p>Select the Pay mode column, <strong>Data &gt; Data Validation &gt; List</strong>, and type <code>Cash,UPI,Bank,Card</code>. Do the same for Delivery. Consistent values are what make the summaries below work.</p>
<h2>Colour what needs attention</h2>
<p>Select the Status column, <strong>Home &gt; Conditional Formatting &gt; Highlight Cells Rules &gt; Equal To</strong>: "Unpaid" red, "Part-paid" amber. Add a rule on Delivery = "Pending" if shipping is your bottleneck.</p>
<h2>Customer balances in one view</h2>
<p>On a new sheet, list customers in column A (in Excel 365/2021, <code>=UNIQUE(Orders[Customer])</code> does it for you). Then:</p>
<pre><code>Owed:   =SUMIFS(Orders[Balance],Orders[Customer],A2)
Orders: =COUNTIFS(Orders[Customer],A2)
Oldest unpaid (days): =MAXIFS(Orders[Days since order],Orders[Customer],A2)
</code></pre>
<p><code>MAXIFS</code> needs Excel 2019 or later. Sort by "Owed", largest first, and you have your follow-up list.</p>
<h2>Monthly sales and collections</h2>
<p>Add a helper column <strong>Month</strong> in the table:</p>
<pre><code>=TEXT([@[Order date]],"yyyy-mm")
</code></pre>
<p>Then a quick summary:</p>
<pre><code>Sales:     =SUMIFS(Orders[Amount],Orders[Month],"2026-10")
Collected: =SUMIFS(Orders[Paid],Orders[Month],"2026-10")
</code></pre>
<p>Or insert a pivot table: Rows = Month, Values = Sum of Amount, Sum of Paid, Sum of Balance.</p>
<h2>Part payments</h2>
<p>If a customer pays in instalments, there are two ways:</p>
<ol>
<li><strong>Simple:</strong> just update the Paid cell (e.g. 500 becomes 1200). Fine for a few orders.</li>
<li><strong>Proper:</strong> a second table, <code>Payments</code> (Date, Order no., Amount, Mode). Then the Paid column becomes:</li>
</ol>
<pre><code>=SUMIFS(Payments[Amount],Payments[Order no.],[@[Order no.]])
</code></pre>
<p>This keeps a dated record of every payment, which helps when a customer says "I already paid".</p>
<h2>Find an order fast</h2>
<p>Above the table, add a search cell (say B1) and a result line. For an order number:</p>
<pre><code>=IFERROR(INDEX(Orders[Balance],MATCH($B$1,Orders[Order no.],0)),"Not found")
</code></pre>
<p>When a customer messages "what do I owe?", type their order number in B1 and answer in seconds. For a name search, use the table's own filter: click the Customer header arrow and type part of the name in the search box.</p>
<h2>Keep a backup</h2>
<p>A single file is a single point of failure. Once a week, <strong>File &gt; Save As</strong> a dated copy (for example "Orders 2026-10-25.xlsx") to a second location such as a cloud drive or a pen drive. It takes ten seconds and saves you from a corrupted file or a lost phone.</p>
<h2>Common mistakes</h2>
<ol>
<li><strong>Typing customer names differently.</strong> "Priya", "Priya S" and "priya" become three customers. Keep a customer list and use a dropdown.</li>
<li><strong>Merging cells</strong> for neat headings above the table. It breaks sorting and filters; keep headings outside the table.</li>
<li><strong>Deleting paid orders.</strong> Filter them out instead; history is useful.</li>
<li><strong>One sheet per month.</strong> One table with a Month column is far easier to summarise.</li>
</ol>
<h2>A two-minute daily habit</h2>
<p>At the end of the day: add today's orders, update Paid from your UPI/bank app, then filter Status to "Unpaid". That's your follow-up list for tomorrow.
<em>This article was drafted with AI tools. It's general spreadsheet guidance, not accounting, tax or legal advice.</em> If you'd rather not build it yourself, a free Excel (.xlsx) version of this tracker is here: <a href="https://ashishsrivastavajay.gumroad.com/l/free-order-payment-tracker">Free Order &amp; Payment Tracker</a>. It was also made with AI tools.</p>
]]></content:encoded></item><item><title><![CDATA[How to make a monthly salary slip and payroll register in Excel]]></title><description><![CDATA[If you pay a handful of staff, you don't need payroll software to stay organised. You need one register with a row per employee per month, and a slip that…]]></description><link>https://ashishexcelnotes.hashnode.dev/how-to-make-a-monthly-salary-slip-and-payroll-register-in-excel</link><guid isPermaLink="true">https://ashishexcelnotes.hashnode.dev/how-to-make-a-monthly-salary-slip-and-payroll-register-in-excel</guid><category><![CDATA[excel]]></category><category><![CDATA[Payroll]]></category><category><![CDATA[Small business]]></category><category><![CDATA[spreadsheets]]></category><dc:creator><![CDATA[Ashish Srivastava]]></dc:creator><pubDate>Tue, 20 Oct 2026 18:10:42 GMT</pubDate><content:encoded><![CDATA[<p>If you pay a handful of staff, you don't need payroll software to stay organised. You need one register with a row per employee per month, and a slip that pulls from it. This guide builds both in Excel, so you type each number once and print a clean slip for anyone.</p>
<p><strong>Note:</strong> deductions such as PF, ESI, professional tax or TDS depend on your state, your headcount and current rules. This article shows the spreadsheet mechanics only. It is not tax, payroll or legal advice; check the rates with an accountant or the official sources.</p>
<h2>Sheet 1: Employees</h2>
<table>
<thead>
<tr>
<th>Col</th>
<th>Field</th>
</tr>
</thead>
<tbody><tr>
<td>A</td>
<td>Emp ID</td>
</tr>
<tr>
<td>B</td>
<td>Name</td>
</tr>
<tr>
<td>C</td>
<td>Designation</td>
</tr>
<tr>
<td>D</td>
<td>Basic (monthly)</td>
</tr>
<tr>
<td>E</td>
<td>HRA</td>
</tr>
<tr>
<td>F</td>
<td>Other allowances</td>
</tr>
<tr>
<td>G</td>
<td>Bank account (last 4 digits)</td>
</tr>
</tbody></table>
<p>Keep only what you need. Storing full bank and ID numbers in a spreadsheet you email around is a risk.</p>
<h2>Sheet 2: Register (one row per employee per month)</h2>
<table>
<thead>
<tr>
<th>Col</th>
<th>Field</th>
</tr>
</thead>
<tbody><tr>
<td>A</td>
<td>Month (first day, e.g. 01-10-2026)</td>
</tr>
<tr>
<td>B</td>
<td>Emp ID</td>
</tr>
<tr>
<td>C</td>
<td>Name</td>
</tr>
<tr>
<td>D</td>
<td>Working days in month</td>
</tr>
<tr>
<td>E</td>
<td>Days paid</td>
</tr>
<tr>
<td>F</td>
<td>Basic earned</td>
</tr>
<tr>
<td>G</td>
<td>HRA earned</td>
</tr>
<tr>
<td>H</td>
<td>Allowances earned</td>
</tr>
<tr>
<td>I</td>
<td>Gross</td>
</tr>
<tr>
<td>J</td>
<td>Deduction 1</td>
</tr>
<tr>
<td>K</td>
<td>Deduction 2</td>
</tr>
<tr>
<td>L</td>
<td>Advance recovered</td>
</tr>
<tr>
<td>M</td>
<td>Total deductions</td>
</tr>
<tr>
<td>N</td>
<td>Net pay</td>
</tr>
</tbody></table>
<p><strong>Name (C2)</strong>, looked up so you don't retype it:</p>
<pre><code>=IF($B2="","",IFERROR(INDEX(Employees!$B:$B,MATCH($B2,Employees!$A:$A,0)),"Check ID"))
</code></pre>
<p><strong>Pro-rated basic (F2)</strong>, for someone who joined mid-month or took unpaid leave:</p>
<pre><code>=IF($B2="","",ROUND(INDEX(Employees!$D:$D,MATCH($B2,Employees!$A:$A,0))*E2/D2,0))
</code></pre>
<p>Copy the same pattern for HRA (column E of Employees) and allowances (column F).</p>
<p><strong>Working days (D2):</strong> if you pay on calendar days,</p>
<pre><code>=DAY(EOMONTH(A2,0))
</code></pre>
<p>If you pay on working days with Sunday off, use <code>=NETWORKDAYS.INTL(A2,EOMONTH(A2,0),11)</code>. The <code>11</code> means only Sunday is a weekend.</p>
<p><strong>Gross, deductions, net:</strong></p>
<pre><code>I2: =IF($B2="","",F2+G2+H2)
M2: =IF($B2="","",N(J2)+N(K2)+N(L2))
N2: =IF($B2="","",I2-M2)
</code></pre>
<p>Leave J and K as typed values, or as a formula once you've confirmed the rule that applies to you. Putting a rate in a separate Settings cell (e.g. <code>Settings!B2</code>) is better than burying it inside formulas, because when it changes you update one cell.</p>
<h2>Sheet 3: the Slip</h2>
<p>Lay out a printable A4 slip with labels on the left. Put two input cells at the top:</p>
<ul>
<li><strong>C3:</strong> Month (pick from a dropdown of register months)</li>
<li><strong>C4:</strong> Emp ID</li>
</ul>
<p>Every other value uses one lookup on two conditions. For example Gross:</p>
<pre><code>=IFERROR(INDEX(Register!$I:$I,MATCH(1,(Register!$A:$A=$C$3)*(Register!$B:$B=$C$4),0)),"")
</code></pre>
<p>In Excel 365 or 2021 this works as typed. In older Excel, confirm it with <strong>Ctrl+Shift+Enter</strong>. Repeat for each field, changing only the first range.</p>
<p>For a simpler option, use SUMIFS for number fields:</p>
<pre><code>=SUMIFS(Register!$N:$N,Register!$A:$A,$C$3,Register!$B:$B,$C$4)
</code></pre>
<h3>Net pay in words</h3>
<p>Excel has no built-in "number to words" for Indian formats. Either type it, or keep a short line like "Net pay: â‚¹ 18,450 only" using:</p>
<pre><code>="Net pay: â‚¹ "&amp;TEXT(C20,"#,##,##0")&amp;" only"
</code></pre>
<p>The <code>#,##,##0</code> format gives lakh-style grouping.</p>
<h2>Printing</h2>
<p>Select the slip area, <strong>Page Layout &gt; Print Area &gt; Set Print Area</strong>, then <strong>Fit to 1 page</strong>. Change C4, print or <strong>File &gt; Export &gt; PDF</strong>, repeat. For ten staff that's a couple of minutes.</p>
<h2>Monthly summary</h2>
<p>A pivot table on the Register (Rows: Month; Values: Sum of Gross, Sum of Total deductions, Sum of Net pay) gives you the monthly payroll cost for your books.</p>
<h2>Overtime and one-off payments</h2>
<p>Bonuses, overtime and reimbursements don't belong in the Employees sheet because they change each month. Add columns to the Register instead, for example <strong>Overtime hours</strong>, <strong>Overtime rate</strong> and <strong>Other earnings</strong>, and include them in Gross:</p>
<pre><code>I2: =IF($B2="","",F2+G2+H2+N(O2)*N(P2)+N(Q2))
</code></pre>
<p>Label them clearly on the slip so the employee can see where the extra amount came from.</p>
<h2>Common mistakes</h2>
<ol>
<li><strong>Overwriting last month's rows.</strong> Add new rows each month; the register is your history.</li>
<li><strong>Days paid more than working days.</strong> Add Data Validation on E: whole number between 0 and <code>=D2</code>.</li>
<li><strong>Rates hard-coded in formulas.</strong> Keep them in a Settings sheet.</li>
<li><strong>Duplicate rows</strong> for the same person and month. A COUNTIFS check column, <code>=COUNTIFS(A:A,A2,B:B,B2)&gt;1</code>, catches them.
<em>This article was drafted with AI tools. It's general spreadsheet guidance, not tax, payroll or legal advice.</em> If you'd like the register and printable slip already built as an Excel (.xlsx) file, there's one here: <a href="https://ashishsrivastavajay.gumroad.com/l/xbgrzp">Salary Slip &amp; Payroll Register</a>. Code <strong>LAUNCH30</strong> gives 30% off until 27 Oct. The template was also made with AI tools.</li>
</ol>
]]></content:encoded></item><item><title><![CDATA[How to track stock reorder levels in Excel (with automatic "order now" alerts)]]></title><description><![CDATA[Most small shops run out of a fast seller at the worst moment, not because nobody noticed, but because nobody had a number that said "order today". A…]]></description><link>https://ashishexcelnotes.hashnode.dev/how-to-track-stock-reorder-levels-in-excel-with-automatic-order-now-alerts</link><guid isPermaLink="true">https://ashishexcelnotes.hashnode.dev/how-to-track-stock-reorder-levels-in-excel-with-automatic-order-now-alerts</guid><category><![CDATA[excel]]></category><category><![CDATA[inventory]]></category><category><![CDATA[Small business]]></category><category><![CDATA[spreadsheets]]></category><dc:creator><![CDATA[Ashish Srivastava]]></dc:creator><pubDate>Tue, 20 Oct 2026 18:09:37 GMT</pubDate><content:encoded><![CDATA[<p>Most small shops run out of a fast seller at the worst moment, not because nobody noticed, but because nobody had a number that said "order today". A reorder level gives you that number. This guide builds a simple stock sheet in Excel that works out current stock from your in/out entries, compares it with a reorder level, and flags what to buy.</p>
<h2>Two tables, not one</h2>
<p>Keep a <strong>Products</strong> table (one row per item) and a <strong>Movements</strong> table (one row per stock-in or stock-out). Never overwrite a "current stock" number by hand; let Excel work it out from movements. That way every change has a date and a reason.</p>
<p><strong>Movements sheet (Mov)</strong>, from row 2:</p>
<table>
<thead>
<tr>
<th>Col</th>
<th>Field</th>
</tr>
</thead>
<tbody><tr>
<td>A</td>
<td>Date</td>
</tr>
<tr>
<td>B</td>
<td>Item code</td>
</tr>
<tr>
<td>C</td>
<td>Type (In / Out)</td>
</tr>
<tr>
<td>D</td>
<td>Quantity</td>
</tr>
<tr>
<td>E</td>
<td>Note (supplier, bill no.)</td>
</tr>
</tbody></table>
<p>Put a dropdown on column C: <strong>Data &gt; Data Validation &gt; List</strong>, source <code>In,Out</code>. Typos like "out " or "IN" are the most common reason stock totals drift.</p>
<p><strong>Products sheet (Items)</strong>, from row 2:</p>
<table>
<thead>
<tr>
<th>Col</th>
<th>Field</th>
</tr>
</thead>
<tbody><tr>
<td>A</td>
<td>Item code</td>
</tr>
<tr>
<td>B</td>
<td>Item name</td>
</tr>
<tr>
<td>C</td>
<td>Opening stock</td>
</tr>
<tr>
<td>D</td>
<td>Avg daily sales</td>
</tr>
<tr>
<td>E</td>
<td>Supplier lead time (days)</td>
</tr>
<tr>
<td>F</td>
<td>Safety stock</td>
</tr>
<tr>
<td>G</td>
<td>Current stock</td>
</tr>
<tr>
<td>H</td>
<td>Reorder level</td>
</tr>
<tr>
<td>I</td>
<td>Status</td>
</tr>
<tr>
<td>J</td>
<td>Suggested order qty</td>
</tr>
</tbody></table>
<h2>Current stock</h2>
<p>In G2:</p>
<pre><code>=IF($A2="","",C2+SUMIFS(Mov!$D:$D,Mov!$B:$B,$A2,Mov!$C:$C,"In")-SUMIFS(Mov!$D:$D,Mov!$B:$B,$A2,Mov!$C:$C,"Out"))
</code></pre>
<p>Opening stock plus everything in, minus everything out. Fill it down a few hundred rows; the <code>IF($A2="","",â€¦)</code> wrapper keeps empty rows blank.</p>
<h2>Average daily sales</h2>
<p>You can type this by hand, but it's better to work it out from the last 30 days of "Out" movements. In D2:</p>
<pre><code>=IF($A2="","",SUMIFS(Mov!$D:$D,Mov!$B:$B,$A2,Mov!$C:$C,"Out",Mov!$A:$A,"&gt;="&amp;TODAY()-30)/30)
</code></pre>
<p>For seasonal items, change 30 to 14 so the number reacts faster.</p>
<h2>The reorder level</h2>
<p>The classic formula is:</p>
<p><strong>Reorder level = average daily sales Ã— lead time + safety stock</strong></p>
<p>In H2:</p>
<pre><code>=IF($A2="","",ROUNDUP(D2*E2+F2,0))
</code></pre>
<p>If you sell 4 units a day and the supplier takes 5 days, you'll sell about 20 units while waiting. Safety stock (say 8) covers a slow delivery or a busy week. So you reorder when stock falls to 28.</p>
<p>How to pick safety stock without statistics: start with two or three days of sales. If you still run out, raise it. If stock piles up, lower it.</p>
<h2>The status flag</h2>
<p>In I2:</p>
<pre><code>=IF($A2="","",IF(G2&lt;=0,"OUT",IF(G2&lt;=H2,"Reorder","OK")))
</code></pre>
<p>Then colour it: select I2:I500, <strong>Home &gt; Conditional Formatting &gt; Highlight Cells Rules &gt; Text that Contains</strong>, "OUT" in red, "Reorder" in amber.</p>
<h2>Suggested order quantity</h2>
<p>A simple rule: order enough to get back to a target, for example 15 days of sales plus safety stock. In J2:</p>
<pre><code>=IF(OR($A2="",I2="OK"),"",MAX(0,ROUNDUP(D2*15+F2-G2,0)))
</code></pre>
<p>If your supplier sells in packs of 12, wrap it: <code>=CEILING(â€¦,12)</code>.</p>
<h2>A one-glance reorder list</h2>
<p>On a new sheet, if you have Excel 365 or 2021:</p>
<pre><code>=FILTER(Items!A2:J500,Items!I2:I500&lt;&gt;"OK","Nothing to order")
</code></pre>
<p>In older Excel, use <strong>Data &gt; Filter</strong> on the Items table and untick "OK" in the Status column. Either way you get a shopping list you can send to the supplier.</p>
<h2>Stock value</h2>
<p>Add a <strong>Cost price</strong> column to Items (K) and a stock value column:</p>
<pre><code>=IF($A2="","",G2*K2)
</code></pre>
<p><code>=SUM(L2:L500)</code> at the top tells you how much money is sitting on your shelves. Sorting by it often shows that a few slow items tie up more cash than the fast sellers.</p>
<h2>Common mistakes</h2>
<ol>
<li><strong>Editing current stock by hand.</strong> Add an adjustment movement instead ("Out", note "damaged" or "count correction").</li>
<li><strong>Item codes typed differently</strong> in the two sheets. Use a dropdown on Mov!B pointing at the Items code list.</li>
<li><strong>Lead time in weeks, sales per day.</strong> Keep both in days.</li>
<li><strong>Forgetting returns.</strong> A customer return is an "In" with a note.</li>
</ol>
<h2>A weekly routine</h2>
<p>Once a week: do a quick physical count of your top 10 items, post any differences as adjustments, then open the reorder list. Ten minutes, and you stop finding out about stock-outs from customers.
<em>This article was drafted with AI tools. It's general spreadsheet guidance, not accounting, tax or legal advice.</em> If you'd rather start from a ready-made Excel (.xlsx) version with item, movement and reorder sheets already set up, there's one here: <a href="https://ashishsrivastavajay.gumroad.com/l/letfil">Shop Stock &amp; Reorder Tracker</a>. Code <strong>LAUNCH30</strong> gives 30% off until 27 Oct. The template was also made with AI tools.</p>
]]></content:encoded></item><item><title><![CDATA[10 fill-in AI prompts for writing customer emails (and how to adapt them)]]></title><description><![CDATA[Most customer emails are the same dozen situations again and again: late payments, delays, complaints, refunds. AI chat tools can draft them quickly, but…]]></description><link>https://ashishexcelnotes.hashnode.dev/10-fill-in-ai-prompts-for-writing-customer-emails-and-how-to-adapt-them</link><guid isPermaLink="true">https://ashishexcelnotes.hashnode.dev/10-fill-in-ai-prompts-for-writing-customer-emails-and-how-to-adapt-them</guid><category><![CDATA[AI]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[Small business]]></category><category><![CDATA[writing]]></category><dc:creator><![CDATA[Ashish Srivastava]]></dc:creator><pubDate>Tue, 20 Oct 2026 17:18:14 GMT</pubDate><content:encoded><![CDATA[<p>Most customer emails are the same dozen situations again and again: late payments, delays, complaints, refunds. AI chat tools can draft them quickly, but only if you give them the facts. A good habit is a <strong>fill-in-the-blank prompt</strong>: a fixed sentence with [brackets] for the details that change. Here are ten, plus how to adapt them.</p>
<h2>The 10 prompts</h2>
<p><strong>1. Polite payment reminder</strong></p>
<blockquote>
<p>Write a polite reminder to [client name] that invoice [number] for [amount] [currency] was due on [date]. Include payment details: [details]. Keep it under 100 words.</p>
</blockquote>
<p><strong>2. Firm second reminder</strong></p>
<blockquote>
<p>Write a firm but professional reminder for invoice [number], now [days] days overdue. Mention [late fee policy, if any] and ask the client to confirm a payment date.</p>
</blockquote>
<p><strong>3. Delay apology</strong></p>
<blockquote>
<p>Write an apology to [customer name] whose order [number] is delayed by [days] because [reason]. Give the new date [date] and offer [solution].</p>
</blockquote>
<p><strong>4. Complaint reply</strong></p>
<blockquote>
<p>Reply to this complaint: [paste it]. Acknowledge the problem, apologise for [specific issue], and explain what we'll do: [action] by [date]. Don't argue.</p>
</blockquote>
<p><strong>5. Refund confirmation</strong></p>
<blockquote>
<p>Write an email confirming a refund of [amount] [currency] for order [number], processed on [date], arriving in [time] via [method].</p>
</blockquote>
<p><strong>6. Quote follow-up</strong></p>
<blockquote>
<p>Write a short follow-up to [client] about the quote for [service] sent on [date]. Ask if they have questions and mention [availability or deadline].</p>
</blockquote>
<p><strong>7. Scope change</strong></p>
<blockquote>
<p>Write an email telling [client] that [request] is outside the agreed scope. It would cost [amount] [currency] or take [time]. Offer two options.</p>
</blockquote>
<p><strong>8. Out of stock</strong></p>
<blockquote>
<p>Tell [customer] that [product] is out of stock until [date]. Offer three choices: wait, switch to [alternative], or get a refund.</p>
</blockquote>
<p><strong>9. Saying no politely</strong></p>
<blockquote>
<p>Write a polite email declining [request] from [customer] because [reason]. Suggest [alternative].</p>
</blockquote>
<p><strong>10. Feedback request</strong></p>
<blockquote>
<p>Ask [customer] for feedback on [product/service] with three short questions: [q1], [q2], [q3]. Under 80 words.</p>
</blockquote>
<h2>How to adapt them</h2>
<p><strong>Put the facts in the brackets, not in your head.</strong> The AI tool only knows what you type. Amounts, dates and policies have to go in the prompt. Otherwise it will invent plausible-sounding ones, and you'll be the one sending them.</p>
<p><strong>Add a tone line.</strong> Add something like "Tone: warm, short, no exclamation marks" or "Tone: formal, British English". You can also paste two emails you've written before and add "match this voice".</p>
<p><strong>Set a length.</strong> "Under 100 words" gives you an email people actually read. Without a limit, drafts tend to run long.</p>
<p><strong>Ask for options, then choose.</strong> End the prompt with "Give me 3 versions: very short, standard, very polite." It's faster to pick one than to ask for rewrites.</p>
<p><strong>Keep the facts the same in every follow-up.</strong> If a reminder goes out three times, the amount, invoice number and due date should never change. Keep them in one place, like your invoice sheet, and paste them in each time.</p>
<p><strong>Read it before you send it.</strong> Check every number and date against your records. Remove any promise you can't keep, like a refund window or a delivery date. You're responsible for what goes out, not the tool.</p>
<h2>Make your own</h2>
<p>Every one of these prompts has the same shape:</p>
<blockquote>
<p>[Action] + [who it's for] + [the facts in brackets] + [what to include] + [limit or tone]</p>
</blockquote>
<p>Whenever you write the same kind of email for the third time, turn it into a prompt like this. Over a month you'll build a small library that covers most of your inbox.</p>
<p><em>I drafted this article with AI tools and edited it before publishing. The prompts are a fill-in-the-blank format, so results depend on the details you add and the tool you use.</em> If you want more, I've collected 124 prompts like these, for marketing, customer emails, operations and pricing, in a <a href="https://ashishsrivastavajay.gumroad.com/l/zuammf">Small Business AI Prompt Pack</a>. It comes as a PDF plus a searchable Excel (.xlsx) index and was made with AI tools.</p>
]]></content:encoded></item><item><title><![CDATA[A simple overdue-invoice aging formula for freelancers in Excel]]></title><description><![CDATA[If you freelance, you probably know roughly who owes you money but not exactly how late each payment is. An aging report fixes that. It groups unpaid…]]></description><link>https://ashishexcelnotes.hashnode.dev/a-simple-overdue-invoice-aging-formula-for-freelancers-in-excel</link><guid isPermaLink="true">https://ashishexcelnotes.hashnode.dev/a-simple-overdue-invoice-aging-formula-for-freelancers-in-excel</guid><category><![CDATA[excel]]></category><category><![CDATA[Freelancing]]></category><category><![CDATA[spreadsheets]]></category><category><![CDATA[Productivity]]></category><dc:creator><![CDATA[Ashish Srivastava]]></dc:creator><pubDate>Tue, 20 Oct 2026 17:17:04 GMT</pubDate><content:encoded><![CDATA[<p>If you freelance, you probably know roughly who owes you money but not exactly how late each payment is. An aging report fixes that. It groups unpaid amounts by how many days they're overdue: 0–30, 31–60, 61–90 and 90+. Here's how to build one in plain Excel with formulas that work in older versions too.</p>
<h2>The invoice table</h2>
<p>One row per invoice, starting in row 2:</p>
<table>
<thead>
<tr>
<th>Col</th>
<th>Field</th>
</tr>
</thead>
<tbody><tr>
<td>B</td>
<td>Invoice date</td>
</tr>
<tr>
<td>C</td>
<td>Client</td>
</tr>
<tr>
<td>J</td>
<td>Total</td>
</tr>
<tr>
<td>L</td>
<td>Due date</td>
</tr>
<tr>
<td>M</td>
<td>Amount received</td>
</tr>
<tr>
<td>O</td>
<td>Balance</td>
</tr>
<tr>
<td>Q</td>
<td>Days overdue</td>
</tr>
</tbody></table>
<p><strong>Due date (L2):</strong> invoice date plus payment terms. With terms in K2:</p>
<pre><code>=IF($B2="","",B2+K2)
</code></pre>
<p><strong>Balance (O2):</strong></p>
<pre><code>=IF($B2="","",J2-N(M2))
</code></pre>
<p><code>N()</code> turns an empty "received" cell into 0, so new invoices don't break.</p>
<p><strong>Days overdue (Q2):</strong></p>
<pre><code>=IF($B2="","",IF(AND(O2&gt;0,TODAY()&gt;L2),TODAY()-L2,0))
</code></pre>
<p>Paid invoices and invoices that aren't due yet both get 0. Only unpaid, past-due invoices count up.</p>
<p><strong>Status (P2)</strong>, which is handy for filtering:</p>
<pre><code>=IF($B2="","",IF(O2&lt;=0,"Paid",IF(TODAY()&gt;L2,"Overdue",IF(N(M2)&gt;0,"Part-paid","Open"))))
</code></pre>
<h3>Why every formula starts with <code>IF($B2="","",…)</code></h3>
<p>You'll fill the formulas down a few hundred rows in advance. Without the check, empty rows would show 0 or errors. With it, a row stays blank until you type a date.</p>
<h2>The aging summary</h2>
<p>On a second sheet, list each client in column A. For each bucket, add up the <strong>balance</strong> where the client matches and days overdue falls in the range:</p>
<pre><code>0–30:  =SUMIFS(Inv!$O:$O,Inv!$C:$C,$A2,Inv!$Q:$Q,"&gt;=0",Inv!$Q:$Q,"&lt;=30")
31–60: =SUMIFS(Inv!$O:$O,Inv!$C:$C,$A2,Inv!$Q:$Q,"&gt;=31",Inv!$Q:$Q,"&lt;=60")
61–90: =SUMIFS(Inv!$O:$O,Inv!$C:$C,$A2,Inv!$Q:$Q,"&gt;=61",Inv!$Q:$Q,"&lt;=90")
90+:   =SUMIFS(Inv!$O:$O,Inv!$C:$C,$A2,Inv!$Q:$Q,"&gt;=91")
</code></pre>
<p>The 0–30 bucket also includes invoices that aren't due yet, because their days overdue is 0. If you'd rather keep "not yet due" separate, add a column with <code>Inv!$Q:$Q,0</code> and <code>Inv!$P:$P,"Open"</code> as the criteria, and start the first overdue bucket at 1.</p>
<p><strong>Quick check:</strong> the four buckets should add up to the client's total balance. Put <code>=SUM(B2:E2)</code> next to <code>=SUMIFS(Inv!$O:$O,Inv!$C:$C,$A2)</code>. If the two numbers differ, a row has a negative balance (an overpayment) or a typo in a client name.</p>
<h2>If you bill in more than one currency</h2>
<p>Don't add USD and EUR together. Add a currency column to the invoice table and one more SUMIFS condition, <code>Inv!$F:$F,"USD"</code>. That gives you one aging table per currency. Converting currencies is a separate decision, made at your own rate on your own date.</p>
<h2>Common mistakes</h2>
<ol>
<li><strong>Client names typed differently</strong>, like "Acme Ltd" and "ACME Ltd.". Use a dropdown from a client list.</li>
<li><strong>Hard-coding today's date.</strong> <code>TODAY()</code> keeps the aging current every time you open the file.</li>
<li><strong>Overwriting the formula columns.</strong> Shade them grey so you know not to type in them.</li>
</ol>
<h2>What to do with it</h2>
<p>Sort clients by the 61–90 and 90+ columns. Those are this week's follow-up emails. The polite first reminder goes out at around 7 days overdue, and a firmer one at 30.</p>
<p><em>I drafted this article with AI tools and edited it before publishing. It's general spreadsheet guidance, not accounting or legal advice.</em> If you'd rather start from a ready-made version, with client and project sheets, a time log, monthly income and a printable invoice, I've put one together as an Excel (.xlsx) file: <a href="https://ashishsrivastavajay.gumroad.com/l/vcqscv">Freelancer Client &amp; Invoice Tracker</a>. It was made with AI tools.</p>
]]></content:encoded></item><item><title><![CDATA[How CGST/SGST vs IGST logic works in an Excel invoice template (with formulas)]]></title><description><![CDATA[Many small businesses in India still make invoices in Excel. The one thing most DIY sheets get wrong is the tax split. Within your own state, GST is split…]]></description><link>https://ashishexcelnotes.hashnode.dev/how-cgst-sgst-vs-igst-logic-works-in-an-excel-invoice-template-with-formulas</link><guid isPermaLink="true">https://ashishexcelnotes.hashnode.dev/how-cgst-sgst-vs-igst-logic-works-in-an-excel-invoice-template-with-formulas</guid><category><![CDATA[excel]]></category><category><![CDATA[spreadsheets]]></category><category><![CDATA[GST]]></category><category><![CDATA[Small business]]></category><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Ashish Srivastava]]></dc:creator><pubDate>Tue, 20 Oct 2026 16:51:34 GMT</pubDate><content:encoded><![CDATA[<p>Many small businesses in India still make invoices in Excel. The one thing most DIY sheets get wrong is the tax split. Within your own state, GST is split into <strong>CGST + SGST</strong>. Across states, it's a single <strong>IGST</strong>. Here's a simple way to make Excel decide that automatically, using plain formulas that work in older Excel versions too.</p>
<p><em>This is about spreadsheet logic, not tax advice. GST rates, place-of-supply rules and what an invoice must show depend on your situation, so check them with your CA.</em></p>
<h2>1. Store your state once</h2>
<p>Make a <strong>Settings</strong> sheet and type your state in one cell, say <code>Settings!B4</code> = <code>Maharashtra</code>. Every invoice formula points at this cell, so you never type it twice.</p>
<h2>2. Give every customer a state</h2>
<p>On a <strong>Customers</strong> sheet, use columns A = name, B = GSTIN, C = state. Use a data-validation dropdown for state, or keep a fixed list. The split works by comparing text, so <code>Maharashtra</code> and <code>Maharastra</code> count as different states.</p>
<h2>3. The invoice log</h2>
<p>On an <strong>Invoices</strong> sheet, one row per invoice: B = date, C = customer, E = taxable value, F = GST rate. Put the rates (0%, 5%, 12%, 18%, 28%) in a list you can edit and use it as a dropdown, so you can change them later without touching any formulas.</p>
<p><strong>Look up the customer's state (G2):</strong></p>
<pre><code>=IF($B2="","",IFERROR(INDEX(Customers!$C$2:$C$101,MATCH($C2,Customers!$A$2:$A$101,0)),"?"))
</code></pre>
<p><code>?</code> shows up if the customer isn't in the list, so the mistake is easy to spot.</p>
<p><strong>Decide the supply type (H2):</strong></p>
<pre><code>=IF($B2="","",IF(G2=Settings!$B$4,"Intra-state","Inter-state"))
</code></pre>
<p><strong>Split the tax (I2 = CGST, J2 = SGST, K2 = IGST):</strong></p>
<pre><code>I2: =IF($B2="","",IF(H2="Intra-state",ROUND(E2*F2/2,2),0))
J2: =IF($B2="","",I2)
K2: =IF($B2="","",IF(H2="Inter-state",ROUND(E2*F2,2),0))
</code></pre>
<p><strong>Total (L2):</strong> <code>=IF($B2="","",E2+I2+J2+K2)</code></p>
<p><strong>Quick check:</strong> ₹20,000 at 18% within your state comes to CGST ₹1,800 + SGST ₹1,800, a total of ₹23,600. The same sale to another state gives IGST ₹3,600, the same ₹23,600 total. If those two totals ever differ, a formula is wrong.</p>
<p>Rounding each half separately can, for some amounts, make CGST + SGST differ from IGST by a paisa. Decide with your CA how you want to round.</p>
<h2>4. Why every formula starts with <code>IF($B2="","",…)</code></h2>
<p>Fill the formulas down 500 rows ahead of time. If they aren't wrapped, empty rows show 0, <code>?</code> or errors, and your totals and charts get messy. Using the date cell as the "is this row in use?" check keeps unused rows truly blank.</p>
<h2>5. Bonus: the invoice log becomes a receivables tracker</h2>
<p>Add columns for <strong>due date</strong> (date + credit days), <strong>amount received</strong> and:</p>
<pre><code>Balance:      =IF($B2="","",L2-N(O2))
Days overdue: =IF($B2="","",IF(AND(P2&gt;0,TODAY()&gt;N2),TODAY()-N2,0))
</code></pre>
<p>Then a per-customer summary with <code>SUMIFS</code> on balance and days overdue gives you 0–30 / 31–60 / 61–90 / 90+ buckets. That's your follow-up list for the week.</p>
<h2>6. A print sheet from the same data</h2>
<p>Put an invoice number in one cell. Every field on a printable layout then becomes <code>INDEX(Invoices!col, MATCH(number, Invoices!A:A, 0))</code>. You keep one source of data and print any invoice from it.</p>
<h2>Common mistakes</h2>
<ul>
<li>Typing the state differently in different places. Use dropdowns.</li>
<li>Hard-coding 18% inside formulas. Keep rates in cells.</li>
<li>Mixing taxable value and total in the same column.</li>
</ul>
<p><em>I made this setup, and drafted this article, with AI tools, then reviewed it before publishing. It's Excel only and isn't tax or legal advice.</em> If you'd rather not build it yourself, I've put this GST invoice sheet, plus a payroll register and a shop stock tracker, into an <a href="https://ashishsrivastavajay.gumroad.com/l/lozujz/LAUNCH30">Excel Business Templates Bundle</a>. Code LAUNCH30 takes 30% off until 27 Oct.</p>
]]></content:encoded></item><item><title><![CDATA[How to See Your Best and Repeat Customers in a Spreadsheet]]></title><description><![CDATA[Total, order count, last order date and "gone quiet" flags per customer with SUMIFS, COUNTIFS and MAXIFS, plus a check that nothing was left out]]></description><link>https://ashishexcelnotes.hashnode.dev/best-repeat-customers-spreadsheet-sumifs-maxifs</link><guid isPermaLink="true">https://ashishexcelnotes.hashnode.dev/best-repeat-customers-spreadsheet-sumifs-maxifs</guid><category><![CDATA[excel]]></category><category><![CDATA[spreadsheets]]></category><category><![CDATA[google sheets]]></category><category><![CDATA[Small business]]></category><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Ashish Srivastava]]></dc:creator><pubDate>Tue, 20 Oct 2026 13:11:27 GMT</pubDate><content:encoded><![CDATA[<p><em>Written with AI assistance. The formulas below were checked in LibreOffice Calc on sample rows (not in Excel or Google Sheets).</em></p>
<p>An order list tells you what happened. A customer summary tells you <strong>who to call</strong>: the regular who hasn't ordered in two months, the one-time buyer worth a follow-up, and the three customers who make up most of your sales.</p>
<p>Here's a one-row-per-customer table built with plain formulas and no pivot table. MINIFS and MAXIFS need Excel 2019, Microsoft 365 or Google Sheets. Everything else works in any version.</p>
<h2>1. The order list and the customer list</h2>
<p>Orders from row 5: <strong>A Date</strong>, <strong>B Customer</strong>, <strong>C Amount</strong>. Put an <strong>As of</strong> date in B2 (<code>=TODAY()</code> works).</p>
<p>Then list each customer once in <strong>E5:E14</strong>, spelled exactly as in column B. To build that list quickly, copy column B and remove duplicates:</p>
<ul>
<li><strong>Excel:</strong> Data → Remove Duplicates</li>
<li><strong>Google Sheets:</strong> Data → Data cleanup → Remove duplicates</li>
</ul>
<h2>2. One row per customer</h2>
<table>
<thead>
<tr>
<th>Column</th>
<th>Formula (row 5)</th>
</tr>
</thead>
<tbody><tr>
<td>F: Total</td>
<td><code>=SUMIFS($C$5:$C$104,$B$5:$B$104,E5)</code></td>
</tr>
<tr>
<td>G: Orders</td>
<td><code>=COUNTIFS($B$5:$B$104,E5)</code></td>
</tr>
<tr>
<td>H: First order</td>
<td><code>=IF(G5=0,"",MINIFS($A$5:$A$104,$B$5:$B$104,E5))</code></td>
</tr>
<tr>
<td>I: Last order</td>
<td><code>=IF(G5=0,"",MAXIFS($A$5:$A$104,$B$5:$B$104,E5))</code></td>
</tr>
<tr>
<td>J: Days since last</td>
<td><code>=IF(G5=0,"",$B$2-I5)</code></td>
</tr>
</tbody></table>
<p>Format H and I as dates. The <code>IF(G5=0,"",…)</code> guard matters: without it, a customer with no orders shows a last-order date of 0 (shown as 1900 or 1899), and "days since" becomes a 46,000-day nonsense number.</p>
<h2>3. Label each customer (K5)</h2>
<pre><code>=IF(G5=0,"No orders",IF(G5=1,"One-time",IF(J5&gt;60,"Repeat, gone quiet","Repeat")))
</code></pre>
<p>Change 60 to whatever "quiet" means for your business. A café's regular is quiet after two weeks; a wholesale buyer might order once a quarter.</p>
<h2>4. Rank and share</h2>
<p>Rank by total (L5):</p>
<pre><code>=IF(G5=0,"",RANK(F5,$F$5:$F$14))
</code></pre>
<p>Share of all sales (M5, format as %):</p>
<pre><code>=IF($F$17=0,"",F5/$F$17)
</code></pre>
<p>F17 is the total of <strong>all orders</strong> (next section), not just the customers on your list. That way a missing customer makes the shares add up to less than 100% instead of quietly inflating everyone else's.</p>
<h2>5. Summary and the check</h2>
<table>
<thead>
<tr>
<th>Cell</th>
<th>Formula</th>
</tr>
</thead>
<tbody><tr>
<td>F16: Sum of customer totals</td>
<td><code>=SUM(F5:F14)</code></td>
</tr>
<tr>
<td>F17: All orders</td>
<td><code>=SUM($C$5:$C$104)</code></td>
</tr>
<tr>
<td>F18: Orders with a customer not in the list</td>
<td><code>=SUMPRODUCT(($B$5:$B$104&lt;&gt;"")*(COUNTIF($E$5:$E$14,$B$5:$B$104)=0))</code></td>
</tr>
<tr>
<td>F19: Check</td>
<td><code>=IF(ROUND(F16-F17,2)=0,"OK","CHECK")</code></td>
</tr>
<tr>
<td>F20: Repeat customers</td>
<td><code>=COUNTIF(K5:K14,"Repeat*")</code></td>
</tr>
<tr>
<td>F21: Customers with orders</td>
<td><code>=COUNTIF(G5:G14,"&gt;0")</code></td>
</tr>
<tr>
<td>F22: Repeat rate</td>
<td><code>=IF(F21=0,"",F20/F21)</code></td>
</tr>
</tbody></table>
<p>The <code>*</code> in <code>"Repeat*"</code> counts both "Repeat" and "Repeat, gone quiet".</p>
<p>F18 is the important one. A new customer who isn't on your list yet, or a name typed slightly differently, is simply missing from every per-customer number. In my sample, one order from a customer I hadn't added made the check say <strong>CHECK</strong> and F18 say 1. Add the name to the list and it goes back to <strong>OK</strong>.</p>
<h2>6. What the sample showed</h2>
<p>Twelve made-up orders, seven customers on the list (one with no orders yet), as of 20 Oct 2026:</p>
<table>
<thead>
<tr>
<th>Customer</th>
<th>Total</th>
<th>Orders</th>
<th>Days since last</th>
<th>Type</th>
<th>Rank</th>
</tr>
</thead>
<tbody><tr>
<td>Asha Traders</td>
<td>2,700</td>
<td>3</td>
<td>41</td>
<td>Repeat</td>
<td>1</td>
</tr>
<tr>
<td>Dutta Mart</td>
<td>2,500</td>
<td>2</td>
<td>8</td>
<td>Repeat</td>
<td>2</td>
</tr>
<tr>
<td>Bose &amp; Co</td>
<td>1,600</td>
<td>2</td>
<td>30</td>
<td>Repeat</td>
<td>3</td>
</tr>
<tr>
<td>Hari Mills</td>
<td>750</td>
<td>2</td>
<td>185</td>
<td>Repeat, gone quiet</td>
<td>4</td>
</tr>
<tr>
<td>Chandra Stores</td>
<td>450</td>
<td>1</td>
<td>97</td>
<td>One-time</td>
<td>5</td>
</tr>
<tr>
<td>Ezra Textiles</td>
<td>300</td>
<td>1</td>
<td>15</td>
<td>One-time</td>
<td>6</td>
</tr>
<tr>
<td>Faiz Stores</td>
<td>0</td>
<td>0</td>
<td>(blank)</td>
<td>No orders</td>
<td>(blank)</td>
</tr>
</tbody></table>
<p>Repeat rate: 4 of 6 customers with orders. The list total was 8,300 against 9,000 for all orders: the missing 700 was the unlisted customer, so the check said CHECK.</p>
<p>The useful line is Hari Mills: a repeat buyer, quiet for six months. That's the call to make this week.</p>
<h2>7. Test it before you trust it</h2>
<p>Add rows you know the answer to, then confirm:</p>
<ul>
<li>a customer on the list with no orders (should be "No orders", with no 1900 dates)</li>
<li>a repeat buyer whose last order is older than your "quiet" limit</li>
<li>one order from a name that isn't on the list (should trip the check)</li>
</ul>
<p>Then delete them.</p>
<hr />
<p><strong>Prefer a ready-made file?</strong> There's a free Order &amp; Payment Tracker (.xlsx workbook, no macros). You log each order once, and it works out what's still owed and whether it's overdue, by customer and in a one-page summary: <a href="https://ashishsrivastavajay.gumroad.com/l/free-order-payment-tracker">https://ashishsrivastavajay.gumroad.com/l/free-order-payment-tracker</a></p>
<p><strong>About me, and a disclosure:</strong> I'm Ashish, based in Kolkata, with 18+ years of work experience, and I write these tutorials and build my workbooks with AI assistance under my direction. The free tracker is mine.</p>
]]></content:encoded></item><item><title><![CDATA[How to Clean Amounts Pasted from a Bank or Payment Export]]></title><description><![CDATA[Commas, currency symbols, hidden spaces, (brackets) and Dr/Cr turned into real numbers, with a check against the statement total]]></description><link>https://ashishexcelnotes.hashnode.dev/clean-amounts-pasted-bank-payment-export</link><guid isPermaLink="true">https://ashishexcelnotes.hashnode.dev/clean-amounts-pasted-bank-payment-export</guid><category><![CDATA[excel]]></category><category><![CDATA[spreadsheets]]></category><category><![CDATA[google sheets]]></category><category><![CDATA[Small business]]></category><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Ashish Srivastava]]></dc:creator><pubDate>Tue, 20 Oct 2026 13:11:01 GMT</pubDate><content:encoded><![CDATA[<p><em>Written with AI assistance. The formulas below were checked in LibreOffice Calc on sample rows (not in Excel or Google Sheets).</em></p>
<p>You paste a statement or a payment-platform export into your sheet, and the SUM at the bottom is wrong. Or worse, it looks right. Usually some "numbers" aren't numbers at all: <code>1,250.00</code> arrived as text, a <code>₹</code> came along for the ride, there's an invisible non-breaking space, or a refund is written <code>(300)</code>. SUM skips text silently.</p>
<p>Here's a cleaning column, a signed-amount column, a flag column and one reconciliation check. It needs no macros and no Power Query.</p>
<h2>1. Layout</h2>
<p>Paste the export as it comes, starting at row 5:</p>
<table>
<thead>
<tr>
<th>Column</th>
<th>What goes in it</th>
</tr>
</thead>
<tbody><tr>
<td>A</td>
<td>Reference</td>
</tr>
<tr>
<td>B</td>
<td>Amount, as pasted</td>
</tr>
<tr>
<td>C</td>
<td>Dr / Cr (if your export has it)</td>
</tr>
<tr>
<td>D</td>
<td>Cleaned text (formula)</td>
</tr>
<tr>
<td>E</td>
<td>Amount (formula)</td>
</tr>
<tr>
<td>F</td>
<td>Signed amount (formula)</td>
</tr>
<tr>
<td>G</td>
<td>Flag (formula)</td>
</tr>
</tbody></table>
<p>Type the <strong>statement total</strong> from the bank or platform into <strong>B2</strong>.</p>
<h2>2. Strip the junk (D5)</h2>
<pre><code>=IF(B5="","",SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(B5,UNICHAR(160),"")," ",""),",",""),"₹",""),"$",""))
</code></pre>
<p>From the inside out, this removes:</p>
<ul>
<li>non-breaking spaces (<code>UNICHAR(160)</code>), which TRIM does <strong>not</strong> remove and which are common in web and PDF exports</li>
<li>ordinary spaces, so <code>1 100</code> becomes <code>1100</code></li>
<li>thousands commas</li>
<li>the ₹ and $ symbols</li>
</ul>
<p>Add another <code>SUBSTITUTE(…,"€","")</code> layer if you need it. UNICHAR needs Excel 2013 or later; Google Sheets has it too.</p>
<p>This assumes the export uses a <strong>dot</strong> for decimals. If yours writes <code>1.250,00</code>, swap the roles of the comma and dot first.</p>
<h2>3. Turn it into a number (E5)</h2>
<pre><code>=IF(D5="","",IFERROR(IF(LEFT(D5,1)="(",-VALUE(MID(D5,2,LEN(D5)-2)),VALUE(D5)),"Fix"))
</code></pre>
<ul>
<li><code>(300)</code> is accounting notation for minus 300, so a leading bracket becomes a negative number.</li>
<li>Anything VALUE still can't read shows the word <strong>Fix</strong>. It doesn't become a quiet zero. In my sample, <code>12O</code> (a letter O typed instead of a zero) landed here.</li>
</ul>
<p>Using IFERROR here is fine because it returns a <strong>visible label</strong> that's counted below. Hiding errors as 0 is the habit to avoid.</p>
<h2>4. Apply Dr / Cr (F5)</h2>
<pre><code>=IF(OR(E5="",E5="Fix"),"",IF(UPPER(TRIM(C5))="DR",-ABS(E5),E5))
</code></pre>
<p>Debits become negative, credits stay as they are. UPPER and TRIM mean <code>cr</code>, <code>Cr </code> and <code>CR</code> all count as the same thing. If your export has no Dr/Cr column, use <code>=E5</code> here instead.</p>
<h2>5. Flag what needs a human (G5)</h2>
<pre><code>=IF(B5="","",IF(E5="Fix","Fix amount",IF(OR(UPPER(TRIM(C5))="DR",UPPER(TRIM(C5))="CR"),"","Check Dr/Cr")))
</code></pre>
<p>(If you don't have a Dr/Cr column, keep only the "Fix amount" part.)</p>
<h2>6. Reconcile against the statement</h2>
<table>
<thead>
<tr>
<th>Cell</th>
<th>Formula</th>
</tr>
</thead>
<tbody><tr>
<td>Rows to fix (J5)</td>
<td><code>=COUNTIF($G$5:$G$104,"Fix amount")+COUNTIF($G$5:$G$104,"Check Dr/Cr")</code></td>
</tr>
<tr>
<td>Cleaned total (J6)</td>
<td><code>=SUM($F$5:$F$104)</code></td>
</tr>
<tr>
<td>Statement total (J7)</td>
<td><code>=$B$2</code></td>
</tr>
<tr>
<td>Difference (J8)</td>
<td><code>=ROUND(J6-J7,2)</code></td>
</tr>
<tr>
<td>Check (J9)</td>
<td><code>=IF(AND(J5=0,J8=0),"OK","CHECK")</code></td>
</tr>
</tbody></table>
<p>The check only says <strong>OK</strong> when every row is readable <strong>and</strong> your total matches the bank's to the paisa or cent. In my ten sample rows:</p>
<ul>
<li>1 row needed fixing (the <code>12O</code>)</li>
<li>the cleaned total was 5,370.50 against a typed statement total of 3,420.50, so the check said <strong>CHECK</strong></li>
</ul>
<p>That's what it should do. Both numbers in the sample are made up; the point is that a mismatch can't hide.</p>
<h2>7. Test it before you trust it</h2>
<p>Plant one of each, and confirm what you see:</p>
<table>
<thead>
<tr>
<th>Pasted value</th>
<th>Expected amount</th>
</tr>
</thead>
<tbody><tr>
<td><code>1,250.00</code></td>
<td>1250</td>
</tr>
<tr>
<td><code>₹2,000</code></td>
<td>2000</td>
</tr>
<tr>
<td><code>450.50</code> (non-breaking spaces)</td>
<td>450.5</td>
</tr>
<tr>
<td><code>(300)</code></td>
<td>-300</td>
</tr>
<tr>
<td><code>250</code> with Dr</td>
<td>-250</td>
</tr>
<tr>
<td><code>12O</code> (letter O)</td>
<td>Fix</td>
</tr>
<tr>
<td>a blank row</td>
<td>stays blank</td>
</tr>
</tbody></table>
<p>Then delete the planted rows. Next time, paste the new export into column B and the columns to the right do the rest.</p>
<hr />
<p><strong>Prefer a ready-made file?</strong> There's a free Order &amp; Payment Tracker (.xlsx workbook, no macros). You log each order once, and it works out what's still owed and whether it's overdue, by customer and in a one-page summary: <a href="https://ashishsrivastavajay.gumroad.com/l/free-order-payment-tracker">https://ashishsrivastavajay.gumroad.com/l/free-order-payment-tracker</a></p>
<p><strong>About me, and a disclosure:</strong> I'm Ashish, based in Kolkata, with 18+ years of work experience, and I write these tutorials and build my workbooks with AI assistance under my direction. The free tracker is mine.</p>
]]></content:encoded></item><item><title><![CDATA[How to Build a Monthly Sales Summary with SUMIFS (No Pivot Table)]]></title><description><![CDATA[Sales, orders, refunds, running total and month-on-month change from a plain order list, plus a check that catches dates typed as text]]></description><link>https://ashishexcelnotes.hashnode.dev/monthly-sales-summary-sumifs-no-pivot-table</link><guid isPermaLink="true">https://ashishexcelnotes.hashnode.dev/monthly-sales-summary-sumifs-no-pivot-table</guid><category><![CDATA[excel]]></category><category><![CDATA[spreadsheets]]></category><category><![CDATA[google sheets]]></category><category><![CDATA[Small business]]></category><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Ashish Srivastava]]></dc:creator><pubDate>Tue, 20 Oct 2026 13:10:41 GMT</pubDate><content:encoded><![CDATA[<p><em>Written with AI assistance. The formulas below were checked in LibreOffice Calc on sample rows (not in Excel or Google Sheets).</em></p>
<p>Pivot tables are great until you need the summary to sit in a fixed layout, update the moment a row is added, or be readable by someone who's never clicked "Refresh". A small SUMIFS table does the same job in plain formulas you can audit cell by cell.</p>
<p>Everything here uses standard functions available in both Excel and Google Sheets (SUMIFS, COUNTIFS, EDATE, SUM, SUMPRODUCT, ISNUMBER), with no macros.</p>
<h2>1. The order list</h2>
<p>One row per order, from row 5, columns A–D: <strong>Date</strong>, <strong>Product</strong>, <strong>Amount</strong>, <strong>Status</strong> (<code>Completed</code> or <code>Refunded</code>). Use a dropdown for Status so it's always spelled the same way.</p>
<h2>2. The month column</h2>
<p>In <strong>G5</strong>, type the first day of your first month, e.g. <code>1 Jan 2026</code>. Below it (G6, fill down for as many months as you need):</p>
<pre><code>=EDATE(G5,1)
</code></pre>
<p>EDATE adds whole months, so you always land on the 1st, even after February. Format the column as <code>mmm yyyy</code> so it reads "Jan 2026" while staying a real date underneath.</p>
<h2>3. Sales and orders per month</h2>
<p>Sales (H5, fill down):</p>
<pre><code>=SUMIFS($C$5:$C$204,$A$5:$A$204,"&gt;="&amp;G5,$A$5:$A$204,"&lt;"&amp;EDATE(G5,1),$D$5:$D$204,"Completed")
</code></pre>
<p>Orders (I5):</p>
<pre><code>=COUNTIFS($A$5:$A$204,"&gt;="&amp;G5,$A$5:$A$204,"&lt;"&amp;EDATE(G5,1),$D$5:$D$204,"Completed")
</code></pre>
<p>The window is "on or after the 1st, and <strong>before</strong> the 1st of next month". That's why 31 January counts in January and 1 February counts in February. It also stays right if your dates ever carry a time of day, which a <code>&lt;=</code> end-of-month test would get wrong.</p>
<h2>4. Average order, refunds, running total, change</h2>
<table>
<thead>
<tr>
<th>Column</th>
<th>Formula (row 5)</th>
<th>Note</th>
</tr>
</thead>
<tbody><tr>
<td>J: Avg order</td>
<td><code>=IF(I5=0,"",H5/I5)</code></td>
<td>blank instead of #DIV/0! in an empty month</td>
</tr>
<tr>
<td>K: Refunds</td>
<td>same as Sales, with <code>"Refunded"</code> instead of <code>"Completed"</code></td>
<td>kept separate, so sales stay sales</td>
</tr>
<tr>
<td>L: Running total</td>
<td><code>=SUM($H$5:H5)</code></td>
<td>the locked start makes it grow as you fill down</td>
</tr>
<tr>
<td>M: vs last month (from row 6)</td>
<td><code>=IF(H5=0,"",H6/H5-1)</code></td>
<td>format as %; blank when last month was zero</td>
</tr>
</tbody></table>
<h2>5. The check cells (the part pivot tables don't give you)</h2>
<p>All completed sales in the list (H12):</p>
<pre><code>=SUMIFS($C$5:$C$204,$D$5:$D$204,"Completed")
</code></pre>
<p>Check (H13):</p>
<pre><code>=IF(ROUND(SUM(H5:H10)-H12,2)=0,"OK","CHECK")
</code></pre>
<p>If the months don't add up to the whole list, some sales fell outside every month. There are two usual reasons, so count both:</p>
<p>Dates typed as text (H14). These look like dates but no date test can match them:</p>
<pre><code>=SUMPRODUCT(($A$5:$A$204&lt;&gt;"")*NOT(ISNUMBER($A$5:$A$204)))
</code></pre>
<p>Dates outside your months (H15):</p>
<pre><code>=COUNTIFS($A$5:$A$204,"&lt;"&amp;G5)+COUNTIFS($A$5:$A$204,"&gt;="&amp;EDATE(G10,1))
</code></pre>
<p>In my sample list I planted one of each: a date pasted as the text <code>2026-03-15</code>, and an order dated 1 July in a January–June summary. The check showed <strong>CHECK</strong>, and each counter showed 1. Retype the text date as a real date and extend the months, and it goes back to <strong>OK</strong>.</p>
<h2>6. What the sample came out as</h2>
<p>Fourteen made-up orders, Jan–Jun 2026:</p>
<table>
<thead>
<tr>
<th>Month</th>
<th>Sales</th>
<th>Orders</th>
<th>Avg</th>
<th>Refunds</th>
<th>Running</th>
</tr>
</thead>
<tbody><tr>
<td>Jan</td>
<td>66</td>
<td>2</td>
<td>33</td>
<td>0</td>
<td>66</td>
</tr>
<tr>
<td>Feb</td>
<td>66</td>
<td>2</td>
<td>33</td>
<td>27</td>
<td>132</td>
</tr>
<tr>
<td>Mar</td>
<td>66</td>
<td>2</td>
<td>33</td>
<td>0</td>
<td>198</td>
</tr>
<tr>
<td>Apr</td>
<td>93</td>
<td>3</td>
<td>31</td>
<td>0</td>
<td>291</td>
</tr>
<tr>
<td>May</td>
<td>0</td>
<td>0</td>
<td>(blank)</td>
<td>0</td>
<td>291</td>
</tr>
<tr>
<td>Jun</td>
<td>39</td>
<td>1</td>
<td>39</td>
<td>27</td>
<td>330</td>
</tr>
</tbody></table>
<p>March shows only 2 orders because the text-date order on 15 March was skipped, which is exactly what the check cell is there to catch. These are demo numbers, not anyone's real sales.</p>
<h2>7. Test it before you trust it</h2>
<p>Add rows you know the answer for, and confirm each lands where it should:</p>
<ul>
<li>the last day of a month and the first day of the next</li>
<li>a refunded order (goes to Refunds, not Sales)</li>
<li>a month with no orders (shows 0 and a blank average, not an error)</li>
<li>one date typed as text, which should trip the check</li>
</ul>
<p>Then delete them and use it with real data.</p>
<hr />
<p><strong>Prefer a ready-made file?</strong> There's a free Order &amp; Payment Tracker (.xlsx workbook, no macros). You log each order once, and it works out what's still owed and whether it's overdue, by customer and in a one-page summary: <a href="https://ashishsrivastavajay.gumroad.com/l/free-order-payment-tracker">https://ashishsrivastavajay.gumroad.com/l/free-order-payment-tracker</a></p>
<p><strong>About me, and a disclosure:</strong> I'm Ashish, based in Kolkata, with 18+ years of work experience, and I write these tutorials and build my workbooks with AI assistance under my direction. The free tracker is mine.</p>
]]></content:encoded></item><item><title><![CDATA[How to Catch Duplicate Orders and Misspelled Customer Names in a Spreadsheet]]></title><description><![CDATA[TRIM, COUNTIF and a dropdown list: three checks that stop one typo from splitting a customer's totals]]></description><link>https://ashishexcelnotes.hashnode.dev/catch-duplicate-orders-misspelled-names-spreadsheet</link><guid isPermaLink="true">https://ashishexcelnotes.hashnode.dev/catch-duplicate-orders-misspelled-names-spreadsheet</guid><category><![CDATA[excel]]></category><category><![CDATA[spreadsheets]]></category><category><![CDATA[google sheets]]></category><category><![CDATA[Small business]]></category><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Ashish Srivastava]]></dc:creator><pubDate>Tue, 20 Oct 2026 13:10:18 GMT</pubDate><content:encoded><![CDATA[<p><em>Written with AI assistance. The formulas below were checked in LibreOffice Calc on sample rows (not in Excel or Google Sheets).</em></p>
<p>Most wrong spreadsheet totals aren't formula bugs. They're data bugs: the same order typed twice, "Asha Traders" in one row and "Asha Trader" in the next, or a stray space at the end of a name. Your per-customer totals then quietly split in two, and nothing turns red.</p>
<p>Here are three checks you can add to any order list. They use only standard functions that exist in both Excel and Google Sheets (TRIM, COUNTIF, SUMPRODUCT, IF), with no macros.</p>
<h2>1. The order list</h2>
<p>One row per order, starting at row 5:</p>
<table>
<thead>
<tr>
<th>Column</th>
<th>What goes in it</th>
</tr>
</thead>
<tbody><tr>
<td>A</td>
<td>Order ID</td>
</tr>
<tr>
<td>B</td>
<td>Order date</td>
</tr>
<tr>
<td>C</td>
<td>Customer (as typed)</td>
</tr>
<tr>
<td>D</td>
<td>Amount</td>
</tr>
<tr>
<td>E</td>
<td>Customer, cleaned (formula)</td>
</tr>
<tr>
<td>F</td>
<td>Repeat ID (formula)</td>
</tr>
<tr>
<td>G</td>
<td>Order key (formula)</td>
</tr>
<tr>
<td>H</td>
<td>Possible duplicate (formula)</td>
</tr>
<tr>
<td>I</td>
<td>Name check (formula)</td>
</tr>
</tbody></table>
<p>Put your list of real customer names in <strong>K5:K20</strong>, spelled once, correctly.</p>
<h2>2. Clean the name: TRIM</h2>
<pre><code>=IF(A5="","",TRIM(C5))
</code></pre>
<p>TRIM removes spaces at the start and end and squeezes double spaces in the middle down to one. So <code>"  Chandra Stores "</code> becomes <code>"Chandra Stores"</code> and <code>"Bose  &amp; Co"</code> becomes <code>"Bose &amp; Co"</code>. Point every total or lookup at column E, never at the raw column C.</p>
<h2>3. Same order ID twice</h2>
<pre><code>=IF(A5="","",IF(COUNTIF($A$5:A5,A5)&gt;1,"Repeat ID",""))
</code></pre>
<p>The trick is the range <code>$A$5:A5</code>: the start is locked and the end grows as you fill down. Each row counts only the rows <strong>above and including itself</strong>, so the first ORD-202 stays clean and only the second one is flagged. You know which row to look at, instead of both rows lighting up.</p>
<h2>4. Same order typed twice under different IDs</h2>
<p>Sometimes the ID is different but it's clearly the same order: same customer, same day, same amount. Build a key (G5):</p>
<pre><code>=IF(A5="","",E5&amp;"|"&amp;B5&amp;"|"&amp;D5)
</code></pre>
<p>The date joins as its underlying number (e.g. 46266), which is fine for matching. Then flag the repeat (H5):</p>
<pre><code>=IF(A5="","",IF(SUMPRODUCT(--($G$5:G5=G5))&gt;1,"Possible duplicate",""))
</code></pre>
<p>Why SUMPRODUCT instead of COUNTIF here? COUNTIF treats <code>*</code> and <code>?</code> in the text as wildcards, and long text can trip it up. A plain <code>=</code> comparison avoids both. It's also case-insensitive, so <code>asha traders</code> and <code>Asha Traders</code> with the same date and amount get flagged.</p>
<p>It says <em>possible</em> on purpose. Two genuine orders can match, so treat the flag as "look at this", not "delete this". Same customer and same day but a different amount is <strong>not</strong> flagged.</p>
<h2>5. Names that aren't on your list</h2>
<pre><code>=IF(A5="","",IF(COUNTIF($K$5:$K$20,E5)=0,"Not in list",""))
</code></pre>
<p>This catches "Asha Trader" (missing s) before it becomes a separate customer in your totals.</p>
<p>Better still, stop typos at the door with a dropdown on column C:</p>
<ul>
<li><strong>Excel:</strong> select the column → <strong>Data → Data Validation → Allow: List</strong> → Source <code>=$K$5:$K$20</code>.</li>
<li><strong>Google Sheets:</strong> select the column → <strong>Data → Data validation → Add rule → Dropdown (from a range)</strong> → <code>K5:K20</code>.</li>
</ul>
<p>Keep the "Not in list" check anyway. It catches anything pasted in, and rows typed before the dropdown existed.</p>
<h2>6. A small summary and one check cell</h2>
<table>
<thead>
<tr>
<th>Cell</th>
<th>Formula</th>
</tr>
</thead>
<tbody><tr>
<td>Repeat IDs</td>
<td><code>=COUNTIF($F$5:$F$104,"Repeat ID")</code></td>
</tr>
<tr>
<td>Possible duplicates</td>
<td><code>=COUNTIF($H$5:$H$104,"Possible duplicate")</code></td>
</tr>
<tr>
<td>Names not in list</td>
<td><code>=COUNTIF($I$5:$I$104,"Not in list")</code></td>
</tr>
<tr>
<td>Total, all rows</td>
<td><code>=SUM($D$5:$D$104)</code></td>
</tr>
<tr>
<td>Total, flagged rows left out</td>
<td><code>=SUMPRODUCT($D$5:$D$104*($F$5:$F$104="")*($H$5:$H$104=""))</code></td>
</tr>
<tr>
<td>Check (N10)</td>
<td><code>=IF(N5+N6+N7=0,"OK","CHECK")</code></td>
</tr>
</tbody></table>
<p>(N5, N6 and N7 are the first three cells.) The two totals side by side show how much money is sitting in suspicious rows.</p>
<p>On my ten sample orders, each check caught exactly the row it should:</p>
<ul>
<li>Repeat IDs: 1</li>
<li>Possible duplicates: 1</li>
<li>Names not in list: 1</li>
<li>Total of all rows: 6,950; with the flagged rows left out: 5,450</li>
<li>The check cell showed <strong>CHECK</strong></li>
</ul>
<p>Your numbers will differ. What matters is that each planted problem gets caught and nothing else does.</p>
<h2>7. Test it with planted mistakes</h2>
<p>Before trusting it, add rows you <em>know</em> are wrong and confirm each gets flagged:</p>
<table>
<thead>
<tr>
<th>Planted row</th>
<th>Expected</th>
</tr>
</thead>
<tbody><tr>
<td>Name with extra spaces</td>
<td>cleaned, no flag</td>
</tr>
<tr>
<td>Same order ID twice</td>
<td>second one: Repeat ID</td>
</tr>
<tr>
<td>Same customer, date and amount, different capitals</td>
<td>second one: Possible duplicate</td>
</tr>
<tr>
<td>Same customer and date, different amount</td>
<td>no flag</td>
</tr>
<tr>
<td>Misspelled customer</td>
<td>Not in list</td>
</tr>
<tr>
<td>Completely blank row</td>
<td>stays blank</td>
</tr>
</tbody></table>
<p>Then delete the planted rows and fill the formulas down 100 rows in advance.</p>
<hr />
<p><strong>Prefer a ready-made file?</strong> There's a free Order &amp; Payment Tracker (.xlsx workbook, no macros). You log each order once, and it works out what's still owed and whether it's overdue, by customer and in a one-page summary: <a href="https://ashishsrivastavajay.gumroad.com/l/free-order-payment-tracker">https://ashishsrivastavajay.gumroad.com/l/free-order-payment-tracker</a></p>
<p><strong>About me, and a disclosure:</strong> I'm Ashish, based in Kolkata, with 18+ years of work experience, and I write these tutorials and build my workbooks with AI assistance under my direction. The free tracker is mine.</p>
]]></content:encoded></item><item><title><![CDATA[How to Sort Unpaid Invoices into Overdue Groups in a Spreadsheet]]></title><description><![CDATA[Days overdue, 30/60/90-day buckets and a check cell, with plain formulas you can audit]]></description><link>https://ashishexcelnotes.hashnode.dev/sort-unpaid-invoices-overdue-groups-spreadsheet</link><guid isPermaLink="true">https://ashishexcelnotes.hashnode.dev/sort-unpaid-invoices-overdue-groups-spreadsheet</guid><category><![CDATA[excel]]></category><category><![CDATA[spreadsheets]]></category><category><![CDATA[Small business]]></category><category><![CDATA[accounting]]></category><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Ashish Srivastava]]></dc:creator><pubDate>Tue, 20 Oct 2026 13:00:03 GMT</pubDate><content:encoded><![CDATA[<p><em>Written with AI assistance. The formulas below were checked in LibreOffice Calc on sample rows.</em></p>
<p>"Who owes me money?" is the easy question. The useful one is <strong>"how late is it?"</strong> An invoice that's 5 days late needs a friendly reminder. One that's 75 days late needs a phone call today. Grouping unpaid invoices by how overdue they are (accountants call this an <em>aging</em> report) tells you where to spend your Monday morning.</p>
<p>Here's how to build one with four columns of formulas, a five-row summary and one check cell. It uses only standard functions (IF, OR, MAX, SUMIFS, COUNTIFS, SUMIF, COUNTIF, ROUND), with no macros and no newer dynamic-array functions.</p>
<h2>1. The invoice list</h2>
<p>One row per invoice, starting at row 5. Put an <strong>As of</strong> date in <strong>B2</strong>: either type a date, or use <code>=TODAY()</code> if you always want "now".</p>
<table>
<thead>
<tr>
<th>Column</th>
<th>What goes in it</th>
</tr>
</thead>
<tbody><tr>
<td>A</td>
<td>Invoice number</td>
</tr>
<tr>
<td>B</td>
<td>Customer</td>
</tr>
<tr>
<td>C</td>
<td>Invoice date</td>
</tr>
<tr>
<td>D</td>
<td>Due date</td>
</tr>
<tr>
<td>E</td>
<td>Amount</td>
</tr>
<tr>
<td>F</td>
<td>Paid so far</td>
</tr>
<tr>
<td>G</td>
<td>Balance (formula)</td>
</tr>
<tr>
<td>H</td>
<td>Days overdue (formula)</td>
</tr>
<tr>
<td>I</td>
<td>Group (formula)</td>
</tr>
</tbody></table>
<p>Type in A–F. G, H and I are formulas you fill down.</p>
<h2>2. Balance</h2>
<pre><code class="language-plaintext">=IF(A5="","",E5-F5)
</code></pre>
<p>The <code>IF(A5="","",…)</code> wrapper keeps empty rows empty, so you can fill the formulas down 100 rows in advance.</p>
<h2>3. Days overdue</h2>
<pre><code class="language-plaintext">=IF(A5="","",IF(OR(G5&lt;=0,D5=""),"",MAX(0,$B$2-D5)))
</code></pre>
<ul>
<li><p>A paid invoice (balance 0 or less) gets no number at all.</p>
</li>
<li><p>A missing due date also gets no number. Without that guard, the as-of date minus an empty cell is a huge number, and the invoice would land in "90+".</p>
</li>
<li><p><code>MAX(0, …)</code> turns "due in 5 days" into 0 instead of −5.</p>
</li>
</ul>
<h2>4. The group</h2>
<pre><code class="language-plaintext">=IF(A5="","",IF(G5&lt;=0,"Paid",IF(D5="","Add due date",IF(H5=0,"Not due",IF(H5&lt;=30,"1-30",IF(H5&lt;=60,"31-60",IF(H5&lt;=90,"61-90","90+")))))))
</code></pre>
<p>Read it left to right: paid → missing due date → not due yet → 1–30 → 31–60 → 61–90 → over 90. Watch the boundaries. An invoice due <strong>today</strong> is 0 days overdue, so it's "Not due". Day 30 is still "1-30"; day 31 is "31-60".</p>
<p>I use plain hyphens ("1-30") rather than dashes, because the summary looks these labels up by exact text, and a typed hyphen is easier to match.</p>
<h2>5. The summary</h2>
<p>In K5:K9, type the five labels exactly as the formula writes them: <code>Not due</code>, <code>1-30</code>, <code>31-60</code>, <code>61-90</code>, <code>90+</code>. Next to them:</p>
<p>Amount owed in each group (L5, fill down):</p>
<pre><code class="language-plaintext">=SUMIFS($G$5:$G$104,$I$5:$I$104,K5)
</code></pre>
<p>Number of invoices in each group (M5, fill down):</p>
<pre><code class="language-plaintext">=COUNTIFS($I$5:$I$104,K5)
</code></pre>
<p>Total owed (L10). Only positive balances, so an overpayment doesn't cancel out a real debt:</p>
<pre><code class="language-plaintext">=SUMIF($G$5:$G$104,"&gt;0")
</code></pre>
<p>Overdue only, 1+ days (L11):</p>
<pre><code class="language-plaintext">=SUM(L6:L9)
</code></pre>
<p>Oldest overdue, in days (L13):</p>
<pre><code class="language-plaintext">=MAX(H5:H104)
</code></pre>
<h2>6. The check cell (don't skip this)</h2>
<pre><code class="language-plaintext">=IF(ROUND(SUM(L5:L9)-L10,2)=0,"OK","CHECK")
</code></pre>
<p>If the groups don't add up to the total owed, something has slipped through. In my sample data it showed <strong>CHECK</strong> for exactly the right reason: an invoice with no due date isn't in any of the five groups. A count makes that visible (L14):</p>
<pre><code class="language-plaintext">=COUNTIF($I$5:$I$104,"Add due date")
</code></pre>
<p>Fill in the due date and the check goes back to <strong>OK</strong>.</p>
<h2>7. Test it with awkward rows</h2>
<p>Before you trust the totals, add these sample rows and confirm each lands where you expect:</p>
<table>
<thead>
<tr>
<th>Test row</th>
<th>Expected group</th>
</tr>
</thead>
<tbody><tr>
<td>Paid in full</td>
<td>Paid (no days shown)</td>
</tr>
<tr>
<td>Part-paid, due in 5 days</td>
<td>Not due</td>
</tr>
<tr>
<td>Due today, unpaid</td>
<td>Not due (0 days)</td>
</tr>
<tr>
<td>1, 30, 31, 60, 61, 90 and 91 days late</td>
<td>1-30, 1-30, 31-60, 31-60, 61-90, 61-90, 90+</td>
</tr>
<tr>
<td>Paid more than invoiced</td>
<td>Paid; the negative balance stays out of the total</td>
</tr>
<tr>
<td>No due date</td>
<td>Add due date (and the check cell shows CHECK)</td>
</tr>
<tr>
<td>A completely blank row</td>
<td>stays blank</td>
</tr>
</tbody></table>
<p>With twelve sample invoices (as of 15 Oct 2026), my groups came out as: Not due 10,000 (2 invoices), 1-30 9,500 (2), 31-60 8,000 (2), 61-90 11,500 (2), 90+ 1,500 (1). The total owed was 42,500 across 10 invoices, including the one with no due date, so the check cell said CHECK until it was fixed. Your numbers will differ; what matters is that every row lands where you expected.</p>
<h2>8. Using it every week</h2>
<ul>
<li><p>Update <strong>Paid so far</strong> the day money arrives, so the balance is always true.</p>
</li>
<li><p>Monday: sort or filter by <strong>Group</strong>, oldest first, and chase on a rhythm (a reminder at 1–30, a call at 31–60, a firm plan beyond that).</p>
</li>
<li><p>Credits and overpayments show as negative balances in the Paid group. Settle them with the customer rather than letting them hide.</p>
</li>
</ul>
<p>This is a tracking method, not accounting or tax advice. Your accountant or CA may want aging done differently for your books.</p>
<hr />
<p><strong>Prefer a ready-made file?</strong> There's a free Order &amp; Payment Tracker (.xlsx workbook, no macros). It logs orders and payments, works out what's still owed and whether it's overdue, and rolls it up by customer and into a one-page summary with aging: <a href="https://ashishsrivastavajay.gumroad.com/l/free-order-payment-tracker">https://ashishsrivastavajay.gumroad.com/l/free-order-payment-tracker</a></p>
<p><strong>About me, and a disclosure:</strong> I'm Ashish, based in Kolkata, with 18+ years of work experience, and I write these tutorials and build my workbooks with AI assistance under my direction. The free tracker is mine.</p>
]]></content:encoded></item><item><title><![CDATA[How to Track Sales in USD, GBP and EUR in One Spreadsheet]]></title><description><![CDATA[A rates table, one conversion formula, and the three mistakes that quietly break your totals]]></description><link>https://ashishexcelnotes.hashnode.dev/track-sales-usd-gbp-eur-one-spreadsheet</link><guid isPermaLink="true">https://ashishexcelnotes.hashnode.dev/track-sales-usd-gbp-eur-one-spreadsheet</guid><category><![CDATA[excel]]></category><category><![CDATA[spreadsheets]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[Small business]]></category><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Ashish Srivastava]]></dc:creator><pubDate>Thu, 15 Oct 2026 16:07:03 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ad04db8ee1e5895425224c4/472dc953-66ba-493d-a4c9-ee59c813ff6f.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>This story was written with the assistance of an AI writing program. I edited it, and I checked every formula in it on sample rows before publishing.</em></p>
<p>I have 18+ years of work experience, and I build spreadsheets for small businesses with Excel, VBA, Power Query, Power BI, Google Sheets and Apps Script. A very common mess is a seller who gets paid in several currencies and has a sheet that simply adds the numbers up. $45 plus £15 plus €25 isn't 85 of anything.</p>
<p>Here's a small structure that fixes it. It takes about 20 minutes to set up.</p>
<h2>1. A rates table you control</h2>
<p>Create a tab called <strong>Rates</strong>. Put the currency codes in A2:A4 (USD, GBP, EUR) and, in B2:B4, how many US dollars one unit of each is worth: 1 for USD, roughly 1.32 for GBP, roughly 1.12 for EUR. Add a "last updated" date and write down where the rates came from, for example the European Central Bank's euro reference rates.</p>
<p>Update it on a fixed day each week. Live rates are possible (GOOGLEFINANCE in Google Sheets, STOCKHISTORY in Excel 365), but they make last month's totals change every time you open the file. For tracking, a fixed weekly rate is usually clearer. For accounting, use whatever rates your accountant tells you to.</p>
<h2>2. A base-currency dropdown</h2>
<p>On a <strong>Dashboard</strong> tab, pick a cell for your base currency (I use B3). Then Data → Data validation → List, and enter <code>USD,GBP,EUR</code>. That one cell decides which currency every total is shown in.</p>
<h2>3. One conversion formula per row</h2>
<p>In your sales log, put the amount in column E and the currency in column F (give F the same dropdown). The converted value goes in column G:</p>
<pre><code class="language-plaintext">=IF(E4="","",E4*XLOOKUP(F4,Rates!$A$2:$A$4,Rates!$B$2:$B$4)/XLOOKUP(Dashboard!$B$3,Rates!$A$2:$A$4,Rates!$B$2:$B$4))
</code></pre>
<p>Read it as: convert the amount into US dollars, then from US dollars into the base currency. The <code>IF(E4="","",…)</code> part keeps empty rows empty.</p>
<p>XLOOKUP needs Excel 2021, Microsoft 365 or Google Sheets. On older Excel, use INDEX/MATCH:</p>
<pre><code class="language-plaintext">=IF(E4="","",E4*INDEX(Rates!$B$2:$B$4,MATCH(F4,Rates!$A$2:$A$4,0))/INDEX(Rates!$B$2:$B$4,MATCH(Dashboard!$B$3,Rates!$A$2:$A$4,0)))
</code></pre>
<h2>4. Totals that respect the month</h2>
<p>The all-time total is just <code>=SUM(G4:G500)</code>. This month only, with dates in column A:</p>
<pre><code class="language-plaintext">=SUMIFS(G4:G500,A4:A500,"&gt;="&amp;EOMONTH(TODAY(),-1)+1,A4:A500,"&lt;="&amp;EOMONTH(TODAY(),0))
</code></pre>
<p>Switch the dropdown from USD to GBP and every figure recalculates.</p>
<h2>The three mistakes that break it</h2>
<p><strong>1. Free-typed currency codes.</strong> "Eur " with a trailing space isn't "EUR". Without any error handling, that row shows #N/A and so does your total, which is annoying but at least visible. The real trap is wrapping the lookup in IFERROR to make the errors go away. Then the bad row quietly uses a fallback rate and your total is wrong with no warning. My own workbook wraps its lookups in IFERROR, which is exactly why every currency cell in it is a dropdown: the typo can't get in. The fix is the dropdown, not IFERROR.</p>
<p><strong>2. Counting the header row.</strong> A COUNTA over a whole column says you made one more sale than you did. Start every range at the first data row.</p>
<p><strong>3. Overwriting the original amount.</strong> Always keep the amount and currency exactly as you were paid, and convert in a separate column. When a rate changes, or your accountant asks, you can always recalculate.</p>
<h2>Test it before you trust it</h2>
<p>Add three fake rows: a blank row, a row with a mistyped currency, and a refund entered as a negative amount. The blank row should stay blank, the typo should be impossible because of the dropdown (or show up as an error), and the refund should reduce the total. If all three behave, you can trust the sheet with real numbers. Then delete the test rows.</p>
<hr />
<p><strong>Start free:</strong> if your bigger headache is "who still owes me money?", there's a free Order &amp; Payment Tracker (.xlsx workbook, no macros) with orders, customers, aging buckets and the AI prompts used to build it: <a href="https://ashishsrivastavajay.gumroad.com/l/free-order-payment-tracker">https://ashishsrivastavajay.gumroad.com/l/free-order-payment-tracker</a></p>
<p><strong>About me, and a disclosure:</strong> I'm Ashish, an Excel/Power BI developer with 18+ years of work experience, and I build these systems with AI assistance under my direction. I also sell a ready-made multi-currency version of this setup as an Excel workbook, with expense tracking, goals and a product catalog: the Passive Income Command Center ($27). Despite the name, it's a tracking tool. It doesn't generate income or promise any, and it isn't financial or tax advice. Everything in this article works without it. Link: <a href="https://ashishsrivastavajay.gumroad.com/l/hytkwb">https://ashishsrivastavajay.gumroad.com/l/hytkwb</a></p>
]]></content:encoded></item></channel></rss>