
A small business can spend a surprising amount of money trying to find out whether its marketing makes money. There is a certain efficiency to losing money in two departments at once.
Before buying another platform, build a basic tracking system with what you already use: a spreadsheet, your sales records, and a CRM if you have one.
The job is to connect four things: the campaign, its full cost, the customers associated with it, and the money left after serving those customers. Here is how to keep that connection from falling apart.
Give every campaign one name
Choose a campaign ID before anything launches. Something like 2026-11-maintenance-offer works. Use that exact ID in your cost sheet, link tags, and lead records.
Then set a simple UTM convention for external campaign links. Google documents manual UTM tagging as a way to collect traffic-source information in Analytics.
utm_source: where the link appears, such aslinkedinorcustomer-newsletter.utm_medium: the channel, such aspaid-socialoremail.utm_campaign: your campaign ID.utm_content: an optional label for the creative or placement.
Use lowercase, avoid spaces, and keep a short approved list. Otherwise, “LinkedIn,” “linkedin,” and “LI” become three fascinating ways to make your reporting worse. Align your medium names with your analytics system’s channel rules, then verify where a test visit appears.
Keep one tab of approved links. Click each one before launch and confirm that redirects preserve the tags. If an ad platform already uses automatic tagging, check its integration before adding manual tags. Use campaign tags on incoming campaign links, rather than links between pages of your own website.
Keep a cost ledger that includes the inconvenient costs
Create one row per expense, with the campaign ID, expense date, category, amount, and supporting record. Include ad spend, contractors, creative production, allocated software costs, and internal labor using a consistent hourly cost.
Shared costs need a documented allocation rule. If two campaigns split a designer’s time equally, split that expense equally. The rule can be simple. It cannot change whenever the result looks disappointing.
Record costs as they happen and reconcile them against invoices and platform billing monthly. An ad dashboard cannot tell you what your freelancer charged.
Connect leads to sales with a stable ID
Give each lead a stable internal ID, then connect that ID to the eventual customer or order record. Keep contact details in a restricted CRM or customer system, with appropriate access controls.
Your tracking sheet should contain:
- Lead ID, campaign ID, and captured source.
- Lead-created date and the original source evidence.
- Qualified status and qualification date.
- Sales status, such as open, won, or lost, with its update date.
- Customer or order ID and sale date.
- Revenue, refunds, variable fulfillment costs, and resulting contribution before marketing.
- The reporting cutoff date.
Define “qualified” before counting it. For a local service company, that might mean someone in the service area requesting a job you actually offer. A form submission asking for employment is still a form submission. It is not a sales opportunity.
Capture campaign information with the inquiry where your setup permits it, and test that handoff. Ask “How did you hear about us?” as a second source. Keep that answer separately from the tracked source rather than silently replacing it.
Respect consent choices and collect only what you need. Never put names, email addresses, phone numbers, or other personal information in UTM tags or URLs. Google’s guidance explains how to avoid sending personally identifiable information to Analytics.
Give sales time to happen
Choose a measurement window that fits your sales cycle. A hypothetical business might review leads created in November and follow their sales through January 31.
Label that report “November leads, outcomes through January 31.” Do not compare those mature results with December leads that have had two weeks to buy.
Keep open opportunities separate from completed sales. Update refunds and cancellations when they arrive, and mark earlier reports provisional if adjustments remain possible.
Build one useful summary
Here is a hypothetical campaign summary. These figures are invented to demonstrate the method.
| Measure | Amount |
|---|---|
| Leads / qualified leads / customers | 40 / 16 / 4 |
| Sales revenue | $12,000 |
| Refunds | $1,000 |
| Variable fulfillment costs | $5,000 |
| Contribution before marketing | $6,000 |
| Full marketing cost | $3,000 |
| Attributed marketing ROI | 100% |
The calculation is ($6,000 − $3,000) ÷ $3,000 = 100%. Subtract refunds and fulfillment costs once to establish contribution before marketing. Then subtract the full marketing cost. For choosing the right inputs, see how to calculate marketing ROI.
Use one attribution rule consistently, document it, and prevent duplicate sales credit. Keep unknown sources visible. A tidy guess is still a guess.
This report shows outcomes associated with a campaign. It does not prove the campaign caused every sale. Existing demand, referrals, and earlier marketing can contribute. Establishing incremental impact requires additional evidence. See how to build a credible case for marketing’s impact.
Make the routine small enough to maintain
Each week, check new lead sources and update sales statuses. Each month, reconcile costs, sales, refunds, and missing records. Assign one owner. “Everyone keeps it updated” usually means the spreadsheet has been abandoned politely.
Start with the marketing ROI worksheet and adapt it to your business. Then decide what return your margins actually require. If you need help making sense of the numbers or deciding what to change, work with me on your marketing. Buy more software when a specific limitation earns the expense.



