💰 Free Budget Planner · No Account Required

Take control of your money today.

Build a real budget in minutes. See exactly where your money is going — and where it should go.

📥 Monthly Income

Take-home pay
Side income
Other income
Total Income$5,000

📤 Monthly Expenses

Housing/Rent
Food & groceries
Transportation
Utilities
Subscriptions
Entertainment
Total Expenses$3,150

➕ Add a Savings Goal

🎯 My Goals

Add your first goal →

Monthly Income
-
Total take-home
Total Expenses
-
Fixed + variable
Monthly Surplus
-
Available to save
The 50/30/20 Rule

The simplest budgeting framework that works

Most financial experts recommend starting here. It's simple, flexible, and proven.

50%

Needs

Rent/mortgage, groceries, utilities, minimum debt payments, insurance. The essentials you can't cut.

30%

Wants

Dining out, entertainment, subscriptions, travel, hobbies. Things that make life enjoyable.

20%

Savings & Debt

Emergency fund, retirement, extra debt payments, investing for your future.

Get the Complete Budget Playbook

Spreadsheet templates, debt payoff strategies, 3-month action plan, and the apps that make budgeting actually stick.

✅ Playbook on the way!
Best Budgeting Apps

Tools that make budgeting stick

💚 YNABBest Overall

You Need a Budget — the gold standard. Every dollar has a job. Users save an average of $600 in their first two months. Free 34-day trial.

🪙 Monarch MoneyBest Design

Clean, modern budgeting and net worth tracking. Links all accounts, auto-categorizes, and shows trends over time beautifully.

🏦 Credit KarmaFree Forever

Free credit monitoring + basic budgeting. Great starting point. Shows where you spend, flags issues, and tracks your credit score in one place.

💰 Your budget is waiting. Takes 2 minutes to build.

Save Your Budget Report

Enter your email and we'll send your budget breakdown plus our complete money management playbook — free.

* * Or paste the contents inline at the bottom of each HTML file * (the patcher script handles this automatically). * * WHAT THIS TRACKS: * - Page views (every load) * - Referrer site (where visitor came from) * - UTM parameters (campaign, source, medium, keyword, content) * - Time on page (sent when user leaves or switches tab) * - Scroll depth (25%, 50%, 75%, 100%) * - Country & region (via free IP lookup — ipapi.co) * - Device type (mobile / tablet / desktop) * - Browser & OS * - Affiliate link clicks — each link gets a unique ID * (data-aff-id="affiliate-name") tracked individually * - Any button/CTA click tagged with data-track-id="..." * * ALL DATA → Google Sheets (same Apps Script URL as lead capture) * ============================================================ */ (function () { 'use strict'; // ── CONFIG ────────────────────────────────────────────────── // Same URL as your lead capture Apps Script. // The patcher script fills this in automatically. var SHEET_URL = 'YOUR_GOOGLE_APPS_SCRIPT_URL_HERE'; var SOURCE = document.location.hostname || 'unknown'; // ──────────────────────────────────────────────────────────── var sessionId = generateId(); var pageLoadTs = Date.now(); var sentExit = false; var maxScroll = 0; var geoData = {}; // ── UTILITIES ─────────────────────────────────────────────── function generateId() { return Math.random().toString(36).slice(2, 11) + Date.now().toString(36); } function getUtm() { var params = new URLSearchParams(window.location.search); return { source: params.get('utm_source') || '', medium: params.get('utm_medium') || '', campaign: params.get('utm_campaign') || '', term: params.get('utm_term') || '', // keyword from paid ads content: params.get('utm_content') || '' // which ad/banner }; } function getDevice() { var ua = navigator.userAgent; if (/Mobi|Android/i.test(ua)) return 'mobile'; if (/Tablet|iPad/i.test(ua)) return 'tablet'; return 'desktop'; } function getBrowser() { var ua = navigator.userAgent; if (ua.includes('Chrome') && !ua.includes('Edg')) return 'Chrome'; if (ua.includes('Firefox')) return 'Firefox'; if (ua.includes('Safari') && !ua.includes('Chrome')) return 'Safari'; if (ua.includes('Edg')) return 'Edge'; return 'Other'; } function getReferrerType(ref) { if (!ref) return 'direct'; if (/google|bing|yahoo|duckduckgo|baidu|yandex/i.test(ref)) return 'organic-search'; if (/facebook|instagram|twitter|x\.com|linkedin|tiktok|pinterest|youtube/i.test(ref)) return 'social'; if (/clickbank|hop\.clickbank/i.test(ref)) return 'affiliate'; return 'referral'; } // ── SEND EVENT ────────────────────────────────────────────── function send(eventType, extra) { if (!SHEET_URL || SHEET_URL.includes('YOUR_')) return; var utm = getUtm(); var payload = { event: eventType, source: SOURCE, session_id: sessionId, page_url: window.location.href, page_title: document.title, referrer: document.referrer || '', referrer_type: getReferrerType(document.referrer), utm_source: utm.source, utm_medium: utm.medium, utm_campaign: utm.campaign, utm_keyword: utm.term, utm_content: utm.content, device: getDevice(), browser: getBrowser(), screen: window.innerWidth + 'x' + window.innerHeight, country: geoData.country_name || '', region: geoData.region || '', city: geoData.city || '', timestamp: new Date().toISOString() }; // Merge in any event-specific data if (extra) Object.assign(payload, extra); fetch(SHEET_URL, { method: 'POST', mode: 'no-cors', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }).catch(function () {}); } // ── GEO LOOKUP ────────────────────────────────────────────── // ipapi.co free tier: 1,000 req/day. Runs once per page load. function fetchGeo() { fetch('https://ipapi.co/json/', { mode: 'cors' }) .then(function (r) { return r.json(); }) .then(function (d) { geoData = d || {}; // Now fire page_view with geo data included firePageView(); }) .catch(function () { firePageView(); // fire anyway even if geo fails }); } // ── PAGE VIEW ─────────────────────────────────────────────── function firePageView() { send('page_view'); } // ── SCROLL DEPTH ──────────────────────────────────────────── var scrollMilestones = [25, 50, 75, 100]; var firedMilestones = {}; function onScroll() { var scrolled = (window.scrollY + window.innerHeight); var total = document.documentElement.scrollHeight; var pct = Math.round((scrolled / total) * 100); if (pct > maxScroll) maxScroll = pct; scrollMilestones.forEach(function (m) { if (pct >= m && !firedMilestones[m]) { firedMilestones[m] = true; send('scroll_depth', { scroll_pct: m }); } }); } // ── TIME ON PAGE (exit event) ──────────────────────────────── function fireExit() { if (sentExit) return; sentExit = true; var seconds = Math.round((Date.now() - pageLoadTs) / 1000); send('page_exit', { time_on_page_sec: seconds, max_scroll_pct: maxScroll }); } // ── AFFILIATE / CTA CLICK TRACKING ────────────────────────── // Any or