Category: Uncategorized

  • How to Track Inventory in Google Sheets

    To track inventory in Google Sheets, use three tabs instead of one list of quantities. An Items tab describes what you stock and when to reorder it. A Movements tab records every receipt, sale, loss, and count correction as a new row. A Stock tab calculates what’s on hand from those movements, and flags anything at or below its reorder point. Nobody types a quantity into the Stock tab, so as long as people add rows and corrections instead of changing old ones, the history stays intact.

    Why One “Quantity on Hand” Column Fails

    The common first attempt is a list of products with a quantity column that people update by hand. It works for a few weeks, then breaks in predictable ways:

    • You can’t tell what happened. If a count drops from 12 to 8, the sheet doesn’t say who took the four, when, or whether they were sold, spoiled, or lost.
    • Formulas and formatting get overwritten. Anyone typing in the wrong cell can wipe out a calculation without noticing.
    • You can’t see usage. Without dated movements, you can’t work out how fast something sells or when you’ll run out.

    The fix is to keep two kinds of records apart. Master records describe things that change rarely, such as the item list and supplier lead times. Transaction records log events as they happen. The balance is always calculated from the transactions, never typed.

    The Three Tabs at a Glance

    TabWhat it holdsWho types in it
    ItemsOne row per product: cost, supplier, usage, lead time, reorder pointYou, when products change
    MovementsOne row per stock eventWhoever receives, sells, or counts stock
    StockCalculated balances and reorder flagsNobody (formulas only)

    If you’d rather start from a working version, copy the inventory template. It has the three tabs, the formulas, the dropdowns, and the reorder flag already built, with made-up example data and room for 199 items. Before you use it, follow “Clear the Example Data Before You Start” below. The rest of this article explains how each part works so you can build it or adapt it.

    Tab 1: Items

    Make a tab named Items with these columns in row 1:

    ColumnHeaderWhat goes in it
    ASKUA short unique code, such as PKG-001. Never reuse one.
    BItemThe plain-English name
    CCategoryPackaging, supplies, finished goods
    DUnitThe one base unit you count, buy, and use this item in: each, roll, kilogram
    EUnit costWhat you last paid per base unit
    FSupplierWho you buy it from
    GAverage daily useHow many base units you use or sell per day, as an estimate to start
    HLead time (days)Days from placing an order to having it in hand
    ISafety stock (days)Extra days of use to cover late deliveries and busy spells
    JReorder pointCalculated, see below

    The reorder point

    A reorder point is the stock level at which you should place an order. A common way to set it is to cover the use during the supplier’s lead time, plus a safety buffer:

    Reorder point = average daily use × (lead time + safety days)

    In the sheet, with row 2 as the first item, cell J2 holds:

    =IF(A2="","",G2*(H2+I2))

    Copy it down the column, as far as you expect to have items (the template does this to row 200). The IF leaves the cell blank for empty rows.

    Pick one base unit per SKU and use it everywhere: in every movement, in daily use, and in unit cost. If you buy mailer boxes by the case of 12 but use them one at a time, log a delivery of one case as 12 each and divide the case price by 12 for the unit cost. Mixing cases and pieces in the same item quietly corrupts the balance, the value, and the reorder point.

    Here is a made-up example. A business uses 10 mailer boxes a day. The supplier takes 7 days to deliver, and the owner wants 5 days of cushion. The reorder point is 10 × (7 + 5) = 120 boxes. When stock reaches 120 or fewer, it’s time to order.

    Daily use is the weakest number in this formula, because at first it’s a guess. The Stock tab below shows the real use from your own movements, so you can correct the estimate after a month or two.

    Tab 2: Movements

    Make a tab named Movements with these columns:

    ColumnHeaderWhat goes in it
    ADateWhen the movement physically happened
    BSKUChosen from a dropdown that reads the Items tab
    CMovement typeChosen from a fixed list
    DQuantityA positive number, decimals allowed
    EReferenceOrder number, PO number, or count date
    FLogged byInitials

    Quantity is always positive. The movement type decides whether stock goes up or down. Use this list of seven types. Each starts with IN or OUT:

    • IN – Opening count
    • IN – Purchase received
    • IN – Return to stock
    • IN – Count correction up
    • OUT – Sale or use
    • OUT – Waste or damage
    • OUT – Count correction down

    Start with opening counts. On the day you start, count everything and log one “IN – Opening count” row per SKU, dated that day. That’s the only time you enter a starting balance. After that, the balance is always the sum of movements. If an item has zero stock, skip its opening row; the quantity rule below requires a number above zero. Dates are for things that have physically happened, so log a purchase when it arrives, not when you order it.

    Add the dropdowns

    Dropdowns stop typos like “Tomato” and “Tomatoes” from becoming two items. Select the cells in column B (B2 down to row 1,000), then choose Data, then Data validation. In the Data validation rules panel, click Add rule. Under Criteria, choose Dropdown (from a range) and enter Items!A2:A200. Under Advanced options, leave “If the data is invalid” on Reject the input, then click Done.

    Repeat for column C, using the seven movement types. If you’re building from scratch, first make a fourth tab named Lists, type “Movement types” in A1, and type the seven types in A2 to A8. The template already has this tab. Then use Dropdown (from a range) with Lists!A2:A8. For column D, choose Greater than and enter 0, so nobody enters a negative quantity.

    Select the cells before you click Add rule, and don’t change the “Apply to range” box afterward. When you finish, the rules panel should list three rules, one for each column. If a rule you added earlier disappears, you changed the range of a rule that already existed; add it again. Then test it: type a made-up SKU in column B. Google Sheets should reject it with a message that the entry violates the data validation rules.

    Tab 3: Stock

    Make a tab named Stock. Row 2 holds the formulas for the first item, and you copy that row down.

    ColumnHeaderFormula in row 2
    ASKU=IF(Items!A2="","",Items!A2)
    BItem=IF(A2="","",Items!B2)
    CReceived=IF(A2="","",SUMIFS(Movements!$D:$D,Movements!$B:$B,$A2,Movements!$C:$C,"IN - *"))
    DRemoved=IF(A2="","",SUMIFS(Movements!$D:$D,Movements!$B:$B,$A2,Movements!$C:$C,"OUT - *"))
    EOn hand=IF(A2="","",C2-D2)
    FReorder point=IF(A2="","",Items!J2)
    GStatus=IF(A2="","",IF(E2<0,"CHECK COUNT",IF(E2<=F2,"REORDER","OK")))
    HUnit cost=IF(A2="","",Items!E2)
    IStock value=IF(A2="","",E2*H2)

    The * in "IN - *" is a wildcard, so the formula adds up every movement whose type starts with “IN – “. That’s why the type names matter and why the dropdown is locked to the list.

    Two safeguards sit in the status formula. If on-hand comes out negative, which should be impossible, the status says CHECK COUNT instead of looking fine, because that points to a missed receipt or a typo. The reorder test uses “at or below,” so a count exactly on the reorder point triggers it.

    Make the flag visible

    Select column G, then choose Format, then Conditional formatting. Use Text is exactly REORDER and a soft red fill. Add a second rule for CHECK COUNT with a yellow fill. The Stock tab then shows what needs ordering at a glance.

    What the example shows

    With the template’s made-up data, the Stock tab calculates:

    SKUReceivedRemovedOn handReorder pointStatusStock value
    PKG-001600293307120OK$260.95
    PKG-00230171313.5REORDER$31.20
    LBL-001133105OK$60.00
    INK-0014131.8OK$66.00
    PRD-001400159241126OK$747.10
    PRD-002150678363OK$481.40

    The packing tape has 13 rolls on hand against a reorder point of 13.5, so it’s flagged. Stock value is on-hand quantity times the last unit cost you entered. It’s a working figure for the shop floor, not an accounting valuation, because your accountant may use a different costing method.

    Check your usage estimate

    Two more columns help you test the daily-use guess against reality. They only mean something for an item once you have 28 full days of history for that item, so the template leaves them blank until then. Use these estimates only when every movement for that item has been recorded throughout the last 28 completed days; an older first entry alone does not establish complete logging. In column J, =IF(A2="","",IF(COUNTIF(Movements!$B:$B,$A2)=0,"",IF(MINIFS(Movements!$A:$A,Movements!$B:$B,$A2)>TODAY()-28,"",SUMIFS(Movements!$D:$D,Movements!$B:$B,$A2,Movements!$C:$C,"OUT - Sale or use",Movements!$A:$A,">="&(TODAY()-28),Movements!$A:$A,"<"&TODAY())/28))) gives average daily use over the last 28 completed days, not counting today or any future-dated rows. Column K, =IF(A2="","",IF(N(J2)>0,E2/J2,"")), divides on-hand stock by it to estimate days of stock left.

    The blanks are deliberate, and they are per item. If an item’s first logged movement is only ten days old, dividing by 28 would treat the missing eighteen days as days when nothing sold, so that item stays blank even if other items have a long history. An item with no movements at all also stays blank rather than showing zero. If the real use differs a lot from the number in the Items tab, update the Items tab and the reorder point follows. Because these columns depend on today’s date, the template’s example data (October 1 to 15, 2026) is a finished illustrative period, and the columns will show nothing until you’ve logged 28 days of your own.

    Clear the Example Data Before You Start

    The template comes with made-up transactions. If you leave them in, your real items inherit fictional stock. To start clean:

    1. On the Movements tab, select the data rows from row 2 down to the last example row and press Delete. This clears the contents but keeps the header row and the dropdown rules. Don’t delete the rows themselves.
    2. On the Items tab, type over the example rows in columns A to I with your own items. Leave column J alone; it holds the formula. Clear any leftover example rows below your last item.
    3. Back on Movements, log one “IN – Opening count” row for each item with your real count.
    4. Check the Stock tab. On hand should match what you counted on the shelf for every item before you log anything else.

    How People Use It Day to Day

    Receiving a delivery, selling or using stock, and discarding spoiled goods each add one row to Movements. Here are three made-up rows:

    DateSKUMovement typeQuantityReferenceLogged by
    2026-10-07PKG-001IN – Purchase received200PO-0101JS
    2026-10-08PKG-001OUT – Sale or use90Week 2 shipmentsJS
    2026-10-13PRD-001OUT – Waste or damage4Damaged in storageMK

    If the work is steady, log in batches, such as once a day for sales and at receiving time for deliveries. The point is that every change has a row, a date, and a reason. For high-volume sales, you can total a day’s sales into one row per SKU instead of one per sale.

    Protect the Items and Stock tabs so only you can edit them. Choose Data, then Protect sheets and ranges, and limit editing on the formula cells. Staff then only need access to Movements, where mistakes are visible and correctable. Protection limits who can edit a range; it isn’t a security control, and editors of Movements can still change or delete old rows. Keeping the history intact is a habit: add rows, never rewrite them.

    Count a Few Items Regularly and Fix Differences with a Row

    No sheet matches the shelf perfectly. Items get miscounted, damaged without being logged, or taken. A cycle count catches this without closing the business: count a handful of SKUs on a rotating schedule, and cover everything over a few weeks. How many you count at a time depends on how many items you have and how long a count takes.

    When a count disagrees with the sheet, don’t edit the Stock tab or delete old rows. Add a correction row. If the sheet says 20 and the shelf has 17, log “OUT – Count correction down”, quantity 3, with a reference like “Cycle count 2026-10-15”. If the shelf has more, log “IN – Count correction up” for the difference. The balance fixes itself, and the history keeps the evidence. If corrections for the same item keep going down, that is the clue to look for waste, theft, or an unlogged use.

    What a Spreadsheet Doesn’t Do

    • It doesn’t know about open orders. An item stays flagged REORDER until you log the receipt, even if you ordered it yesterday. Put the PO number in a note column on the Items tab, or mark the row, so two people don’t order the same thing twice.
    • It doesn’t change costs by lot. Unit cost is a single number, so it can’t show first-in, first-out valuation.
    • It tracks one place. Several locations, transfers between them, and lot or expiry tracking need a different design.
    • It doesn’t scan. Entry is by hand unless you add other tools.

    Stay in Google Sheets until it stops being enough for a specific reason like these, not just because the item count grows. If you outgrow it, look for tools that solve the exact problem: barcode scanning, multi-location transfers, or lot tracking. How much a small business should spend on data tools can help you weigh the cost.

    Connect It to Alerts and Cash

    The REORDER flag appears when someone opens the Stock tab. If you want an email when an item crosses its reorder point, How to set up automatic alerts in Google Sheets covers the options, including a script that emails you once when a number crosses a line. That script checks a number against a minimum, so watching a text status for each item would need an adapted script rather than just new cell references. Orders also have to be paid for, so it helps to put planned inventory purchases into your cash forecast. The 13-week cash flow tracker has a row for vendor and inventory payments.

    Frequently Asked Questions

    How many items can this handle?

    The template has formulas for 199 items (rows 2 to 200), and its dropdowns accept entries down to row 1,000 of Movements. To go past either limit, extend everything together: copy the Items column J formula and the Stock row 2 formulas further down, extend the Stock conditional formatting range, widen the SKU dropdown source (Items!A2:A200), and extend the validation rules on Movements. Performance depends on your file, and Google recommends closed ranges instead of open ones in formulas, so if a large Movements tab gets slow, change the whole-column references to bounded ranges. You can also archive older years to another file after carrying forward a closing count as new opening rows.

    Can several people use it at once?

    Yes. Google Sheets lets several people edit the same file. What matters is the discipline: everyone logs movements in the same way, and only a few people can change the Items and Stock tabs.

    What about returns from customers?

    If the returned item goes back on the shelf, log “IN – Return to stock”. If it can’t be resold, don’t log anything else against stock: the original sale already took that unit out, so logging it as waste would remove it a second time. Say you start with 10, sell 1, and get a damaged return. The balance should stay at 9. Record what happened to the damaged unit in a note or the Reference column of a separate log. Use “OUT – Waste or damage” only for units that are actually counted in stock.

    Does this replace my accounting records?

    No. It tracks quantities for operations. Your accounting records have their own rules for how inventory is valued and reported.

  • How to Get Alerted When Your Numbers Change

    To get alerted when your business numbers change without drowning in noise, follow four rules. Alert only on events that force a decision. Set each line according to the kind of number it watches. Make every alert say what happened, who owns it, what to do, and by when. Then review the whole list regularly, and for any alert nobody acted on, find out why before you remove it.

    Monitoring Is Not Alerting

    Monitoring is a number you can look at when you choose to: a dashboard, a scorecard, a monthly report. Alerting is a number that interrupts you. They do different jobs, and most alert problems start when one is used as the other.

    Anything that can wait until the next review belongs on the scorecard. How many KPIs a small business should track explains why four to seven numbers is enough to watch. An alert list should be much shorter than that. If you're not sure where a number belongs, put it on the scorecard first. You can promote it later.

    Why Alert Systems Decay

    An alert system usually starts with enthusiasm. You set up alerts for everything you'd hate to miss. Within a few weeks the messages arrive daily, people skim them, and somebody builds an inbox rule that files them away. When a real problem finally triggers one, it sits in a folder nobody opens.

    Software makes sending a notification free. Attention is the part that costs something. The fix is not a better tool. It's a smaller list, with a clear reason for each item to be there.

    Industrial plants have dealt with this for a long time. ISA's own explanation of alarm management, built around the ANSI/ISA-18.2 standard, describes rationalization: each alarm is justified, and its consequence, the expected response, and the response time are documented. ISA's overview of alarm rationalization is worth a read. A small business doesn't need that formality, and this article isn't claiming to follow the standard, but the discipline carries over.

    What Deserves an Alert

    Two tests keep the list short. First, does the number help the business make more revenue, run more efficiently, or cost less to operate? If not, leave it off. Second, if it moves, is there a decision someone must make soon, and can they make it? If the answer is "we'll look at it at the monthly review," it's a report.

    Alert Report
    When action is needed Before the consequence arrives, at a deadline set for that risk: minutes for an outage, about a day for a financial check At the next scheduled review
    What it watches A limit you can't cross, or a sharp break from normal Trends and gradual changes
    Who receives it One person who owns the response Leadership and the team
    How often it fires Rarely, by exception On a schedule

    Typical alert material: cash projected to fall below payroll, a product about to run out, a payment system that has stopped working, a key customer's orders stopping. Typical report material: utilization, retention, average ticket, anything you review monthly to see which way it's heading.

    Two Kinds of Line

    A threshold is the line a number crosses to trigger an alert. There are two ways to set one, and they suit different numbers.

    A hard limit comes from what the business must be able to do, not from history. Cash is the clearest case. Your minimum cash level should come from what's due in the coming weeks and how quickly you could collect or borrow, not from last year's balances. Two $15,000 payrolls come to $30,000, but that covers only those two payments. A real floor also has to cover rent, vendors, taxes, and a margin for the forecast being wrong. The 13-week cash flow tracker shows one way to lay that out. Keep in mind that a check on week-end balances can miss a dip in the middle of a week. Inventory works the same way: set the reorder point from lead time and how fast you sell. A dangerously low balance can be common, so history isn't a safe guide here.

    A variation band comes from how much a number normally moves. It suits performance numbers, such as inquiries, conversion rate, gross margin, or on-time delivery. I set these from the business's own history. I look at how much each metric actually moved over the last six to twelve months. Movement inside that normal range I treat as noise. Movement outside it means something changed. And I set the band metric by metric, because metrics differ.

    The numbers below are made up to show why. Take two metrics from the same business.

    Weekly website inquiries Gross margin
    Normal range over 12 months 38 to 58 a week 41% to 43%
    Midpoint 48 42%
    A flat 10% rule fires when it falls below 43.2 37.8%
    Reading that should get attention Well outside the range, such as 20 38%

    A 10% rule would alert on a perfectly normal week of 40 inquiries, which sits 17% under the midpoint but inside the usual range. It would stay silent when gross margin falls to 38%, because that is only 9.5% below 42%. Yet at $80,000 of monthly revenue each margin point is worth $800, so four points is $3,200 a month, or $38,400 a year if it lasted. Same rule, two wrong answers.

    Two cautions apply. First, a steady drift that stays inside the band is still a trend, so keep watching it on the scorecard. Second, if you have no history yet, start with a rough band from your judgment and revise it after a quarter of real data. A first guess is fine as long as you replace it.

    What a Good Alert Says

    An alert that only states a number leaves the work to whoever reads it. Make every alert carry four things:

    1. The condition, in plain words.
    2. The context: how far off, and compared with what.
    3. The owner: one named person or role.
    4. The action and the deadline.

    This is the same conversation a good reporting meeting has: what the numbers mean, who will act on them, and by when. Compare two versions of the same alert.

    Weak: Cash is low.

    Strong: Projected ending cash for the week of Nov 2 is $24,000, which is $6,000 under the $30,000 minimum. Owner: office manager. Next step: confirm which customer payments are due before Nov 2 and follow up on any overdue ones. Report back by Friday noon.

    The strong version needs no meeting to decide who does what. The weak one starts a discussion about whether anyone should worry. The example is made up. In your own alerts, the owner should be a person or a role someone actually holds, not a shared inbox.

    When Silence Is the Problem

    A quiet inbox is weak evidence. It can mean everything is fine, but it can also mean the data stopped arriving, the monitor stopped running, or an alert is already active and is staying quiet on purpose. Keep three questions separate.

    1. Is the data fresh? Did the source refresh recently, with valid values? Use a timestamp for the last successful refresh, not the date of the latest transaction, which can be old for a good reason when nothing happened. A formula like TODAY() or a header with a forecast date doesn't prove anything about freshness.
    2. Is the monitor working? Did the check run recently, and did the message get out? A check inside the job that stopped can't announce that the job stopped. Use a separate backup check, such as a heartbeat message that should arrive and gets noticed when it doesn't. Set its cadence to the risk. Platform failure notifications help with runs that fail, but a missed-run check is needed for a job that never starts.
    3. Is the condition still active? A good alert system sends one message when a number crosses a line, then stays quiet while it remains crossed. No new message can therefore mean a problem that's already been reported, not a healthy number. Know which alerts are active and who has acknowledged them.

    In a spreadsheet, a cell that records when the last successful refresh happened, with a rule that complains when it's too old, is a reasonable design idea. Treat it as a suggestion to try, not a tested recipe.

    Plan for Known Noise

    Some movement is expected and planned: a promotion that lifts inquiries for two weeks, a seasonal slowdown, a price change, a holiday closure. If an alert keeps firing for a reason everyone already knows, people start ignoring it for that reason and then for the next one.

    Handle planned events deliberately, and be careful about which alerts you loosen. For performance numbers, write down the event, the dates, and the temporary band, and name the person who restores the original line. Don't switch off protections for cash, stock, outages, or safety just because the condition is expected. If you have to pause a critical alert, name another way someone will keep watching it and put the restore date on the calendar. A temporary exception with no end date quietly becomes a permanent blind spot.

    Repeated alerts have remedies besides moving the line. For performance alerts where a short delay is safe, require the number to stay across the line for a few checks before it fires. Keep urgent hard-limit warnings prompt. Send one message per problem, not one per check. Let the owner acknowledge it, and escalate to a backup if nobody does. The Google SRE book's chapters on monitoring and practical alerting describe persistence, deduplication, and routing for engineering teams. The owner-and-backup response rule here is a proposed small-business routine.

    Choose the Channel by Urgency

    Match the channel to how fast the response has to be.

    • Email suits checks you want a record of and can act on within the day, such as a morning cash check. It's easy to file and to find later.
    • Team chat suits events a group handles together, such as a new qualified lead that someone needs to pick up.
    • Text message or phone push suits emergencies where you'd want to be interrupted, such as a payment system going offline. If texts fire often, find out why. Either the lines are wrong, or a real problem keeps happening and needs fixing.

    Decide what happens when no one responds. A simple rule is enough: if the owner hasn't acknowledged it by a stated time, the message goes to a named backup. This is also how you tell a missed alert from an unnecessary one.

    Review the List Regularly

    Alert lists need pruning, but pruning is not the same as deleting whatever gets ignored. A quarterly review is a reasonable routine for a small business, not a rule from any standard. Go through each alert and ask three questions.

    1. Did it fire? If not for a long time, is the condition still a real risk? A quiet alert may be doing its job, or it may be watching something that no longer matters.
    2. When it fired, did the owner act before the alert's own deadline? Compare the response with the deadline you set for that risk, not with a universal one. If they didn't act, find out why. The owner may not have seen it, the message may not have been delivered, nobody may have been named, there may be no backup, or the action may not have been possible. Fix that cause. Retire the alert only if the condition no longer needs a timely response, another alert already covers it, or it was only ever information.
    3. Did anyone say it was noisy? Find out what kind of noise it was before you change anything. It could be a real problem that keeps recurring, bad data, the same message sent twice, a number crossing the line and back again within minutes, a message that doesn't say what to do, or the wrong recipient. Move the line outward only when the number's own history supports it, and only for performance numbers. If the breach is real and repeats, that's an operational problem to solve, not a threshold to loosen.

    Keep the list in one place with one row per alert, so the review takes minutes instead of an afternoon.

    Number Line Owner Action Channel
    Projected cash Below the cash floor (payroll plus other dated payments) Office manager Chase receivables Email
    Gross margin Below its 12-month range Operations lead Review job costs Email
    Payment system Offline Owner Switch to backup Text

    The rows are examples. Yours should be short enough that the owner can name every alert from memory.

    Frequently Asked Questions

    How many alerts should a small business have?

    As few as you can defend. A handful is plenty for most small businesses. If you can't say who acts on an alert and what they do, it doesn't belong on the list yet. Either name the owner and action, or move the number to the scorecard.

    Should I alert on a percent change or on a level?

    It depends on the number. Use a level, a hard limit, for cash, stock, and anything with a real floor. Use a variation band for performance numbers that move up and down on their own. A flat percentage for everything is the version most likely to be wrong.

    What if I don't have 6 to 12 months of history?

    Start with a rough band, mark it as provisional, and replace it once you have a quarter of data. Don't wait for perfect history before setting up the few alerts that guard a hard limit.

    How do I set one up in a spreadsheet?

    How to set up automatic alerts in Google Sheets covers the mechanics. This article is about deciding which alerts deserve to exist.

  • How to Set Up Automatic Alerts in Google Sheets

    Google Sheets can email you when something changes, and there are three ways to set it up. Notification settings email you when someone else edits the sheet or submits a form. Conditional notifications email you when a cell changes to a value you choose, but only on certain work or school accounts. A short Apps Script can watch a calculated number, such as the lowest projected cash balance, and it runs on personal and Google Workspace accounts, subject to your permissions and any administrator settings. Start with the simplest method that does the job.

    Decide What the Alert Is For First

    An alert is a message that asks someone to do something. If nobody knows what to do when it arrives, it becomes noise, and people learn to ignore it. Before you set one up, write down the number it watches, the level that counts as a problem, who gets the email, and what that person does next. This article covers the mechanics, not which numbers deserve an alert.

    Also try the free option first: a color that shows up when you open the sheet (Method 3). An email makes sense when nobody opens the sheet often enough to notice the color.

    Method 1: Turn On Notification Settings for Edits and Form Submissions

    This is the built-in option for knowing that something happened in a shared sheet. It needs no code and no special account. The setting applies to you only, and it doesn’t notify you about your own edits.

    1. Open the sheet.
    2. Click Tools, then Notification settings, then Edit notifications.
    3. Under “Notify me when,” choose Any changes are made or A user submits a form.
    4. Under “Notify me with,” choose Email – daily digest or Email – right away.
    5. Click Save.

    Use “right away” when someone is waiting on the update, such as a lead form that a salesperson should answer the same day. Use the daily digest for a sheet your team edits constantly.

    The limit is that these notifications tell you a change happened. They don’t read what the change was, so they can’t tell you that cash dropped below $10,000 or that a stock count hit zero.

    Method 2: Conditional Notifications on Certain Work or School Accounts

    Conditional notifications email you when a cell’s value changes to something you specify. Google says the feature is available only to certain work or school accounts, so a personal Gmail account won’t see it. If your menu has it, setup takes a minute:

    1. Click Tools, then Conditional notifications. You can also right-click a cell.
    2. Click Add rule.
    3. Under “In this column,” pick a column or a custom range.
    4. Click Add condition and set the test, for example, Text is exactly “Completed.”
    5. Under “Then take the following action,” type the email addresses or choose a column that contains them.

    This works well for a status column. A rule on the “Status” column can email the account manager when a row changes to “Overdue.”

    Know the limits before you rely on it:

    • You can add individual Gmail or Google Workspace addresses. Group addresses and non-Google addresses such as Outlook or Yahoo aren’t supported.
    • Emails may not be immediate, and several changes can be combined into one email.
    • Volatile functions recalculate with any change to the sheet, so you may miss changes they produce, especially while the file is closed. Changes that come from outside sources such as Connected Sheets or other documents don’t trigger rules.
    • A change in how a value is formatted (decimal places, for example) doesn’t count.

    If your account doesn’t have the feature, or you need to check a number that’s calculated across a row, use Method 4.

    Method 3: Color the Cell So the Problem Shows Up When You Open the Sheet

    Conditional formatting is not an email, but it takes two minutes and works on every account. For many sheets, it’s enough.

    For the 13-week cash flow tracker, where ending cash is in B14:N14 and the minimum is in A17:

    1. Select B14:N14.
    2. Click Format, then Conditional formatting.
    3. Under “Format rules,” choose Custom formula is and enter =B14<$A$17.
    4. Set a soft red fill with dark red text. Skip the neon colors; people stop seeing them.

    The same approach works for inventory below a reorder point, or a receivable past due: pick the cells, choose Less than or a custom formula, and point it at the cell that holds your limit. The color catches the problem when someone opens the sheet. If you need to be told when no one has opened it, go to Method 4.

    Method 4: Email an Alert With a Short Apps Script

    Apps Script is Google’s built-in scripting tool for Sheets. It’s included with personal and Google Workspace accounts, subject to your account’s permissions and any restrictions your administrator sets on a work account. The script below checks the projected ending cash for all 13 weeks and sends one email when the lowest value falls under your minimum. It’s written for the layout in the cash flow tracker template: a tab named “Cash Flow,” week start dates in B1:N1, projected ending cash in B14:N14, and the minimum cash level in A17. If your sheet is laid out differently, change those references.

    The script is strict on purpose. It needs a real date in every cell of B1:N1, a number in every cell of B14:N14, and a number in A17. If anything else is there, such as an error like #REF!, a blank cell, or text, the script stops with an error message and does nothing else. A broken forecast shouldn’t be mistaken for a healthy one, and it can’t clear a standing alert.

    function checkCashAlert() {
      var lock = LockService.getScriptLock();
      lock.waitLock(30000);
      try {
        var ss = SpreadsheetApp.getActiveSpreadsheet();
        var sheet = ss.getSheetByName("Cash Flow");
        if (!sheet) {
          throw new Error('No tab named "Cash Flow".');
        }
        var weeks = sheet.getRange("B1:N1").getValues()[0];
        var ending = sheet.getRange("B14:N14").getValues()[0];
        var minimum = sheet.getRange("A17").getValue();
    
        if (typeof minimum !== "number") {
          throw new Error("A17 must hold a number: the minimum cash level.");
        }
    
        var lowest = null;
        var lowestWeek = null;
        for (var i = 0; i < ending.length; i++) {
          var column = String.fromCharCode(66 + i);
          if (!(weeks[i] instanceof Date) || isNaN(weeks[i].getTime())) {
            throw new Error(column + "1 must be a date.");
          }
          if (typeof ending[i] !== "number") {
            throw new Error(column + "14 must be a number, but it holds: " + ending[i]);
          }
          if (lowest === null || ending[i] < lowest) {
            lowest = ending[i];
            lowestWeek = weeks[i];
          }
        }
    
        var props = PropertiesService.getScriptProperties();
        var alreadyAlerted = props.getProperty("CASH_ALERT_ACTIVE") === "true";
    
        if (lowest < minimum) {
          if (!alreadyAlerted) {
            var weekText = Utilities.formatDate(lowestWeek, ss.getSpreadsheetTimeZone(), "MMM d, yyyy");
            MailApp.sendEmail(
              "you@yourcompany.com",
              "Cash alert: projected balance falls below your minimum",
              "The lowest projected ending cash is $" + lowest.toLocaleString() +
              " in the week starting " + weekText + ". Your minimum is $" +
              minimum.toLocaleString() + ".\n\n" + ss.getUrl()
            );
            props.setProperty("CASH_ALERT_ACTIVE", "true");
          }
        } else if (alreadyAlerted) {
          props.deleteProperty("CASH_ALERT_ACTIVE");
        }
      } finally {
        lock.releaseLock();
      }
    }
    

    To install it:

    1. In your sheet, click Extensions, then Apps Script.
    2. Delete the sample code and paste the script.
    3. Change the tab name ("Cash Flow"), the ranges, and the email address to match your sheet.
    4. Click Save project.
    5. Select checkCashAlert in the function dropdown and click Run.
    6. A box titled “Authorization required” appears, with Cancel and Review permissions buttons. Click Review permissions. Google then opens a separate window where you choose your account and approve access. The script reads your spreadsheet and sends email as you, so expect those two permissions to be listed. Read them before you approve. For a script you wrote or pasted yourself, Google may also warn that the app isn’t verified. After you approve, the run finishes and the execution log at the bottom shows “Execution completed”.

    What the Script Does

    The script first locks the sheet so two runs can’t overlap, then checks the sheet. It finds the lowest ending cash and the week it falls in, and compares that number with your minimum.

    If the lowest number is under the minimum, it sends one email that names the amount, the week, and the sheet link. The week is shown in the spreadsheet’s time zone. It also saves a flag called CASH_ALERT_ACTIVE. While the flag is set, the script stays quiet, so you don’t get the same email every morning while cash stays low. When the lowest number is back at or above the minimum, the script clears the flag, and the next breach sends a new email. If the email can’t be sent, the flag isn’t set, so the next run tries again.

    A quiet script is not proof that cash is fine. The script watches weekend balances only, so a balance that dips below your minimum in the middle of a week and recovers by the weekend won’t trigger it. Use it with the dated payment list described in the cash flow tracker article.

    Test it before you trust it, and don’t schedule anything until the test passes. The test changes your minimum on purpose, so either do it in a copy of your sheet (File, then Make a copy, and check that the script came along under Extensions, then Apps Script; if it didn’t, paste it in again) or write down your real minimum first and put it back at the end.

    1. Write down the number in A17. In any empty cell, enter =MIN(B14:N14) to see your lowest projected ending cash. Call that number L, then delete the cell.
    2. Healthy state. Set A17 to L. Run the script. Nothing should arrive, because a balance equal to the minimum is not a breach. This also clears any alert the script remembered from before.
    3. Breach. Set A17 to a number above L, such as L plus 1,000. Run the script. The email should arrive and name the lowest amount and its week.
    4. Suppression. Run the script again. No second email should arrive.
    5. Recovery and re-breach. Set A17 back to L and run the script, which clears the alert. Set A17 above L again and run it. A new email should arrive.
    6. Bad data. Click one ending cash cell and copy its formula from the formula bar to a safe place. Replace the formula with a word and run the script. It should stop with a red error in the execution log, such as “J14 must be a number, but it holds: oops”, and send nothing. A real error value such as #REF! is reported the same way. Then paste the original formula back, confirm the numbers return, and run the script again to confirm it works.
    7. Put it back. Set A17 to the real minimum you wrote down in step 1 and run the script once more. If your real forecast is below that minimum, the alert stays active; an email is sent only if the flag is not already set.

    Schedule the Script So It Runs Without You

    A script that you have to run by hand isn’t an alert. Set a trigger so Google runs it on a schedule:

    1. In the Apps Script editor, click the Triggers icon (the clock) on the left.
    2. Click Add Trigger (bottom right).
    3. Under “Choose which function to run,” pick checkCashAlert. Leave the deployment on Head.
    4. Change “Select event source” from its default, From spreadsheet, to Time-driven. Set the type of time-based trigger to Day timer and the time of day to 6 am to 7 am. The time zone appears under that choice, for example (GMT-04:00).
    5. Under “Failure notification settings,” change Notify me daily to Notify me immediately, so a run that stops with an error reaches you.
    6. Click Save.

    Google runs the script at some point inside the window you pick and keeps that time consistent from day to day. The window follows the script project’s time zone, which you can see in the trigger dialog and change under Project Settings, in the Time zone box. Your spreadsheet has its own time zone, and the two can differ. The alert email shows the week’s date in the spreadsheet’s time zone.

    A trigger runs as the account of the person who created it. Create it from the account that should own the alert, and recreate it if that person leaves.

    A once-daily check has a blind spot. If a breach starts and ends between two checks, you won’t hear about it. You can add an On Edit trigger to run the check whenever someone changes a cell by hand. It responds to edits made by people, not to changes made by scripts or other programs, and the lock keeps the two triggers from sending duplicate emails. This script checks the cash minimum only; it isn’t a general tool for alerting on text statuses.

    Keep Alerts from Becoming Noise

    Three habits keep an alert useful.

    Latch the alert. The script above sends an email only when the number crosses into a problem, and stays quiet until it recovers. A script that emails every morning while the number stays low trains you to ignore it. The limit of the latch is that cash can keep falling after the first email without a second one, until it recovers above the minimum and falls again. Name one person who owns the follow-up, and what they do when the email arrives.

    Choose the line for the right reason. A cash minimum isn’t a statistical band. Set it from what’s coming: the payroll and fixed payments due in the next few weeks, and how quickly you could collect or borrow if you needed to. For performance numbers such as inquiries or conversion rate, a different rule works. Look at how much the number has moved over the last six to twelve months, treat movement inside that range as ordinary, and set the line outside it. Do this for each number separately, because each moves differently.

    Mind your limits. Google caps how many email recipients an account can send to in a day: 100 on a personal Gmail account and 1,500 on a Google Workspace account, according to Google’s Apps Script quotas, which can change. A morning check that emails one person uses one recipient. These limits are shared across everything the account does with Apps Script, and trial accounts can have lower limits.

    When the Alert Doesn’t Arrive

    A missing email doesn’t prove the numbers are fine. Check these in order:

    • The trigger exists. Open the Triggers page in Apps Script and confirm the entry is there.
    • The script ran. Open the Executions page and look for a run at the expected time. Each row shows whether it was started from the editor or by a time-driven trigger, and whether it completed or failed. A run that stopped on bad data shows as Failed, with the error message the script threw, such as which cell isn’t a number.
    • The names still match. If you renamed the tab or moved the rows, the script stops with an error. Update the references.
    • The sheet has errors, blanks, or text where numbers or dates belong. The script stops and doesn’t email. Fix the cells it names.
    • The email went to spam. Check the spam folder, then mark the message as not spam.
    • The flag is stuck. If the script thinks it already alerted, it stays quiet until the forecast recovers. You can see the flag under Project Settings, in the Script Properties list: CASH_ALERT_ACTIVE with the value true. To reset it, set A17 to your lowest ending cash or below, run the script once, then restore A17 (steps 2 and 7 of the test above).

    When Paid Automation Tools Are Worth It

    Native tools cost nothing, so use them until they stop being enough. Paid automation services make sense when one event has to update several apps at once, such as texting a manager, creating a CRM record, and posting to a team channel. They also make sense when non-technical people have to build and change rules themselves, or when your volume goes past the daily email limits. Prices change, so check current plans before you commit. How much a small business should spend on data tools covers the spending decision.

    Frequently Asked Questions

    Can I set up Google Sheets alerts on a personal Gmail account?

    Yes, with notification settings (Method 1) and Apps Script (Method 4). Conditional notifications are limited to certain work or school accounts. On a work account, your administrator may restrict scripts.

    Do the alerts work when the sheet is closed?

    A time-driven script trigger runs on Google’s servers whether or not you have the sheet open. Notification settings email you about changes other people make while you’re away.

    Does this cost anything?

    No. Notification settings, conditional formatting, and Apps Script are included with your Google account. They do have limits: you have to authorize the script, Apps Script has daily quotas and runtime limits, and a work account can be restricted by an administrator.

    Do I need to know how to code?

    Not to use this script. You change four things (tab name, ranges, email, trigger) and test it. If you change the layout of your sheet later, update the references too.

  • How to Build a Cash Flow Tracker in Google Sheets

    Build a cash flow tracker as a 13-week grid with one column per week, Monday through Sunday. Each column holds beginning cash, cash coming in, cash going out, net cash flow, and ending cash, and each week’s ending cash becomes the next week’s beginning cash. Start from a real bank balance, enter when you expect money to arrive and leave, and the sheet estimates your balance week by week for the next quarter. It shows which week looks tight while you still have time to act.

    Why a Profitable Month Can Still Leave You Short of Cash

    If your books use accrual accounting, your profit and loss statement records revenue when you earn it, and your bank account changes only when money moves. (Cash-basis books record revenue when it arrives, but cash timing still drives the balance.) The gap between profit and cash is where most cash problems start:

    • A customer invoice counts as revenue when you earn it and may not be paid for 30, 45, or 60 days.
    • Inventory and materials can leave your account before the cost shows up in your books, depending on how your books treat inventory.
    • Loan principal payments and owner draws reduce your cash, and neither is an operating expense on the P&L.
    • Payroll, payroll taxes, and other business tax payments go out on fixed dates that have nothing to do with when customers pay. They need dated entries in the tracker; however, your books record them.

    Accounting software tells you what already happened. A cash flow tracker looks forward and estimates your balance from the timing you enter.

    It also makes collections visible. The most reliable fix for slow payers is contact before an invoice is late: set up receivables so reminders go out, or someone talks to the customer, so you know what will lag and aim to keep invoices from drifting past 60 days. The tracker shows what’s left after you’ve done that.

    Why 13 Weeks

    Thirteen weeks is roughly one quarter, and it’s a common horizon in professional cash forecasting. It’s far enough out to see a problem while you can still act on it. The nearer weeks are easier to estimate and easier to correct each week; the further ones are rougher, which is why you refresh the sheet every week. Weekly columns match how cash moves: payroll, rent, and vendor payments land on specific days within specific weeks.

    Set Up the Sheet

    If you’d rather start from a finished version, copy the template, which has the layout, formulas, and color rules already built with made-up example numbers. To build it yourself, open a blank Google Sheet. Put labels in column A and the 13 weeks in columns B through N. Each column covers one week from Monday through Sunday. Enter every amount as a positive number; the formulas do the subtracting. Use these rows:

    RowColumn A labelWhat goes in each week
    1Week startingThe Monday date
    2Beginning cashLast week’s ending cash
    3Customer paymentsInvoices you expect to be paid that week
    4Card and online salesDeposits you expect from your processor
    5Other cash inAnything else that lands in the bank
    6Total cash inSum of rows 3 to 5
    7Payroll and payroll taxesWages, taxes, and benefits
    8Rent and utilities
    9Vendors and inventoryBills you plan to pay that week
    10Loan and tax paymentsPrincipal, interest, and business tax payments due
    11Owner draws and discretionary purchasesMoney you can choose to move
    12Total cash outSum of rows 7 to 11
    13Net cash flowCash in minus cash out
    14Ending cashBeginning cash plus net cash flow

    Then enter these formulas:

    1. B1: type the date of this week’s Monday. In C1 enter =B1+7 and copy it across to N1.
    2. B2: type your bank balance as of the start of that Monday, meaning the balance after Sunday’s transactions have cleared. In C2 enter =B14 and copy it across to N2. That link carries each week’s ending cash into the next week.
    3. B6: =SUM(B3:B5)
    4. B12: =SUM(B7:B11)
    5. B13: =B6-B12
    6. B14: =B2+B13
    7. Copy B6 and B12 through B14 across to column N.

    Type your minimum cash level in cell A17, with the label “Minimum cash” in A16. The next section explains it.

    If you start in the middle of a week, use your current bank balance in B2 and enter only the money that moves after that moment in the first column. Counting a transaction that has already cleared would count it twice.

    Fill In Cash In by When the Money Lands

    Enter each receipt in the week the money reaches your bank, not the week you send the invoice. If a customer on 30-day terms usually pays on day 45, put the payment in the week that contains day 45. Use how each customer actually pays; their terms only show when they’re supposed to.

    For card and online sales, look at the last eight to thirteen weeks of deposits in your bank export and use a typical week, adjusted for anything you know is coming. The business data you already have includes those exports. For retainers and recurring billing, use the billing date plus however long the money takes to settle.

    When you’re unsure about a payment, put it a week later. An early payment costs you nothing, while an assumed one that doesn’t show up can hide a shortfall.

    Fill In Cash Out by When It Leaves

    List each payment in the week it will leave the account. Include the items that don’t appear as operating expenses on the P&L: loan principal and owner draws. Those are the ones that make a profitable business feel short. Business tax payments and payroll taxes belong in the grid on their due dates, however your books record them.

    Rows 10 and 11 keep two kinds of payments apart. Row 10 holds payments you owe on a schedule: loan payments and tax payments. Payroll and payroll taxes in row 7 and rent in row 8 are also fixed. You generally can’t move any of these on your own. A vendor bill in row 9 moves only if the vendor agrees. Row 11 holds the money you can choose to delay, such as an owner draw or a purchase you can postpone. When a week turns red, row 11 is the first place to look.

    Set a Minimum Cash Level and Let Color Warn You

    Pick a floor: the lowest balance you’re comfortable seeing. One starting point is enough to cover two payroll runs. Set yours by how quickly you could collect or borrow if you needed to. Enter the number in A17.

    Then add two color rules to the Ending cash row:

    1. Select B14:N14 and open Format > Conditional formatting.
    2. Choose “Custom formula is” and enter =B14<$A$17. Set the fill to red.
    3. Add another rule with =AND(B14>=$A$17, B14<1.5*$A$17). Set the fill to yellow.

    Red means projected cash at the end of the week is below your floor. Yellow means it’s within 50% above it.

    What the Colors Can’t See

    These rules check each week’s ending balance only. A week can end above your floor and still dip below it in between. Say a week starts at $34,000 and your floor is $30,000. Payroll takes $15,000 out on Tuesday, and an $18,000 customer payment arrives on Friday. The Tuesday balance is $19,000, which is $11,000 under the floor, but the week ends at $37,000 and shows yellow rather than red. The weekly color does not reveal how low cash fell on Tuesday.

    For any yellow week, and any week with a large payment before a large receipt, list the dated payments and receipts for that week on a separate tab, or build a day-by-day view, before you schedule payments. The weekly grid shows you where to look.

    A Worked Example

    The numbers below are made up. A business starts week 1 with $42,000 in the bank and sets its minimum at $30,000. It pays $15,000 in payroll and taxes every other week, and rent of $8,000 comes out in weeks 1 and 5.

    Wk 1Wk 2Wk 3Wk 4Wk 5Wk 6
    Beginning cash$42,000$34,000$43,000$34,000$39,000$24,000
    Total cash in$18,000$15,000$13,000$14,000$12,000$11,000
    Total cash out$26,000$6,000$22,000$9,000$27,000$5,000
    Net cash flow-$8,000$9,000-$9,000$5,000-$15,000$6,000
    Ending cash$34,000$43,000$34,000$39,000$24,000$30,000

    Week 5 turns red. Payroll and rent land in the same week while cash in is the lowest it’s been, and the balance ends $6,000 under the minimum. Standing in week 1, that’s four weeks of notice. Weeks 1 through 4 and week 6 are yellow, and week 6 sits exactly on the floor.

    Four weeks is enough to do something, and the sheet shows what each change does. Asking a vendor to move a $4,000 bill from week 5 to week 6 lifts week 5 to $28,000, which is still $2,000 short. Week 6 falls to the same $30,000 as before, because the bill was delayed, not removed. Pairing the delay with a $2,000 customer payment that you pull in from week 6 to week 5 brings week 5 to exactly $30,000. Nothing in the P&L would have flagged this.

    Update It Every Week

    Pick Monday morning. It takes about 15 minutes, and Monday is when last week is over, and your opening balance is clear.

    1. Duplicate the tab and rename the copy with the date. You’ll use the copies later to compare what you forecast with what happened.
    2. In the live tab, delete the column for the week that just ended (right-click column B, then Delete column). The dates, beginning cash, and ending cash rows will show #REF! across the sheet until you finish the next step.
    3. Type this week’s Monday date in B1 and the bank balance at the start of that Monday in B2. The errors clear, and every week recalculates.
    4. Copy the last column into the next one to add a new week 13. The color rules come along with the pasted column. Then update its amounts.
    5. Revise the next four to eight weeks with whatever you’ve learned: paid invoices, new bills, changed plans.
    6. Look at the colors. If a week is red or yellow, pick one action and a date to take it.

    If you update midweek, don’t delete the current week. Change the amounts you now know and leave the structure alone.

    Mistakes That Make a Cash Flow Tracker Useless

    • Using invoice dates instead of payment dates. This is the most common one. It makes the forecast look healthier than your bank account will.
    • Leaving out cash that never touches the P&L. Loan principal and owner draws are the usual ones.
    • Counting a transaction twice. If you start from today’s bank balance, leave out the money that has already moved.
    • Not updating it. A tracker you refresh every week is worth more than a detailed one you rebuilt once.
    • Treating the forecast as exact. Round to the nearest hundred. The goal is to see which week gets tight, not to predict the penny.

    How Long to Stay in a Spreadsheet

    Stay in Google Sheets until it stops being enough. A sheet like this handles a small business well, and Google Sheets supports several people editing the same file, so shared access alone is no reason to leave. Look at other tools when you hit a specific problem the sheet doesn’t solve, such as pulling bank and accounting transactions in automatically across many accounts or entities, or meeting review and control requirements that a shared spreadsheet can’t. Until then, a disciplined sheet you update every week will do more than software you don’t use.

    Color alone won’t email you. If you want a message when a week goes red, that’s a separate setup. It needs Google’s conditional notifications, which are available only on certain work or school accounts, or a short Apps Script, and both have limits.

    Frequently Asked Questions

    Does a cash flow tracker replace my accounting software?

    No. Accounting software records what happened and produces your P&L and balance sheet. The tracker looks forward at cash timing. You use your accounting records to fill it in.

    How accurate does the forecast need to be?

    Accurate enough to tell you which weeks are tight. Round amounts, put uncertain receipts later, and update weekly. The weeks closest to today will be the most reliable.

    Do I need a template?

    No. The layout above takes about 45 minutes to build, and building it yourself means you know what every row does. If you’d rather not, copy the template and replace the example numbers with yours.

  • Revenue Per Available Parking Space, Explained

    Revenue per available space (RevPAS) is a facility’s parking revenue for a stated period divided by its available capacity over that same period. It is analogous to the hotel industry’s revenue per available room. RevPAS normalizes revenue for facility size and helps you investigate changes in pricing and use; it does not by itself prove why revenue changed. It needs revenue records; occupancy counts alone can’t produce it.

    What RevPAS Measures

    A parking space works like a hotel room or an airline seat: if it sits empty during a period, the revenue it could have earned in that period is gone. RevPAS measures how well each space earns, whatever the facility’s size.

    Facility A earns $100,000 a month from 1,000 spaces: $100 per space. Facility B earns $50,000 from 250 spaces: $200 per space. A brings in twice the total revenue, but B earns twice as much from each space. If you’re deciding where to invest in better equipment or where to test a new rate, that difference matters more than the totals.

    Two things must always accompany a RevPAS figure:

    • The period. Per day and per month give very different numbers, and neither is comparable to the other.
    • The capacity over that period. Use spaces that were actually available, not the painted total. If a level closes for half the month, count its spaces for the half when they were open. A single month-end count would misstate the denominator.

    Without both, two RevPAS figures can’t be compared.

    How to Calculate RevPAS

    Before the step-by-step math, here is the whole idea in one picture. RevPAS breaks into two parts: how much of your capacity gets used, and how much each hour of use earns.

    Occupancy rateoccupied space-hours ÷ available space-hours
    ×
    Revenue per occupied space-hourrevenue ÷ occupied space-hours
    =
    RevPAS per space-hourrevenue ÷ available space-hours
    × hours open in the period → RevPAS per day or per month
    Use (occupancy) times yield (revenue per hour of use) gives revenue per available space.

    The basic calculation

    Constant capacity
    RevPAS = Revenue for the period ÷ Available spaces

    Take a 300-space lot open 10 hours a day, every day (300 operating hours in a 30-day month). That schedule matters later: many municipal and commercial garages run 24 hours, so check your own facility’s hours before reusing these numbers. In the month, the lot takes in $45,000 from all sources: hourly parkers, monthly permits, and validations.

    • Monthly RevPAS = $45,000 ÷ 300 = $150 per space per month
    • Daily RevPAS = $150 ÷ 30 = $5.00 per space per day

    That’s all a facility with unchanged capacity and operating hours needs for monthly reporting. When capacity changes, calculate available space-hours instead: sum the spaces open in each hour of the period.

    When capacity changes
    Revenue per available space-hour = Revenue ÷ Available space-hours
    Effective available spaces = Available space-hours ÷ Scheduled open hours
    RevPAS for the period = Revenue ÷ Effective available spaces

    Multiplying revenue per available space-hour by the scheduled open hours gives the same per-space figure as dividing by effective available spaces. For example, if 100 of 300 spaces close for half of a 300-hour month, available space-hours are (300 × 150) + (200 × 150) = 75,000, or 250 effective spaces. Revenue of $45,000 would be $0.60 per available space-hour, or $180 per effective space for the month. Report the closure and denominator alongside the figure.

    Splitting RevPAS into revenue per occupied hour and utilization

    When RevPAS changes, the next question is what moved: use of available capacity, revenue earned per occupied hour, or both. The trick is to measure both in the same unit: the space-hour, meaning one space for one hour. The second component reflects rates, permit mix, discounts, and payment capture together; it is not a pure price measure.

    Return to the constant-capacity example: 300 spaces, open 10 hours a day throughout the month. In general form, the split is:

    The split
    Occupancy rate = Occupied space-hours ÷ Available space-hours
    Revenue per occupied space-hour = Revenue ÷ Occupied space-hours
    RevPAS per space-hour = Occupancy rate × Revenue per occupied space-hour

    Plugging in the numbers:

    1. Available space-hours = spaces × hours open. 300 × 10 hours × 30 days = 90,000.
    2. Occupied space-hours = the total hours cars were parked, from counts or entry and exit records. Say 45,000.
    3. Occupancy rate = occupied ÷ available space-hours = 45,000 ÷ 90,000 = 50%.
    4. Revenue per occupied space-hour = revenue ÷ occupied space-hours = $45,000 ÷ 45,000 = $1.00. This is realized revenue per hour of use, after the effects of permits, discounts, validations, and the rate mix.

    Multiply the two and you get revenue per available space-hour: 50% × $1.00 = $0.50. Multiply by the hours open to get back to the period figures:

    • Per day: $0.50 × 10 hours = $5.00
    • Per month: $0.50 × 300 hours = $150

    These match the basic calculation, which is the check that the split is right. Now a change in RevPAS can be traced: if next month’s RevPAS rises, you can see whether occupancy rose, revenue per occupied hour rose, or both.

    The mistake to avoid

    A tempting shortcut is occupancy × average ticket. It does not account for how long each car stays or how many times each space turns over.

    For a separate example, take a 300-space lot open 10 hours a day, with all revenue coming from parking tickets. It sells 600 tickets at an average of $2.50, earning $1,500 a day. If each car stays an average of 2.5 hours, occupied space-hours are 600 × 2.5 = 1,500 out of 3,000 available space-hours: 50% occupancy. Occupancy × average ticket gives 50% × $2.50 = $1.25, but actual daily RevPAS is $1,500 ÷ 300 = $5.00 per space. The shortcut mixes a proportion of available space-hours (occupancy) with a price per visit (ticket). It leaves out the two parking sessions per available space per day.

    Hotels can use occupancy × average daily rate because a room is usually sold once per night. A parking space can be sold several times a day, which is why the calculation has to go through space-hours.

    What Data You Need

    • For RevPAS itself: revenue by period from every channel (hourly, monthly permits, validations, events), assigned to the right facility and period; plus available spaces and operating hours over that period, including partial closures.
    • For the revenue-and-utilization split: occupied space-hours, from sufficiently frequent counts or from entry and exit records. Sparse snapshots cannot establish total occupied hours.
    • A caveat for ticketless systems: with license plate recognition (LPR) or mobile pay-by-plate, occupancy and payment come from different records, and they can drift apart. If you measure occupied hours from paid sessions, vehicles that park without paying or registering are invisible, so occupancy looks lower and revenue per occupied hour looks higher than it is. If you measure from camera reads, those vehicles are counted but missed or misread plates add noise to dwell times. Either way, the gap between vehicles seen and vehicles paid is the payment-capture issue covered under What Moves RevPAS.

    Occupancy data alone won’t get you there. In my analytics project on Istanbul’s municipal parking network, the city’s feed reports capacity and empty spaces for each facility, which supports occupancy. It has no revenue at all. So the project doesn’t calculate RevPAS or make any revenue claims, even though it would be easy to make up a plausible-looking number. The rule applies to any operator: don’t publish a metric your data can’t support.

    Price vs. Occupancy: The Trade-Off

    One reason to track RevPAS is to see the combined revenue effect when price and use both change. A higher rate can come with lower occupancy, but the response varies by facility and period. RevPAS shows the net revenue per available capacity; compare other conditions before attributing the change to price.

    For this simplified example, assume each occupied space serves one paying car for the full operating day, with no turnover, permits, discounts, or unpaid parking. A 200-space lot charges $8 a day at 95% occupancy: 190 cars generate $1,520 a day, or $7.60 per available space. It raises the rate to $14. If occupancy falls to 70% under the same assumptions, 140 cars generate $1,960 a day, and daily RevPAS becomes $9.80 per space: 29% higher, even with about a quarter fewer cars. With shorter stays or turnover, use the space-hour calculation instead.

    The 70% in that example is an assumption, and that’s the point to take from it. You won’t know how drivers respond until after the change. Some move to a nearby lot, some shift their arrival times, some pay. So:

    • Compare RevPAS for several weeks before and after, against the facility’s own normal range and similar days or seasons. A change inside the range the facility usually varies over the past six to twelve months may be noise.
    • Split the change into utilization and revenue per occupied hour, as above; then investigate what moved each component.
    • If you run nearby facilities, watch whether demand simply moved next door.

    What Moves RevPAS

    • Pricing by time of day. Charging more during the hours a facility runs near capacity and less when it’s quiet. Set those hours from the facility’s own occupancy history rather than a fixed trigger.
    • Event pricing. A flat rate during events, when demand is predictable and high.
    • Reserved spaces. A named reserved space sits empty whenever its holder is away. Moving to unassigned permits lets others use it.
    • Permit mix. How many spaces go to monthly permits and whether permit arrivals overlap with peak transient demand. Any decision to sell more permits than allocated spaces needs its own history and stress test.
    • Payment capture. If 80% of parked vehicles pay and that rises to 95%, revenue from those vehicles rises 18.75% (95 ÷ 80 = 1.1875), assuming the number of parkers and the average payment per paying vehicle stay unchanged. That average depends on rates, length of stay, and discounts; the percentage is not guaranteed if any of those change or drivers leave because enforcement tightened. Measuring the change needs vehicle counts matched to payments.

    A Property-Value Sensitivity Illustration

    For owners, sustained revenue changes may affect net operating income (NOI), which is one input to property valuation. The following calculation shows sensitivity to assumptions; it does not estimate a realizable sale price.

    A 400-space garage raises monthly RevPAS by $25, from $125 to $150. That’s $10,000 a month, or $120,000 a year. Assume 85% of the added revenue reaches NOI after added costs: $102,000. At an assumed 7% capitalization rate, $102,000 ÷ 0.07 is about $1,457,000 of added value.

    That’s arithmetic, not an appraisal or evidence that a buyer would pay $1.457 million more. Actual value depends on the lease or management structure, costs, market, appraisal method, and whether the higher RevPAS is expected to last.

    A Monthly RevPAS Check

    1. Calculate RevPAS for each facility for the month. State the period and the space count.
    2. Compare it with that facility’s last six to twelve months. Judge the change against how much it normally varies.
    3. If it’s off track, split it. Did occupancy move, or revenue per occupied hour?
    4. Assign one action, with an owner and a date.

    How to build a monthly KPI scorecard shows a spreadsheet layout for tracking RevPAS alongside targets and variance.

    Frequently Asked Questions

    What is a good RevPAS?

    There’s no general figure. RevPAS depends on location, facility type, pricing, and demand. Compare each facility with its own history and with your other facilities.

    What’s the difference between RevPAS and average ticket?

    Average ticket is revenue per parking session. RevPAS is revenue per available space. A higher average ticket can come with lower RevPAS if fewer cars park.

    Should RevPAS include monthly permit revenue?

    Yes. Include all parking revenue for the facility. Tracking the hourly and permit shares separately helps explain changes.

    Can I calculate RevPAS from occupancy data?

    No. RevPAS needs revenue. Occupancy data tells you how much of the capacity was used, not what it earned.

  • How to Measure Parking Facility Occupancy

    Parking occupancy is the number of occupied spaces divided by the number of usable spaces at a specific moment, times 100. The formula is the easy part. Before you trust the result, confirm what your capacity and available-space numbers mean, record when each reading was taken, reject invalid records, and collect readings over time. One reading describes one moment; it cannot establish the busiest time of a day or week. Manual counts, gate and payment records, and sensor or feed data can all help if you check their scope and limitations.

    Three Different Numbers People Call “Occupancy”

    When someone says a lot is “at 60%,” they could mean one of three things:

    • Occupancy at a moment: occupied spaces ÷ usable spaces at one time. “At 10:15 Tuesday, 180 of 200 spaces were taken: 90%.”
    • Observed peak occupancy: the highest reading in your sample across a defined period, such as a day or a week. Report the count times and number of readings; sparse sampling can miss the true peak.
    • Average utilization: the share of available space-hours that were used over a period. A 100-space lot open 10 hours has 1,000 space-hours available. If cars occupied 600 of them, utilization is 60%.

    These answer different questions. Utilization tells you how much of your capacity earns its keep over the day. Peak tells you whether you ran out of room.

    Mixing them up is the most common occupancy mistake. A garage reports 45% occupancy to its owner, a 24-hour average. It was effectively full from 11:30 to 1:30 every weekday, turning drivers away. Both statements are true. Only one of them helps anyone decide whether to add permits, change prices, or send overflow elsewhere.

    The Formulas

    Occupancy % = occupied spaces ÷ usable spaces × 100, measured at a stated time.

    Three details decide whether that number is right.

    Use a capacity denominator that matches the spaces being counted. Design capacity is every striped space. Usable capacity excludes spaces closed for repairs or blocked by construction or snow. If you report general-access parking separately, also exclude reserved, accessible, or loading spaces from both the numerator and denominator for that specific pool; do not drop them from a total-facility occupancy figure. A 200-space garage with a closed level of 40 spaces that fills its remaining 160 is 100% full, not 80%. State which capacity you used.

    Deriving “occupied” from “available” works only if both describe the same spaces at the same time. Many systems report empty spaces rather than occupied ones. Occupied = capacity − available is correct only when the capacity and the available count cover the same set of spaces and were recorded at the same moment.

    For gate or entry/exit systems, count the accumulation. Occupancy at a given time = the starting count + entries − exits. If 40 cars are inside at 6:00 AM, 180 enter and 95 leave by 10:00 AM, accumulation is 125 cars inside at 10:00. Divide that by usable capacity to get the occupancy rate. Accumulation drifts over time (more on that below), so it needs a regular reset against a physical count.

    Before You Calculate: Check What Your Data Means

    I’m building an analytics project on Istanbul’s municipal parking network, which publishes a live feed of its facilities with capacity and empty-space counts. Before calculating a single occupancy figure, I audited what the feed actually returns. The arithmetic turned out to be the least of it.

    Here’s a real reading from one snapshot on 2026-08-22. Facility 3068, an enclosed garage listed as open 24 hours, reported a capacity of 1,029 and 589 empty spaces at 02:31 Istanbul time. That’s 1,029 − 589 = 440 occupied, or 42.8%.

    The calculation took one line. The audit found five things that would have made numbers like that wrong without anyone noticing:

    1. Invalid requests return a normal-looking record. Asking for a facility ID that doesn’t exist returns a record with a capacity of 1 and 1 empty space instead of an error. Included in a calculation, it looks like a tiny, empty lot. Lesson: define what a valid record looks like and reject the rest before you calculate.
    2. The facility list has no timestamp. The list doesn’t say when each reading was taken. Lesson: if the source doesn’t timestamp a reading, record the time you retrieved it. A reading you can’t place in time can’t be part of a peak.
    3. A status field has no documentation. The isOpen field is 0 for most facilities, including facility 3068, which lists 24-hour operation. Lesson: don’t guess what an undocumented field means. Leave it out until you can confirm it.
    4. A time field has no timezone. The detail record’s update time doesn’t say which timezone it’s in. Lesson: confirm timezones before comparing readings from different sources.
    5. There’s no history. The feed shows only the current state. Lesson: covered in its own section below.

    Your data will have different quirks, but the questions carry over to any lot, garage, or system:

    • What exactly does “capacity” include? Does it change when spaces close?
    • What does “available” or “empty” mean, and does it cover the same spaces?
    • Where does each reading’s timestamp come from, and in what timezone?
    • What does an invalid, closed, or offline record look like?
    • Does the source keep history, or only the current state?

    The project’s code and evidence are public at github.com/johnserra/istanbul-parking-analytics. These figures come from a single audit snapshot. They aren’t a finding about how full Istanbul’s garages are.

    Istanbul parking data source: Istanbul Metropolitan Municipality (IBB) Open Data Portal, 2026-08-22 audit snapshot. The IBB Open Data License v1.0 requires this attribution: “Contains public sector information licensed under the Attribution 4.0 International (CC BY 4.0).”

    Three Ways to Collect Occupancy Data

    Manual counts

    Someone walks the facility on a schedule and counts occupied spaces. It costs staff time and nothing else, and it’s the most direct measurement there is.

    Choose count times from how the facility is used. An office garage, a retail lot, a hospital, and an event venue peak at different times, and a single universal schedule will miss some of them. Count at the times you expect to be busiest, plus a quiet period for comparison, on the days that matter (weekdays, weekends, or both). Record each count with its date and time on a simple sheet.

    Gate, ticket, and payment records

    If your facility has gates, ticketing, or pay-by-plate, you can reconstruct occupancy from entries and exits, usually in 15- or 30-minute intervals. The data already exists, so this is often the best place to start before buying anything new.

    The catch is drift. Tailgating, unreadable tickets, gate arms left up, and cars that exit without being recorded all push the running count off over time. Reset it against a physical count at a known quiet point on a regular schedule, and compare the two to see how far it drifted.

    Sensors, cameras, and live feeds

    Per-space sensors, entry counters, camera counts, and live data feeds give you frequent readings without anyone walking the lot. They’re worth it when a decision needs real-time information, such as guidance signs showing available spaces or prices that change by time of day.

    Automation doesn’t skip the checks above. A sensor feed has its own capacity definition, its own offline states, and its own timestamps, and all of them need confirming. For planning questions that do not need a live feed, start by testing whether counts and existing records answer the question before paying for hardware.

    One Reading Isn’t a Peak: Build Your Own History

    The Istanbul feed only reports the current state, so my project stores a snapshot each time it reads the feed. Without that, there’s no history. The same is true of most live feeds and many gate-system dashboards: they show you now, and “now” disappears.

    Two rules from the project carry over:

    • Keep the raw readings, not only the calculated percentage. If you later find that a capacity figure was wrong or an invalid record slipped through, you can recalculate.
    • Match the claim to the history you have. My project won’t forecast occupancy or trigger capacity alerts for a facility until it has 26 weeks of readings with at least 90% coverage. That’s a high bar for forecasting. For simple peak reporting, the practical version is to say what the peak is based on: “Peak of 96% at 10:30 on Tuesdays, from 18 weekday readings over three weeks” is an honest statement. “Peaks at 96%” from one busy morning isn’t.

    What Counts as “Full”?

    You may see 85% cited as a parking occupancy target. That number comes from a point-in-time curbside-parking context, not a universal goal for lots or garages. For example, SFMTA’s SFpark policy describes a commonly cited 85% curbside threshold at a single moment while using a 60–80% average occupancy target across a longer period to keep spaces available on each block. Those are different measurements and settings; neither gives your facility its own “full” threshold. Practitioners have also questioned relying on any occupancy target alone: in a May 2026 Parking Today piece, Cole Jaillet argues that occupancy is a snapshot rather than a behavior, and that two blocks at the same percentage can serve very different numbers of vehicles depending on how long each stays.

    For a specific facility, set two thresholds from its own history: a “busy” level where drivers start having trouble finding a space, and a “full” level where the facility is effectively out of room. Look at the readings from times you know were difficult (complaints, turned-away drivers, staff reports) and see where occupancy stood. Then report how long the facility stayed above each threshold, not only whether it crossed.

    A Two-Week Occupancy Audit

    If you’re starting from nothing, this gives you a defensible baseline:

    1. Set usable capacity and write down exactly what you counted and excluded.
    2. Choose count times from the facility’s use pattern. Cover weekdays and weekends if both matter.
    3. Record every count or snapshot with its timestamp in one sheet. Keep the raw numbers.
    4. Reconcile counts with transaction and permit records for the same times. Account for vehicles already present, exits, permits, validations, and unpaid sessions before treating a gap as a counting or payment problem.
    5. Report peak, time near capacity, and how many readings each is based on. End with one follow-up action, an owner, and a date.

    Once occupancy is reliable, it can support revenue analysis when you also have revenue records for the same facility and period. Occupancy data alone cannot show what a space earned. A full lot of monthly permit holders and a lot turning over transient drivers can look identical on an occupancy chart while producing very different revenue, which is why revenue per space needs its own treatment.

    Frequently Asked Questions

    What is the formula for parking occupancy rate?

    Occupied spaces ÷ usable spaces × 100, measured at a stated time. Use the spaces actually available at that moment, not the design total.

    How often should parking occupancy be measured?

    Often enough to sample the periods when your facility is likely busiest. For manual counts, that may mean several readings across the expected peak. Automated intervals should match the decision you need to make and the feed’s actual update frequency. State how many days and readings your observed peak covers.

    Is 100% occupancy good?

    Not usually. A lot at 100% is turning drivers away and has no room for permit holders who arrive late. How far below full a facility should run depends on its layout and its customers.

    Can I measure occupancy without sensors?

    Yes. Manual counts and gate or payment records answer most planning questions. Sensors earn their cost when a decision needs real-time data.

  • The KPIs Every Parking Lot Operator Should Track

    Track six metrics: peak occupancy, hours near capacity, revenue per available space (RevPAS), the split between hourly and monthly revenue, operating cost per space, and payment capture rate. Most KPI lists skip a practical point: each metric needs specific data. Occupancy counts support only the first two. RevPAS and the revenue split need revenue records, cost per space needs expenses by facility, and payment capture needs vehicle counts matched to payments. Start with the metrics your data supports.

    This guide covers what each metric tells you, what data it takes, and how to review them without adding reports nobody reads.

    Why Total Deposits Hide What’s Happening

    Many lots are run from one number: how much was deposited this month. It’s the number that matters most in the end, and on its own it explains almost nothing.

    A deposit total can’t tell you whether revenue rose because rates went up or because more cars parked. It can’t separate hourly parkers from monthly permit holders. And it can’t show the Tuesday mornings when the lot was full, and drivers went somewhere else. An empty space during a busy hour is revenue that can’t be recovered later, and a full lot turning drivers away is revenue you never see at all.

    The fix isn’t a long list of metrics. Keep the scorecard to four to seven numbers, depending on the business, and cut any metric that doesn’t move the needle. For parking, each metric should lead to a decision about staffing, pricing, permit allocation, or enforcement. If nobody would change anything when a number moves, it doesn’t belong. How many KPIs a small business should track makes the general case.

    Start With the Data You Have

    Before choosing metrics, check what your data can support. I learned this building an analytics project on Istanbul’s municipal parking data. The city’s parking API reports capacity and empty spaces for about 250 facilities, which is enough to calculate occupancy. It has no revenue, no payments, and no record of when individual cars arrive or leave. So the project leaves out revenue per space, payment compliance, and how long cars stay. Those metrics could be calculated from other data, but not from that feed, and a number the data can’t support is worse than no number: it looks precise and is wrong.

    The same test applies to any lot. Here’s the scorecard with the data each metric needs:

    MetricHow to calculate itData it needsDecision it drives
    Peak occupancyHighest occupied spaces ÷ usable spaces in a periodTimestamped counts or sensor readingsPermit allocation, whether to add or share space
    Hours near capacityHours at or above your “full” thresholdThe same counts, taken at regular intervalsPricing by time of day, overflow plans
    RevPASRevenue ÷ available spaces, for a stated periodRevenue by period; count of spaces actually usablePricing, allocation, comparing facilities
    Hourly vs. monthly mixShare of revenue (and of peak spaces) from each type of parkerRevenue by channel; permit list; ideally counts by parker typePermit limits, pricing
    Operating cost per spaceOperating expenses ÷ spaces, per periodExpenses recorded by facilityStaffing, automation, contract terms
    Payment capture ratePaid vehicles ÷ parked vehicles in spot checksVehicle counts matched to active payments at the same momentEnforcement, signs, fixing payment problems

    Go down the “data it needs” column and mark each row: have it, could get it, or don’t have it. That gives you your starting scorecard, and a short list of what to start collecting.

    Istanbul parking data source: Istanbul Metropolitan Municipality (IBB) Open Data Portal, 2026-08-22 audit snapshot. The IBB Open Data License v1.0 requires this attribution: “Contains public sector information licensed under the Attribution 4.0 International (CC BY 4.0).”

    Metrics 1 and 2: Peak Occupancy and Hours Near Capacity

    Occupancy is the share of usable spaces that are occupied at a given moment. Averaged over a day, it hides the pressure that matters. A lot averaging 55% can be completely full from 9 to 11 every weekday morning, and those two hours are when drivers get turned away and permit holders complain.

    So report two numbers instead of an average:

    • Peak occupancy: the highest reading in each day or week.
    • Hours near capacity: how many hours the lot stayed at or above your “effectively full” level.

    Peak tells you whether you ran out of room. Hours near capacity tells you how long, which is what pricing and permit decisions depend on. One tight hour on Fridays is a different problem from four tight hours every weekday.

    Getting these right depends on counting properly: using usable capacity rather than the number on the sign, timestamping every reading, and building enough history to describe an observed peak and its sampling limits.

    Metric 3: Revenue per Available Space (RevPAS)

    RevPAS is revenue divided by available spaces for a stated period, such as a day or a month. It does two things occupancy and revenue can’t do alone.

    First, it makes facilities of different sizes comparable. A 40-space lot and a 400-space garage can be judged on the same scale.

    Second, it normalizes revenue across available capacity. A lot raises its hourly rate from $5 to $10, and occupancy during those hours falls from 80% to 30%. Measured per space-hour, which is RevPASH (revenue per available space-hour, or occupancy × rate), revenue falls from $4.00 (0.80 × $5) to $3.00 (0.30 × $10). Total revenue over equal hours and capacity would show the decline too; the normalized measure helps compare different facilities or periods. RevPAS is the same idea over a longer period, such as a day or a month. The before-and-after comparison alone does not prove the rate change caused the decline. Before blaming the price, check for events, weather, and day-of-week patterns in the same hours, and for nearby lots’ occupancy if you can get it.

    RevPAS needs revenue by period and capacity over that same period. If spaces open or close during the period, use available space-hours before converting the result into a per-space figure; a single end-of-month space count would distort the comparison.

    Metric 4: The Mix Between Hourly and Monthly Parkers

    Most lots serve two kinds of customers, and they pay differently.

    • Monthly permit holders bring predictable revenue that arrives on schedule. The trade-off is a lower rate per hour of use, and they hold spaces during the busiest hours.
    • Hourly (transient) parkers usually pay more per hour, but demand swings with weather, events, and the day of the week.

    The mix is a decision, not an accident. Track the share of revenue from each, and, if you can, the share of peak-hour spaces each uses.

    Overselling permits

    Permit holders may not all park at the same time. Some work from home, travel, or leave early. An operator may consider selling more permits than the spaces set aside for them, but that decision needs counts and a plan for days when more holders arrive than expected.

    Set the oversell level from your own counts, not from a ratio you read somewhere. Count how many permit holders are present at the busiest time, over several weeks, and use the highest share you see.

    Here is how it works for a 400-space garage that sets aside 250 spaces for monthly permits:

    • Observed peak: over six weeks of counts, the highest simultaneous presence was 75% of permit holders.
    • Buffer: the operator chooses a 10% space buffer, so modeled peak permit parking stays at or below 225 spaces.
    • Permit cap: 225 ÷ 0.75 = 300 permits, or 120% of the 250 spaces.
    • Left for hourly parkers: the other 150 spaces.

    A future day can exceed the observed rate, so this calculation is a scenario to stress-test against unusual days and contractual obligations, not a guarantee of space.

    Recheck the counts regularly. If more permit holders start coming in every day, the safe number of permits drops.

    Metric 5: Operating Cost per Space

    Add up what it costs to run each facility: labor, payment processing, equipment and software, utilities, insurance, sweeping, snow removal, and repairs. Divide by the number of spaces for the period.

    Cost per space lets you compare facilities and spot drift. If one garage costs noticeably more per space than your others, or more than it did last year, find out why before the next contract renewal. The comparison that matters is against your own history and your own other facilities, since a generic industry ratio won’t reflect your labor market, climate, or contract terms.

    This needs expenses recorded by facility, not lumped together. If your books combine several lots, splitting them is the first job.

    Metric 6: Payment Capture Rate

    Payment capture rate is the share of parked vehicles that have paid or been validated. Unpaid parking is lost revenue, and it hides inside an occupancy count, because an unpaid car and a paid car take up the same space.

    Measure it with spot checks: count the vehicles in the lot, then match them against active payments, permits, and validations at the same moment. Paid ÷ parked is the rate. Repeat at different times and days, since compliance often varies.

    This metric needs matched payment data. Occupancy counts alone can’t show it, which is exactly the kind of metric to leave off until you can support it. There’s no universal target. Set one from your own baseline, and when it drops, check signs, payment machines, and apps before assuming drivers are avoiding payment.

    The spot-check rate measures compliance at that moment. If you also issue notices or invoices to non-payers, track separately what share of them is eventually paid. A lot with a low capture rate and a high recovery rate has a different problem from one that is low on both. Whether and how you can pursue unpaid sessions depends on local law and regulation, so treat recovery as its own measure and don’t fold it into the capture rate. Lots that do not use a modern tech stack have no session records to match, so for them the spot check is the only measure available.

    A Weekly Review in Four Steps

    Once the scorecard is set up, a short weekly review keeps it useful:

    1. Occupancy: peak and hours near capacity by facility. Any lot running full for longer than usual?
    2. RevPAS: compared against each facility’s own trailing baseline. Set how much movement counts as normal based on how much the number has actually varied over the past several months.
    3. Mix and capture: permit share, any oversell pressure, and the latest spot check.
    4. Actions: for each facility that’s off track, one action, one owner, and a date.

    The last step is what turns the review into management. How to build a monthly KPI scorecard shows a spreadsheet layout with targets, variances, and status colors that works for a set of lots as well as for a whole business.

    Parking KPI Checklist

    • I know which of the six metrics my current data supports.
    • I report peak occupancy and hours near capacity, not just averages.
    • I calculate RevPAS using spaces that were actually available.
    • I track revenue from hourly and monthly parkers separately.
    • My permit oversell level comes from my own counts.
    • Expenses are recorded by facility.
    • I run payment spot checks at different times.
    • Each weekly review ends with named actions and dates.

    Frequently Asked Questions

    What is the most important KPI for a parking lot?

    It depends on what you’re deciding. For pricing and comparing facilities, RevPAS, because it combines price and use. For capacity decisions, peak occupancy and hours near capacity.

    What is a good occupancy rate for a parking lot?

    It depends on the facility and on what “full” means for it. Set the threshold from its own layout, operating history, and instances when drivers struggled to find a space.

    How often should parking KPIs be reviewed?

    Weekly for occupancy, mix, and capture, since they change quickly and the fixes are operational. Monthly for RevPAS and cost per space, once revenue and expenses are closed for the month.

    What about turnover?

    If you have entry and exit data, turnover (parking sessions per space per day) shows how intensively spaces are used, and it’s useful for lots that serve short visits. It needs session data that many lots don’t collect, so it’s an optional seventh metric.

  • Data Analytics for Property Management Companies

    Data analytics for a property management company means tracking a handful of operating numbers that can affect net operating income (NOI), rather than reading the monthly accounting package after the fact. Five starting measures are physical occupancy alongside rent collected against potential rent, work-order resolution, days vacant between tenants, rent more than 30 days late, and controllable operating expenses per square foot. Choose the ones that fit your portfolio and data; some inputs may already be in your property management software.

    Accounting Reports Tell You What Happened. Operating Metrics Tell You What's Coming.

    Most property management systems produce a thorough monthly package: rent roll, income statement, general ledger, aged receivables. It's accurate, and it's backward-looking. By the time a slow repair or a rising utility bill shows up on the income statement, the tenant is already frustrated or the money is already spent.

    Operating metrics are the leading indicators behind those accounting results. Repair times, turn times, and late balances move weeks or months before NOI does, which gives you time to act.

    The test for including any metric is simple: does it help the property earn more revenue, run more efficiently, or cost less to operate? If it doesn't, leave it off. Keep the scorecard to four to seven numbers so someone actually acts on each one; how many KPIs a small business should track explains why that range holds.

    1. Physical Occupancy and Rent Collected Against Potential Rent

    Physical occupancy is the share of leasable space that has a tenant in it. For this scorecard, use a cash-collection ratio to show the share of potential rent actually collected. Some property reports call a related measure economic occupancy, but definitions vary, so keep the numerator and denominator visible:

    Cash-collection ratio = rent collected for the period ÷ gross potential rent for the same period × 100

    Here, gross potential rent is what the property would bring in if every leasable space were occupied at the documented market-rent assumption for that space and every tenant paid in full. Document that rent basis and use it consistently; scheduled rent in existing leases, billed rent, concessions, and cash collected are different amounts.

    The two numbers can diverge because of vacancy, free-rent concessions, discounts, and unpaid balances. The gap is not all collectible debt: some of it reflects deliberate lease terms or empty space.

    A building is 95% physically occupied. After two months of free rent on a new lease, one tenant well behind on payments, and a discounted renewal, it collects 84% of gross potential rent. The 11-point gap calls for a breakdown of vacancy, concessions, discounts, and overdue rent. The late balance is the part collections can pursue without changing lease terms.

    2. Work Order Resolution Time

    How quickly a routine repair gets fixed is something every tenant experiences, every month, long before the renewal conversation. Track three numbers:

    • Time to first response: hours from the request to someone acknowledging it or being assigned.
    • Time to complete: days from request to closed work order, for routine requests.
    • Open requests past the property's service target: the backlog that needs someone's attention. Set that target by request type and urgency rather than using one cutoff for every repair.

    Watch the trend rather than the average alone. A property whose completion time creeps up quarter after quarter has a staffing, vendor, or parts problem building, even if no single request looks bad. Slow repairs can also weigh on whether a tenant renews, so watch the renewal rate next to these numbers; it connects service back to NOI.

    3. Days Vacant Between Tenants

    Rent lost while a space sits empty doesn't come back. Measure the total days from move-out to the new tenant's lease start, and split it into three stages:

    1. Move-out inspection and scoping: from the keys being returned to a defined list of work.
    2. Make-ready: repairs, paint, flooring, cleaning.
    3. Leasing: from rent-ready to a signed lease and move-in date.

    The split tells you where time goes. If make-ready is the long stage, the question is vendor scheduling. If spaces sit rent-ready for weeks, it's a leasing or pricing question. A shared board listing every vacant space with its current stage and days in that stage is often enough to show the bottleneck.

    4. Rent More Than 30 Days Late

    A late balance is much easier to collect while it's young. The metric is the over-30-day late rate:

    Over-30-day late rate = rent balances more than 30 days past due ÷ rent billed for the month × 100

    Don't wait for the month-end aging report to find it. Send reminders and talk to tenants before balances become overdue. Use the over-30-day bucket as a review trigger; a balance approaching 60 days calls for a more direct follow-up under the lease and collection process. What counts as a normal level depends on the property type and tenant mix, so compare each property against its own history rather than a generic benchmark.

    5. Controllable Operating Expenses per Square Foot

    Some operating costs, like property taxes and insurance, are set outside day-to-day management. Others, like janitorial, landscaping, repairs, and utilities, are controllable. Track those separately and divide by rentable square feet so you can compare properties of different sizes and each property against its own past months.

    Unexplained changes are the trigger. Water cost per square foot at one building runs 40% above the same month last year with no change in occupancy. That's a reason to walk the building before the next bill: a running toilet, an irrigation zone stuck on, or a meter reading that needs checking. The metric doesn't diagnose the cause. It tells you where to look.

    How to Start Without Buying New Software

    You probably have all five metrics' raw data already.

    1. Export what you have. Rent roll, aged receivables, work order history, and the general ledger by property are standard exports from most property management systems. Put them into one spreadsheet, one tab per export.
    2. Build one screen. Five metrics, one row per property, each with a target, the current value, and a green, yellow, or red status. How to build a monthly KPI scorecard shows the layout.
    3. Review it weekly or monthly with the people who can act. The review is a short conversation about what the numbers mean, who will act on them, and by when. How to get your team to actually use your reports covers running that meeting.

    Stay in the spreadsheet while it gives the team a reliable, timely view. If recurring exports and reconciliation consume more staff time than a reporting tool would save, or multiple systems make errors hard to catch, evaluate an upgrade against those actual costs.

    If your portfolio includes parking, its operating metrics need their own scorecard. The KPIs every parking lot operator should track covers capacity, utilization by hour, revenue per space, and payment capture, which may matter there alongside property-level measures.

  • How to Track Where Customers Came From for Free

    You can learn where customers come from without paying for attribution software. Use four pieces together: tagged campaign links (UTM parameters) on external links you control, and the referrer and channel reports in the analytics tool you already have. Add a “How did you hear about us?” question on your contact form and in your first conversation, and keep one spreadsheet that records each lead’s source next to its eventual value. The tags and reports provide partial evidence about digital visits. The question can reveal word of mouth and context software misses. The spreadsheet connects those clues to sales records.

    That’s the setup I use: tagged links, the referrer reports in my analytics tools, and a “how did you hear” question. Below is how to set each piece up, how to reconcile them when they disagree, and how to turn the results into decisions.

    Why Expensive Attribution Software Rarely Fits a Small Business

    Attribution software tries to credit each sale to every ad, email, and page visit that led to it. It’s built for businesses with large ad budgets and thousands of transactions a month, where small percentage shifts in spend are worth modeling.

    A small business often has too few comparable sales across channels to justify complex attribution modeling, especially when its sales cycle is long. There is no universal customer-count cutoff; the useful sample depends on the decision and how much data each channel produces. Customers may also arrive through channels software can’t see: a recommendation at dinner, a podcast mention, or a forwarded email. Privacy settings, ad blockers, and people switching between phone and laptop break the trail further.

    My view is to stay on free tools for as long as they cover what you need. For customer sources, they can cover the first useful decisions. Paying for a platform before you’ve tried a disciplined free routine may buy a more expensive version of the same blind spots.

    Piece 1: Tag the Campaign Links You Control

    A UTM parameter is a label added to the end of a web address. When someone clicks the link, your analytics tool reads the label and records where the visit came from. Nothing changes for the visitor; they land on the same page.

    A tagged link looks like this:

    https://example.com/services?utm_source=newsletter&utm_medium=email&utm_campaign=2026_10_newsletter

    Three tags are enough:

    TagWhat it recordsExamples
    utm_sourceWho or what sent the visitnewsletter, linkedin, x, chamber_directory
    utm_mediumThe type of channelemail, social, referral, cpc, print
    utm_campaignThe specific effort2026_10_newsletter, fall_workshop

    Google’s free Campaign URL Builder assembles the link for you: paste the page address, fill in the three fields, and copy the result. Most email tools and link shorteners can also add tags automatically.

    Naming rules that keep the data clean

    • Use lowercase everywhere. Analytics tools treat LinkedIn and linkedin as two different sources, and your report splits in half.
    • Pick underscores or hyphens and use the same one everywhere, never spaces. fall-workshop and fall_workshop are reported as different campaigns.
    • Use standard medium names like email, social, cpc, and referral. GA4 uses the medium to sort visits into channels, and a made-up value like newsletter_blast can land in “Unassigned.”
    • Keep a list. One tab in a spreadsheet with every tagged link, the date, and what it was for. When three people create links, the list is what keeps x from becoming twitter and X_posts by spring.
    • Don’t tag links between pages of your own site. Internal UTM tags can distort campaign or source attribution; they are meant for incoming campaigns.

    Where to use them: newsletters, social posts and profile links, directory listings or partner links you manage, email signatures, and ads where manual tags make sense. Tag external campaign links you control; search results, independent editorial links, and links you cannot edit are outside this routine.

    Piece 2: Read the Referrer Reports You Already Have

    Tagged links only cover links you created. Your analytics tool may record a referring website or app for other visits when the referrer is passed and tracking is allowed. Referrer reports are useful, but they do not identify every source.

    • In GA4: Find the Traffic acquisition report (under Reports → Acquisition in the Life cycle collection). Change the dimension to Session source / medium to see individual sources, or Session campaign to see your tagged campaigns. Other report collections can place it elsewhere.
    • In privacy-focused tools like Umami or Plausible: the referrers or sources panel on the main dashboard, with UTM values usually shown alongside.

    Two things to know about referrer data:

    1. “Direct” is partly a catch-all. It includes people who typed your address, but also visits where the tool couldn’t tell the source, such as links in some messaging apps, documents, and email clients. A large “Direct” number means some of your sources are hidden, not that everyone already knew you.
    2. It shows the last step, not the story. Someone who read your article in March, forgot about it, and searched your name in May shows up as organic search or direct. The analytics are correct about the click and silent about why they came back.

    That second gap is why the next piece matters.

    Piece 3: Ask Customers How They Heard About You

    No tracking code sees a conversation over coffee, a recommendation in a group chat, or a podcast mention. The customer knows. Ask them.

    On the contact form

    Add one field: “How did you hear about us?” Make it an open text box, and make it optional so it doesn’t cost you inquiries.

    An optional open-text field can capture more detail than a fixed dropdown. It also takes time to classify consistently, so choose the format that your team will actually review. A long list of vague options (“Social media,” “Search engine,” “Friend”) can hide a useful name or story.

    • A dropdown records “Social media.” Open text records “Saw your post about month-end reports on LinkedIn, then looked you up.”
    • A dropdown records “Referral.” Open text records “My accountant, Priya, said you’d sorted out her client’s reporting.”

    The second version tells you which post worked and which relationship to thank.

    In the first conversation

    Ask again, in person or on the call, even if they filled in the form: “Before we start, who can we thank for sending you our way?” People often give a fuller answer out loud, and phone inquiries never touch the form at all. If whoever answers the phone doesn’t ask, phone leads have no source.

    Piece 4: One Spreadsheet That Ties Sources to Revenue

    Website analytics generally stops before the final sale. Revenue lives in your sales records. The spreadsheet is where the two meet. A shared Google Sheet or Excel file is enough; a CRM you already pay for works too.

    One row per lead, with these columns:

    ColumnWhat goes in it
    DateWhen they first reached out
    LeadName or company
    Recorded sourceWhat the analytics or UTM tag says (e.g., newsletter / email, google / organic, (direct))
    Stated sourceWhat they told you on the form or the call
    Credited sourceYour decision, from a short fixed list (see below)
    StatusOpen, won, or lost
    ValueContract or first-order value, once known

    The recorded source is the column that needs a deliberate setup. Analytics tools show UTM tags in aggregate reports, not next to an individual lead’s name. If your form tool supports hidden fields, it can pass the UTM values from the page address into the notification email or CRM entry, which fills this column automatically. If it doesn’t, leave the column blank and rely on the stated source rather than guessing.

    Keep the credited source list short so the monthly totals mean something. For most service businesses, five categories are enough: website and content, referrals and word of mouth, direct outreach, partners and community, and paid ads.

    When recorded and stated sources disagree

    They often will. Treat the customer’s answer as one clue about why they remembered you and analytics as one clue about the visit path. Neither is a complete causal history.

    • Recorded source: (direct) / (none)
    • Stated source: “Read your article on dashboard mistakes a few weeks ago, then typed your name in.”
    • Credited source: website and content. The article started it; the direct visit was just how they came back.

    When there’s no stated source, use the recorded one as a working classification. When neither exists, mark it “unknown” rather than guessing. Recorded and stated sources are clues, and a customer’s memory can also be incomplete. Your credited-source column is a consistent management judgment, not proof that one channel caused the sale. A growing “unknown” count is a prompt to check whether the question is being asked and recorded.

    If your inquiries arrive by email, phone, and form, you probably already have most of this information scattered across your inbox and invoicing system. The business data you already have covers pulling it together.

    Tracking Offline Sources for Free

    Print, events, signs, and phone calls need a little more setup, but none of it costs money.

    • A memorable redirect. Set up a short address like yourfirm.com/workshop that forwards to a tagged link (?utm_source=fall_workshop&utm_medium=print). Most website platforms can create redirects without a developer. Put the short address on the flyer or slide, and test it first: open it in a private browser window and confirm the tag is still in the address bar after it forwards.
    • QR codes pointing to tagged links. Static QR codes are free to generate. Test the code before printing, and point it at a page on your site so you control where it goes.
    • A standard phone question. Whoever answers asks the same “who can we thank?” question and records the answer in the spreadsheet.

    The Monthly Source Review

    Once a month, filter the spreadsheet to that month’s leads and total them by credited source: how many leads, how many won, and how much revenue.

    Credited sourceLeadsWonRevenue
    Referrals and word of mouth53$13,500
    Website and content72$6,000
    Partners and community21$4,000
    Paid ads40$0
    Unknown20$0
    Total206$23,500

    Before changing a channel, look at how many leads and sales you actually have, how long they take to close, and what that channel costs in money and time. A month may be enough to spot a broken tracking link but too little to judge a long sales cycle. Choose a review window and a time or spending limit in advance; if a source still produces no useful leads over that window, investigate whether to change or pause it.

    Put the headline numbers on your monthly scorecard: leads and won revenue by source. Keep the underlying recorded and stated sources available so you can revisit a classification when new information appears.

    Free Source-Tracking Checklist

    • External campaign links I control carry consistently named, lowercase UTM tags.
    • I keep a list of tagged links and their naming conventions.
    • I check source / medium or referrer reports monthly.
    • My contact form has an optional, open-text “How did you hear about us?” field.
    • Whoever takes calls asks the same question.
    • Every lead goes in one spreadsheet with recorded, stated, and credited sources.
    • Won deals have a value recorded.
    • I review leads and revenue by source monthly and decide quarterly.

    Frequently Asked Questions

    What are UTM parameters?

    Labels added to the end of a link that tell your analytics tool where the click came from. The three that matter are source, medium, and campaign.

    Do UTM tags affect SEO?

    Not when you use them on links you share elsewhere. Don’t use them on links between your own pages.

    What if customers don’t answer the “how did you hear” question?

    Some won’t. Keep it optional, ask again in the first conversation, and fall back on the recorded source. Mark the rest “unknown” and watch whether that count is growing.

    Is a dropdown ever better than open text?

    When you have a large number of inquiries and need clean categories automatically. Even then, add an “Other (please specify)” option. For most small businesses, open text plus your own credited-source column works better.

    When is paid attribution software worth it?

    When you make repeated budget decisions across several channels, have enough conversion data to evaluate the model’s output, and the expected benefit exceeds the software and operating cost. Test whether the tool answers a decision your free routine cannot.

  • Google Analytics 4 Explained for Business Owners

    Google Analytics 4 (GA4) organizes the interactions your tag is configured to collect as events: page views, certain scrolls and clicks, and form submissions when those events are captured. Most of its interface can wait. Start with Traffic acquisition (where visits came from), Pages and screens (what people viewed), and a check that your most valuable actions are recorded as key events. Key events are a setting and metric used across reports, not a separate report.

    Those are the GA4 views and key-event numbers I check on johnserra.com. The rest of this guide explains how GA4 counts things, where to find the reports in a common menu layout, how to test tracking, and what you can safely skip. The examples use a made-up bookkeeping firm, not a real site.

    Why GA4 Feels Confusing

    If you used the older version of Google Analytics (Universal Analytics, whose standard properties stopped processing data on July 1, 2023, with historical access ending in 2024), you may remember reports built around sessions and pageviews. You opened it, and a dashboard told you how many visits you'd had and which pages they saw.

    GA4 counts differently. Every interaction is an event, and each event has a name:

    • page_view when a page loads
    • scroll when 90% of a page becomes visible, if enhanced measurement is enabled
    • click when someone follows a link to another website
    • form_submit for supported form interactions when enhanced measurement catches them; generate_lead is a separate recommended event that you set up

    Google built it this way so websites and mobile apps could be measured in the same system. The cost for a small business is that GA4 is more flexible and less obvious. Reports you'd expect aren't always on the menu, the vocabulary changed, and some of the most visible features are meant for people who analyze data full time.

    The good news is that you need very little of it.

    A Plain-English Translation Table

    What you might call it What GA4 calls it What it means for you
    Visits Sessions A period of activity on your site by one visitor
    Unique visitors Users (or active users) Distinct browsers or devices, not exactly distinct people
    Pageviews Views (the page_view event) A page loaded
    Goals or conversions Key events An action you've marked as valuable, like a form submission
    Where a visit came from Session source / medium, or session default channel group The site, search engine, or campaign that sent the visit
    Bounce rate Engagement rate (bounce rate is its inverse) Share of visits that showed real interest

    Two of these need a closer look.

    Users aren't people. GA4 counts browsers and devices. Someone who visits on a phone at lunch and a laptop that evening can count as two users. Treat user counts as approximate.

    Engagement replaced the old bounce rate. GA4 counts a session as engaged if it lasted longer than 10 seconds, included a key event, or included at least two page views. Engagement rate is the share of sessions that were engaged, and GA4's bounce rate is simply the rest. A visitor who reads one article for three minutes now counts as engaged, which is closer to how you'd judge it yourself.

    Report 1: Traffic Acquisition (Where Did Visitors Come From?)

    Where to find it in the Life cycle collection: Reports → Acquisition → Traffic acquisition. A property using a Business objectives or customized collection may place the same report elsewhere; use the report library or ask an Editor to add it if it is missing.

    This report answers "which sources are sending visitors, and do any of them produce inquiries?" Each row is a channel. The default grouping is called session default channel group, and for a small business the common rows are:

    • Organic Search: unpaid results from Google, Bing, and other search engines
    • Direct: someone typed your address, used a bookmark, or GA4 couldn't tell where they came from
    • Referral: a link on another website
    • Organic Social: unpaid posts on social platforms
    • Paid Search and Email, if you run ads or send newsletters

    The columns that matter are Sessions, Engaged sessions, and Key events.

    The one habit that changes how you read it: sort by key events, not sessions. GA4 sorts by volume by default, so the channel sending the most visitors sits at the top whether or not those visitors ever contact you.

    Last month, Organic Social sent 900 sessions and 2 key events. Referral, mostly from a local business association's member directory, sent 140 sessions and 6 key events. Sorted by sessions, social looks like the winner. Sorted by key events, the directory listing is doing three times the work with a sixth of the traffic.

    "Direct" deserves some skepticism. It includes typed addresses and bookmarks, but also visits GA4 couldn't attribute, such as links in some apps and private messages. If you share campaign links in newsletters or social posts, tag the links you control with UTM parameters so those visits can be identified. A tagged newsletter link looks like https://example.com/services?utm_source=newsletter&utm_medium=email&utm_campaign=october-update. Google's free Campaign URL Builder assembles these for you. Don't add UTM tags to links inside your own site, because that overwrites the original source of the visit.

    Report 2: Pages and Screens (What Did They Look At?)

    Where to find it in the Life cycle collection: Reports → Engagement → Pages and screens. In other report collections, look for Pages and screens by name.

    This report lists every page on your site with its views, users, and average engagement time. It answers "which pages get attention?"

    Read it with two questions:

    1. Are my commercial pages getting seen by the right visitors? A service page can work without ranking near the top by total views. If it gets few views and few inquiries, check whether visitors can reach it from relevant entry pages.
    2. Which pages deserve a closer look? Average engagement time estimates how long the page was in the foreground. Read it alongside the page's purpose and useful actions; low time alone does not show that the headline failed.

    To see which pages people arrive on, rather than every page they view, use the Landing page report (under Reports → Engagement in the Life cycle collection). Its placement may differ in your property. That report can show key events by landing page, so you can investigate which entry pages lead to inquiries.

    Its most-viewed page is an article on year-end payroll deadlines, with 600 views and no key events. Its "Monthly bookkeeping" service page has 90 views and 5 key events. The article may be drawing readers who have no obvious next step. A short line near the end, linking to the service page, is a better use of an hour than writing another article.

    Check 3: Key Events (Did Anyone Contact You?)

    A GA4 setup without useful key events tells you about visits but little about whether visitors took the actions you care about. Key events connect those actions to the acquisition and page reports above.

    What should count as a key event

    For most small businesses:

    • A completed contact form
    • A click on your phone number (tel: link) from a mobile device
    • A booked appointment, if you use a scheduling tool
    • A purchase, if you sell online

    Pick the two or three actions that genuinely lead to revenue. Marking every click as a key event makes the number meaningless.

    How to mark an event as a key event

    1. With Editor access to the property, go to Admin → Data display → Events.
    2. Find the event, such as form_submit or generate_lead.
    3. Mark it as a key event by clicking the star icon next to it.

    This only works for events GA4 is already recording. GA4's enhanced measurement can record some form submissions automatically, but it doesn't catch every form, and phone clicks usually need an extra tag. It can also fire on the wrong thing, such as a search box or newsletter field. Forms embedded from other tools (HubSpot, Typeform, Calendly) or shown in popups often go unrecorded, so they usually need manual event setup.

    If your event isn't in the list, it may simply not have fired yet, so run the test in the next section first. If it still doesn't appear, the setup is incomplete, and whoever built your site or manages your tags needs to add it.

    A common fallback is a "thank you" page after the form. Don't mark page_view itself as a key event, because that would count every page load. Instead, create a new event under Admin → Data display → Events → Create event that fires only when the page location contains your thank-you page's address (for example /thank-you), and mark that new event as the key event.

    Marking a key event only counts from that day forward. It doesn't backfill earlier data, so set it up before you judge results.

    Where to see them

    Once marked, key events appear as a column in Traffic acquisition and the Landing page report, and in the event reports under Reports → Engagement.

    How to Check That Tracking Works in Two Minutes

    Before trusting any of these numbers, confirm GA4 is recording what you think it is:

    1. Open your website in a private or incognito browser window.
    2. In your normal browser, open GA4 and go to Reports → Realtime.
    3. In the private window, submit a test form or tap your phone link on a mobile device.
    4. Watch the Event count by Event name card in Realtime. Realtime typically updates within minutes; allow for a short delay.
    5. Check that the same event shows up as a key event.

    If Realtime is inconclusive, GA4's DebugView (Admin → Data display → DebugView) shows each event as it arrives from a device in debug mode, and Google Tag Manager's preview mode or Tag Assistant can turn that on.

    If nothing appears after several minutes, investigate before concluding that tracking is broken. Confirm you opened the intended property and data stream, check the site's tag and consent state, and see whether an internal-traffic filter hid your test. A phone on mobile data can help test outside an office filter. If the action still does not appear, inspect the event setup.

    Delete or mark your test submission in whatever system receives the form, so it doesn't count as a real inquiry.

    What to Skip

    GA4 has a lot of features that are useful to someone. For most small businesses, these can wait:

    1. Explore. A drag-and-drop workspace for building custom analyses: funnels, paths, free-form tables. It's powerful and meant for analysts. The standard reports answer the owner's questions.
    2. Watching Realtime. It's useful for testing, as above. As a daily habit, watching who's on your site right now is entertaining and rarely changes a decision.
    3. Predictive metrics and audiences. GA4 can predict purchase and churn likelihood, but only when a site has enough purchase and return history to meet Google's minimums, which most small business sites don't.
    4. Monetization reports, unless you sell online. Service businesses don't have the data these reports need.
    5. Demographics and tech details. Browser versions, screen sizes, and age brackets are occasionally useful for a site redesign. They don't belong in a monthly review.

    A Five-Minute Monthly GA4 Check

    Once a month:

    1. Set the date range to last month and turn on comparison with the preceding period.
    2. Open Traffic acquisition and sort by key events. Note total key events and the top three channels by key events.
    3. Open the Landing page report. Check that your main service pages and best articles are still bringing in engaged visits and key events.
    4. Copy the numbers onto your scorecard. My rule is four to seven metrics, depending on the business, and none that don't move the needle. Choose website numbers that support a decision rather than copying every GA4 card.
    5. Close GA4 until next month, unless you're testing a specific change.

    If your scorecard lives in a spreadsheet, how to build a monthly KPI scorecard shows a layout that holds website numbers alongside the rest of the business.

    Do You Need GA4 at All?

    GA4 is free, detailed, and the default choice. It's also complicated, and it sets cookies, which may mean a consent banner depending on where your visitors are. Simpler privacy-focused tools like Umami and Plausible show pages, sources, and events with far less to learn, and I use Umami on a second site. What matters is that whatever tool you use can show three things: where visitors came from, which pages they landed on, and whether they contacted you.

    If you're using GA4 already, start with the two reports and key-event check above. It costs nothing to use the standard product, and staying with a tool that covers your needs is usually the right call for a small business.

    Frequently Asked Questions

    What happened to conversions in GA4?

    Google renamed them key events in 2024. The term "conversions" now refers to key events used in Google Ads. For your own website reporting, key events are what you want.

    Does GA4 still have bounce rate?

    Yes. GA4 defines bounce rate as the share of sessions that weren't engaged, the opposite of engagement rate. You can add it to reports, but engagement rate tells you the same thing.

    Why don't my GA4 numbers match my other tools?

    Different tools count visitors and sessions differently, ad blockers and consent choices hide some visits from GA4, and each tool handles bots its own way. Use each tool's numbers consistently over time rather than trying to make them agree.

    How long does GA4 keep my data?

    Standard reports keep aggregated data. Explorations are limited by a data retention setting (Admin → Data collection and modification → Data retention) that defaults to two months. Change it from 2 months to 14 months, the longest option in a standard property, if you might use Explore later. The setting doesn't affect standard reports.

    Do I need Google Tag Manager?

    Not for the basics. The GA4 tag and enhanced measurement cover page views, scrolls, outbound clicks, and some form submissions. Tag Manager helps when you need events GA4 doesn't collect on its own, such as phone clicks or a form that enhanced measurement misses.