“Our fees are small and monthly.”
Which is exactly why later months must credit the original channel. The report ranks on revenue actually earned, not on a first payment.
For AppFolio
Two funnels run through one account. Match management fees and rent back to the campaigns behind each of them, separately.
CloseRev reads an AppFolio export of management contracts or billed rent — owner or resident contact detail, the amount and the contract date — and joins it to the inquiries that produced them. For a management company the unit of marketing is an owner who signs, not a website visit, and that is the number this puts a channel against. Contracts with no traceable inquiry are reported honestly as Direct / Unknown.
Page updated September 24, 2026.
The gap
Most property management marketing money is spent filling vacancies, and almost none of the reporting separates that from winning new owners — which is the only one that grows the business.
What was sold, to whom, and for how much.
The click, the keyword, the call, and what each one cost.
The file
Three things carry the match: who, how much, and when. Anything else is optional and only changes how the report can be sliced.
Depending on which funnel you are measuring. Both are in AppFolio and both can be exported.
Fees for the owner funnel, rent for the leasing funnel, with a contract-type column so the two can be told apart.
Used consistently between uploads.
The column that separates owner acquisition from leasing. Without it the report has no way to tell the two businesses apart.
Step by step
Written for somebody with AppFolio open in the next tab. Report names vary by edition, so each step says what to look for.
Owner acquisition is the one that grows the portfolio and is almost never measured. Leasing is the one that consumes most of the budget. Owners are the better place to start.
Management fees by owner for the owner funnel; billed rent by resident for the leasing funnel.
An owner's email or a resident's phone is what makes the row matchable.
Confirm the suggested mapping or set it manually.
Paid search, listing syndication, and any referral or agent lists, in one lead file with the source named on each row. Each ranks on the revenue in the sales file.
What comes back
Revenue by channel, the count of sales behind each figure, and an honest bucket for the ones nobody could trace. Sample figures, from the worked example on the Property Management page — not from a AppFolio account.
| Channel | Share | Sales | Revenue |
|---|---|---|---|
| Google Ads | 41 | $148,500 | |
| Meta Ads | 12 | $40,500 | |
| Referral partners | 22 | $76,500 | |
| Direct / Unknown | 52 | $184,500 |
Unmatched sales stay in Direct / Unknown. They are never spread across the paid channels to make the total look better.
The argument
A property manager advertises to owners — people with a property and a problem — and to renters. The two share a brand, a website and usually a Google Ads account, and they have nothing else in common. Owner inquiries are rare, slow and worth years of recurring fees. Renter inquiries are abundant, fast and worth a one-off placement.
Blending them produces a cost per lead that is dominated by renters and therefore says nothing about the owner funnel. Since owner acquisition is the only one of the two that grows the portfolio, that is the more consequential half being left unmeasured.
A contract-type column, mapped as Product / service, separates their revenue in the report and shows how much of each traced to a channel. For a channel ranking inside one funnel, each import's matched-records export carries the channel and the contract type on every row.
One owner signing one door at a modest monthly fee is a trivial-looking event. Held four years, joined by two more doors, and followed by the eventual sale, it is one of the most valuable outcomes the marketing produced all year.
Because the match is on the owner rather than a session, every later month and every additional door credits the channel that won them. That can move the ranking away from whichever channel simply produces the most inquiries — which is the point of doing this at all.
AppFolio's typical customer is a manager with a few hundred doors and no dedicated marketing person. The spend is meaningful, the reporting is a monthly invoice, and the decision about what to keep funding is made on impressions.
This is two exports and an upload. It does not require a data project, a tag on the website, or anybody to change how the software is used day to day.
No integration, no API access, no tracking script, and no historical instrumentation. Because the inputs are records kept for billing, a period that has already finished is as analyzable as the current one.
Uploading last year for the owner funnel is the fastest way to find out whether the owner-acquisition spend produced anything at all.
An owner acquired this year adds doors next year and the year after. That compounding is exactly what makes owner acquisition worth measuring and exactly what makes a single quarter of data useless for measuring it.
Uploading two or three years lets the report show what a channel's owners went on to be worth rather than what they signed. The most expensive owner-acquisition channel can turn out to be the best, if the owners it brings have larger portfolios.
That is not a conclusion anyone can reach from a cost per lead, and it is the conclusion that decides whether the channel survives the next budget review.
Fair questions
Which is exactly why later months must credit the original channel. The report ranks on revenue actually earned, not on a first payment.
Put the referrals in the lead file under their own source name and they rank against paid channels on the same axis.
It does not need to be one. If it exports contracts or fee revenue with a contact detail, an amount and a date, that is enough.
Management fees by owner, or billed rent by resident, with a contact detail and a date.
Yes. A contract-type column mapped as Product / service shows each funnel's revenue and the share traced to a channel; each import's matched-records export carries channel and contract type on every row if you need a ranking per funnel.
Yes. Later months credit the channel that produced the owner.
Yes — map a region or portfolio column as Location.
Yes — feed inquiries go into the lead file under the feed's name.
A year at minimum for the owner funnel, because owner decisions are slow.
No. It is a CSV export and an upload.
Yes, on the same revenue axis as paid channels.
They are reported as Direct / Unknown rather than assigned to a paid channel.
Contact detail, amount and date — whether the row is an owner contract or a resident lease. Statements, work orders and banking detail are not uploaded because the match cannot use them. Encrypted in transit and at rest, per-workspace isolation, deletion in one click.
Two to three years, because an owner's value compounds as they add doors.
Not as a figure: the report reads amounts, not door counts. More doors show up as more fee revenue against the channel that produced the owner.
Yes, with a fee-type column, so leasing and owner acquisition are never blended.
Those doors credit the channel that produced the owner originally, which is the compounding the report exists to make visible.
Yes — agent referrals go into the lead file under each agent's name and rank on fee revenue.
Yes, with a contract-type column. Separate imports would not keep them apart in the report, which reads every import in the date range together; the column does.
Then leasing is the funnel worth measuring, and the owner side is a relationship rather than an acquisition channel. The report handles either shape.
By trade
What the report looks like once the export is in, written for each one.
Other systems
Running more than one system, or comparing? The method is the same and the columns are not.
AppFolio and the other product names and logos on this page belong to their owners and are shown to identify the software a file comes from. CloseRev is not affiliated with or endorsed by them, and connects to none of them: it reads a file you export.
From the blog
A multi-location business that reports one national attribution number is hiding its most important finding. The same campaign performs differently in every market, and the aggregate is an average of things that should never have been averaged.
Read the articleFor a local business the Google Business Profile is often the busiest front door it has: the call button, the directions, the website link. It reports taps, not customers, and since July 2024 it no longer keeps even a list of who rang. How to find out what the listing is actually worth.
Read the articleBefore you blame the matching algorithm, look at how phone numbers are stored on each side. Extensions, country codes, leading zeros and a spreadsheet that decided a number was maths — this is where most attribution quietly fails.
Read the articleStart today
Nothing to install in AppFolio, no API key, and no need to have been tracking anything until now. Last year works as well as this month.