The 24-Hour Rule: Tracking Impulse Purchase Delays in Beancount

I’ve been implementing the 24-hour rule to curb impulse spending, and I realized Beancount is perfect for tracking whether this strategy actually works!

The 24-hour rule is simple: before making any non-essential purchase over a threshold (mine is $50), wait at least 24 hours. Research on “delay discounting” shows that this cooling-off period lets your cognitive resources reset and often the urge to buy fades entirely.

My Implementation

Recording the Impulse

When I want to buy something but force myself to wait, I record it:

2026-02-15 note Assets:Checking "WANTED: Sony WH-1000XM5 headphones - $349"
  item: "Sony WH-1000XM5"
  impulse-date: 2026-02-15
  impulse-price: 349.00 USD
  reason: "Saw ad on Instagram"
  status: "waiting"
  review-date: 2026-02-16  ; 24 hours later

The Review Decision

After 24-48 hours, I revisit and update the status:

2026-02-16 note Assets:Checking "DECIDED: Sony WH-1000XM5 - PASSED"
  item: "Sony WH-1000XM5"
  impulse-date: 2026-02-15
  decision-date: 2026-02-16
  decision: "passed"
  reason: "Realized my current headphones work fine"
  saved: 349.00 USD

Or if I decide to buy:

2026-02-16 * "Amazon" "Sony WH-1000XM5 - deliberate purchase"
  item: "Sony WH-1000XM5"
  impulse-date: 2026-02-15
  decision-date: 2026-02-16
  decision: "bought"
  wait-hours: 26
  Expenses:Electronics                     349.00 USD
  Liabilities:CreditCard:Chase            -349.00 USD

Tracking Effectiveness

How Much Have I Saved?

SELECT sum(number(meta("saved"))) as total_saved
WHERE meta("decision") = "passed"
  AND year = 2026

So far this year: $1,247 saved by just waiting!

Pass Rate

SELECT meta("decision") as outcome, count(*) as count
WHERE meta("impulse-date") != NULL
  AND year = 2026
GROUP BY 1

My results:

  • Passed (didn’t buy): 12
  • Bought: 4
  • Pass rate: 75%

Three out of four impulse urges fade when I just wait. That’s powerful data!

Questions for the Community

  1. What threshold do you use? I do $50, but some use $25 or $100. For big purchases ($500+), I extend to 30 days.

  2. How do you categorize “impulse” vs. “planned”? Sometimes lines blur.

  3. Do you track regret? For items you bought, do you later note whether it was worth it?

  4. Better metadata approach? Is there a cleaner way to track this workflow in Beancount?

This is brilliant! I’ve used the 24-hour rule for years but never thought to track it systematically. The data really validates the approach.

My Tiered Waiting System

I use different waiting periods based on purchase size:

Purchase Amount Waiting Period
$25-$100 24 hours
$100-$500 72 hours
$500-$1,000 1 week
$1,000+ 30 days

For bigger purchases, I also add a “research required” flag:

2026-02-10 note Assets:Checking "WANTED: New laptop - $1,500"
  item: "MacBook Air M3"
  impulse-price: 1499.00 USD
  wait-days: 30
  research-required: TRUE
  research-tasks: "Compare to competitors, read reviews, check refurbished options"
  review-date: 2026-03-10

Tracking Regret (Yes!)

For items I buy, I revisit them after 30 and 90 days:

; Original purchase
2026-01-15 * "Amazon" "Kindle Paperwhite"
  item: "Kindle Paperwhite"
  Expenses:Electronics                     149.99 USD
  Assets:Checking                         -149.99 USD

; 30-day regret check
2026-02-15 note Expenses:Electronics "REGRET CHECK: Kindle Paperwhite - 30 days"
  item: "Kindle Paperwhite"
  usage: "daily"
  satisfaction: 9
  regret: FALSE
  would-buy-again: TRUE

; 90-day final assessment
2026-04-15 note Expenses:Electronics "FINAL: Kindle Paperwhite - 90 days"
  item: "Kindle Paperwhite"
  total-value-rating: 10
  cost-per-use: "< $1"

This helps me calibrate future decisions. Items with high regret rates from certain categories (clothes for me) get stricter waiting rules.

The “Impulse Trigger” Analysis

I also track WHY I wanted something:

SELECT meta("reason") as trigger, count(*) as occurrences
WHERE meta("impulse-date") \!= NULL AND year = 2026
GROUP BY 1
ORDER BY 2 DESC

My top triggers:

  1. “Saw ad on social media” - 8 times
  2. “Friend has one” - 4 times
  3. “Email sale notification” - 3 times

This tells me where to focus my defenses (unsubscribe from marketing emails!).

Love this approach! The psychological aspect of impulse buying is fascinating, and having data to analyze it is powerful.

My “Wish List” Account Approach

Instead of notes, I use a dedicated account for pending purchases:

2026-01-01 open Assets:Virtual:Wishlist

; When I want something, I "deposit" it to the wishlist
2026-02-15 * "Wishlist" "Added: Sony headphones"
  item: "Sony WH-1000XM5"
  price: 349.00 USD
  added-date: 2026-02-15
  Assets:Virtual:Wishlist                  349.00 USD
  Equity:Wishlist:Pending                 -349.00 USD

; If I decide NOT to buy (most common)
2026-02-17 * "Wishlist" "Removed: Sony headphones - PASSED"
  item: "Sony WH-1000XM5"
  decision: "passed"
  reason: "Don't need it"
  Assets:Virtual:Wishlist                 -349.00 USD
  Equity:Wishlist:Passed                   349.00 USD

; If I DO buy, move to actual expense
2026-02-17 * "Amazon" "Sony headphones - from wishlist"
  item: "Sony WH-1000XM5"
  wishlist-days: 2
  Assets:Virtual:Wishlist                 -349.00 USD
  Equity:Wishlist:Bought                   349.00 USD
  Expenses:Electronics                     349.00 USD
  Assets:Checking                         -349.00 USD

Wishlist Analytics

; Current wishlist total (what I "want" to buy)
SELECT sum(position) WHERE account = "Assets:Virtual:Wishlist"

; Total passed vs bought over time
SELECT account, sum(position)
WHERE account ~ "Equity:Wishlist"
GROUP BY account

This gives me a running “temptation meter” - how much stuff am I resisting?

The FIRE Perspective

For those pursuing financial independence, every impulse purchase that passes review is money that goes to investments instead.

I calculate “freedom gained”:

; Money saved from passed impulses -> invested @ 4% SWR
;  saved = /0.04 = ,725 less needed for FI

When I think “this is actually ,725 of FI progress I’d be giving up,” the purchase decision gets much clearer!