Portfolio — Apartment management app revenue
Apartment management app revenue
As of
- Monthly recurring revenue
- 2.8억
- Year over year
- +40.5%
- Penetration of addressable
- 4.7%
- Gross revenue churn
- 20.4%
- New against churned
- ×3
2026.08
YoY
952 / 18,888
12M
12M
Monthly recurring revenue
A step, not a line. A per-household fee times a household count that does not change is the same number every month until the contract changes, and joining the points with straight segments draws a climb through values the business never billed. That growth arrives in discrete signings is what the step carries.
Usage billings, on their own scale
Revenue movement
The line above cannot lie about its own shape but it can hide what is under it. Subscription revenue rises in all thirty-six months while a substantial share of the closing balance left over the same window. New business covers it every month. How much left is what these columns say.
- New · winback · expansion
- Contraction · churn
Read as numbers
| Month | Subscription | Usage | Complexes | New | Winback | Expansion | Contraction | Churn |
|---|---|---|---|---|---|---|---|---|
| 202309 | 81,994,678 | 2,526,930 | 293 | 2,631,018 | 0 | 411,070 | 0 | 1,863,008 |
| 202310 | 87,943,268 | 4,490,520 | 314 | 5,342,310 | 200,800 | 405,480 | 0 | 0 |
| 202311 | 93,463,640 | 7,221,210 | 335 | 5,468,812 | 0 | 893,380 | 0 | 841,820 |
| 202312 | 98,867,552 | 6,332,430 | 350 | 4,300,204 | 0 | 1,392,288 | 0 | 288,580 |
| 202401 | 102,310,662 | 2,383,005 | 364 | 3,718,680 | 99,600 | 868,730 | 0 | 1,243,900 |
| 202402 | 105,674,152 | 1,718,685 | 381 | 2,876,180 | 0 | 996,470 | 0 | 509,160 |
| 202403 | 110,527,664 | 1,949,295 | 388 | 4,030,112 | 0 | 2,212,480 | 0 | 1,389,080 |
| 202404 | 111,491,530 | 2,092,545 | 398 | 3,266,552 | 0 | 885,280 | 0 | 3,187,966 |
| 202405 | 115,783,122 | 1,936,035 | 418 | 6,139,492 | 0 | 377,840 | 0 | 2,225,740 |
| 202406 | 120,020,626 | 3,218,115 | 431 | 4,025,558 | 163,560 | 1,338,866 | 0 | 1,290,480 |
| 202407 | 121,789,632 | 1,965,615 | 430 | 5,259,902 | 0 | 1,322,660 | 0 | 4,813,556 |
| 202408 | 126,374,436 | 2,389,395 | 443 | 4,944,224 | 0 | 1,165,920 | 0 | 1,525,340 |
| 202409 | 131,178,560 | 4,042,845 | 459 | 6,271,224 | 0 | 707,760 | 0 | 2,174,860 |
| 202410 | 142,014,282 | 6,687,165 | 490 | 11,680,942 | 0 | 479,720 | 0 | 1,324,940 |
| 202411 | 147,652,603 | 10,106,640 | 506 | 4,941,567 | 111,360 | 2,060,074 | 0 | 1,474,680 |
| 202412 | 155,391,439 | 12,655,905 | 521 | 8,443,520 | 0 | 1,313,764 | 0 | 2,018,448 |
| 202501 | 159,275,611 | 2,405,805 | 540 | 5,896,508 | 798,966 | 280,220 | 0 | 3,091,522 |
| 202502 | 168,334,287 | 4,032,240 | 556 | 11,441,616 | 0 | 1,062,420 | 0 | 3,445,360 |
| 202503 | 174,541,947 | 4,546,650 | 573 | 6,036,780 | 0 | 1,078,540 | 0 | 907,660 |
| 202504 | 178,922,137 | 4,117,185 | 588 | 3,860,440 | 0 | 2,217,660 | 0 | 1,697,910 |
| 202505 | 181,349,722 | 3,085,245 | 601 | 3,074,040 | 0 | 1,453,112 | 0 | 2,099,567 |
| 202506 | 189,432,494 | 3,471,165 | 626 | 5,858,220 | 0 | 3,443,012 | 0 | 1,218,460 |
| 202507 | 192,379,402 | 3,264,300 | 644 | 7,975,046 | 0 | 1,161,900 | 0 | 6,190,038 |
| 202508 | 201,459,874 | 3,599,295 | 667 | 7,766,584 | 0 | 1,488,288 | 0 | 174,400 |
| 202509 | 210,592,571 | 4,674,765 | 702 | 12,555,237 | 0 | 2,230,312 | 0 | 5,652,852 |
| 202510 | 214,057,191 | 7,128,390 | 719 | 5,822,476 | 50,000 | 1,464,180 | 0 | 3,872,036 |
| 202511 | 220,056,047 | 17,479,095 | 740 | 7,831,516 | 0 | 663,184 | 0 | 2,495,844 |
| 202512 | 226,493,100 | 16,041,600 | 769 | 6,157,767 | 0 | 1,382,200 | 0 | 1,102,914 |
| 202601 | 227,975,871 | 4,680,780 | 775 | 7,717,170 | 0 | 1,614,960 | 0 | 7,849,359 |
| 202602 | 235,623,836 | 4,858,605 | 801 | 8,141,839 | 236,080 | 1,787,146 | 0 | 2,517,100 |
| 202603 | 243,713,339 | 5,582,895 | 824 | 8,966,761 | 0 | 1,946,352 | 0 | 2,823,610 |
| 202604 | 252,425,943 | 7,604,205 | 856 | 9,098,174 | 564,800 | 2,547,750 | 0 | 3,498,120 |
| 202605 | 264,278,857 | 5,813,925 | 883 | 13,477,474 | 0 | 1,188,680 | 0 | 2,813,240 |
| 202606 | 271,478,265 | 4,012,335 | 913 | 7,227,400 | 0 | 1,693,428 | 0 | 1,721,420 |
| 202607 | 278,115,981 | 6,005,430 | 932 | 8,251,196 | 0 | 1,841,380 | 0 | 3,454,860 |
| 202608 | 283,116,862 | 7,238,100 | 952 | 6,600,380 | 0 | 1,649,304 | 0 | 3,248,803 |
Price per household falls as complexes grow
The bundle is held fixed and only household count varies. The realised tier averages cannot carry this claim: they mix the price structure with whatever those complexes happen to hold, and the largest tier has fewer than twenty accounts, so its average moves when one complex adds a service. Each bundle is therefore indexed to its own list price. The question is not what a bundle costs; it is how far, and in which direction, what a complex actually pays departs from the price list.
- entry · notices only (list 150/household)
- core · notices, collection, parking (list 950/household)
Dots mark where the monthly floor, not the rate card, set the price · x-axis is households
Read as numbers
| Households | entry | core |
|---|---|---|
| 100 | 500* | 950 |
| 150 | 333.3* | 950 |
| 300 | 166.7* | 950 |
| 400 | 150 | 950 |
| 600 | 150 | 950 |
| 900 | 150 | 950 |
| 1,200 | 147.5 | 934.2 |
| 2,000 | 142.5 | 902.5 |
| 4,000 | 132.8 | 840.8 |
| 6,000 | 129.5 | 820.2 |
What the tiers actually billed
Per complex on the left, per household on the right. The two run in opposite directions. A tier that departs from the ladder beside it is buying more or less than the reference bundle, which is a different finding and needs its own sample size — so the account count sits in the table.
Monthly revenue per complex
Monthly revenue per household
Read as numbers
| Tier | Complexes | Households | Per complex | Per household | Floored |
|---|---|---|---|---|---|
| sub | 72 | 6,186 | 76,528 | 890.7 | 52 |
| small | 363 | 90,428 | 157,219 | 631.1 | 61 |
| mid | 369 | 207,558 | 318,938 | 567 | 0 |
| large | 129 | 156,898 | 649,506 | 534 | 0 |
| xlarge | 19 | 51,448 | 1,384,207 | 511.2 | 0 |
Attach rate by service
Eleven panels rather than eleven hues. The site has two colours; eleven series on one axis would need nine more, and generating them puts pairs on the chart that a colourblind reader — or a monochrome printer — cannot separate. Faceting costs the ability to read one service against another at a glance and buys the ability to read each shape at all. The scale is the same in every panel: per-panel scaling would make a service almost nobody holds and one that more than half of them hold draw identical curves.
Parking control
41.3%
Visitor vehicles
5.6%
Resident access
13.4%
CCTV feed
17.5%
Fee collection
49.4%
Notices
58%
Facility booking
10%
Defect intake
3.6%
Parcel lockers
23.2%
Resident voting
23.5%
SMS fallback
9.5%
0 – 58.3%
Read as numbers
| Service | First | Last | Contracts |
|---|---|---|---|
| parking | 43.7 | 41.3 | 393 |
| visitor | 4.1 | 5.6 | 53 |
| access | 10.6 | 13.4 | 128 |
| cctv | 12.6 | 17.5 | 167 |
| billing | 46.4 | 49.4 | 470 |
| notice | 54.3 | 58 | 552 |
| community | 11.6 | 10 | 95 |
| defect | 3.1 | 3.6 | 34 |
| locker | 19.8 | 23.2 | 221 |
| vote | 20.5 | 23.5 | 224 |
| sms | 4.4 | 9.5 | 90 |
Penetration by district
The same 245 hexagons the brokerage and price maps use, borrowed rather than recomputed: the one thing a reader should be able to assume about two maps on one site is that the same shape means the same place. The denominator is not every filed complex but the ones large enough to have a management office.
Class edges (%) and districts in each
- 0
- 0.5
- 2
- 5
- 10
- 20
- None to sell to
- 46
- 7
- 68
- 76
- 9
- 5
- 34
Contracts and revenue are generated; the complexes and the household denominator are filed and estimated · ≥150
Read as numbers
| District | Province | Addressable | Rate |
|---|---|---|---|
| 합천군 | 경상남도 | 1 | 100 |
| 영덕군 | 경상북도 | 2 | 50 |
| 정선군 | 강원특별자치도 | 6 | 33.3 |
| 인제군 | 강원특별자치도 | 4 | 25 |
| 함양군 | 경상남도 | 4 | 25 |
| 서구 | 대구광역시 | 21 | 19 |
| 예천군 | 경상북도 | 12 | 16.7 |
| 과천시 | 경기도 | 21 | 14.3 |
| 가평군 | 경기도 | 17 | 11.8 |
| 홍성군 | 충청남도 | 35 | 11.4 |
| 하남시 | 경기도 | 124 | 11.3 |
| 강서구 | 부산광역시 | 49 | 10.2 |
| 서산시 | 충청남도 | 70 | 10 |
| 중구 | 부산광역시 | 10 | 10 |
| 안산시상록구 | 경기도 | 52 | 9.6 |
| 통영시 | 경상남도 | 52 | 9.6 |
| 성남시분당구 | 경기도 | 201 | 9.5 |
| 남구 | 대구광역시 | 44 | 9.1 |
| 문경시 | 경상북도 | 11 | 9.1 |
| 군포시 | 경기도 | 93 | 8.6 |
| 음성군 | 충청북도 | 48 | 8.3 |
| 중랑구 | 서울특별시 | 150 | 8 |
| 창원시진해구 | 경상남도 | 64 | 7.8 |
| 김제시 | 전북특별자치도 | 26 | 7.7 |
| 속초시 | 강원특별자치도 | 65 | 7.7 |
| 여주시 | 경기도 | 40 | 7.5 |
| 안양시동안구 | 경기도 | 149 | 7.4 |
| 동해시 | 강원특별자치도 | 55 | 7.3 |
| 부천시원미구 | 경기도 | 152 | 7.2 |
| 평택시 | 경기도 | 305 | 7.2 |
| 북구 | 울산광역시 | 112 | 7.1 |
| 함안군 | 경상남도 | 14 | 7.1 |
| 오산시 | 경기도 | 113 | 7.1 |
| 천안시동남구 | 충청남도 | 114 | 7 |
| 용인시수지구 | 경기도 | 215 | 7 |
| 창원시마산합포구 | 경상남도 | 86 | 7 |
| 서대문구 | 서울특별시 | 115 | 7 |
| 동래구 | 부산광역시 | 130 | 6.9 |
| 부천시오정구 | 경기도 | 29 | 6.9 |
| 수원시영통구 | 경기도 | 146 | 6.8 |
Cohort retention
A triangle rather than a grid, because that is the shape of the data: a cohort that signed two months before the window ends has two months of history and no more, and filling the rest with anything would invent it. Complexes still billing on the left; revenue against the cohort's own first month on the right. The two come apart, because the survivors buy more, and one grid cannot hold that gap.
Complexes still billing
Revenue against first month
Read as numbers
| Cohort | Size | Kept | Value |
|---|---|---|---|
| 2023Q3 | 60 | 70 | 101.4 |
| 2023Q4 | 55 | 63.6 | 68 |
| 2024Q1 | 57 | 68.4 | 83.1 |
| 2024Q2 | 54 | 70.4 | 91.5 |
| 2024Q3 | 83 | 73.5 | 91.2 |
| 2024Q4 | 74 | 71.6 | 66.5 |
| 2025Q1 | 61 | 75.4 | 94.7 |
| 2025Q2 | 90 | 86.7 | 96.5 |
| 2025Q3 | 97 | 81.4 | 89.1 |
| 2025Q4 | 99 | 85.9 | 82.5 |
| 2026Q1 | 115 | 89.6 | 97.1 |
| 2026Q2 | 110 | 98.2 | 100 |
Quota attainment
The bars grow from the 100 line rather than from the left edge. From the left edge a rep just short of quota and one just past it draw almost the same bar and the sign disappears, which is the only thing the chart is for.
Read as numbers
| Rep | Rank | Region | Accounts | Quota | Attainment |
|---|---|---|---|---|---|
| capital-2-2 | junior | capital | 82 | 3,100,000 | 28.7 |
| capital-1-2 | junior | capital | 54 | 3,100,000 | 25.3 |
| capital-2-3 | junior | capital | 78 | 3,100,000 | 23.3 |
| yeongnam-2-3 | junior | yeongnam | 54 | 3,100,000 | 19.4 |
| capital-3-2 | mid | capital | 60 | 4,800,000 | 18.3 |
| chungho-1-3 | mid | chungho | 46 | 4,800,000 | 15.9 |
| yeongnam-1-2 | junior | yeongnam | 54 | 3,100,000 | 15.3 |
| capital-1-3 | senior | capital | 73 | 6,200,000 | 12.6 |
| capital-3-1 | lead | capital | 70 | 7,600,000 | 10.6 |
| yeongnam-1-1 | lead | yeongnam | 57 | 7,600,000 | 8.5 |
| capital-2-1 | lead | capital | 51 | 7,600,000 | 7.8 |
| capital-1-1 | lead | capital | 60 | 7,600,000 | 7.3 |
| chungho-1-2 | senior | chungho | 58 | 6,200,000 | 6.9 |
| yeongnam-2-2 | senior | yeongnam | 49 | 6,200,000 | 6.6 |
| yeongnam-2-1 | lead | yeongnam | 45 | 7,600,000 | 5.3 |
| gangje-1-3 | mid | gangje | 10 | 4,800,000 | 4.3 |
| gangje-1-2 | mid | gangje | 12 | 4,800,000 | 2.2 |
| chungho-1-1 | lead | chungho | 29 | 7,600,000 | 1.7 |
| gangje-1-1 | lead | gangje | 10 | 7,600,000 | 0.7 |
The roster and its geography are real. The contracts and the revenue are not. · 36,040 · 217/245 · 202309–202608