To invest in multifamily real estate is to run a portfolio on five rollup KPIs. Security has quietly been the missing sixth.
Occupancy rolls up. NOI rolls up. DSCR rolls up. Rent growth rolls up. Work order SLA rolls up. Security does not, because Property 1 is Hikvision, Property 2 is Dahua, Property 3 is LTS, and none of those DVRs ever agreed on what a row of data looks like. This guide is about the specific normalization layer that finally makes security portfolio-rollable, what the 9 field event schema looks like, and what changes in the investment thesis once you can read it.
See a portfolio-level incident rate across mixed DVRsThe shape of a modern multifamily investor dashboard
Read any current guide on how to invest in multifamily real estate and the model of the asset is financial. Cap rate, cash-on-cash, IRR, DSCR, T-12, rent roll, market comps. Those numbers already roll up across properties because the industry standardized the underlying schemas in the early 2000s. Yardi, AppFolio, Entrata, and RealPage all speak the same rent-roll grammar. A sponsor with 12 properties can ask for portfolio-weighted occupancy and get one number, because every unit on every property writes to the same table in the same shape.
Security was never standardized that way. The DVR at Property 1 might be a 2019 Hikvision, at Property 2 a 2021 Dahua rebrand, at Property 3 a 2017 LTS, at Property 4 a Lorex the prior owner installed in 2016 and forgot the password for. Each one exports motion-scan results tied to channel numbers that shift every time a camera is re-cabled. None of them agree on what a loiter event is. Most of them do not have an event concept at all, just a continuous recording.
So your investor dashboard has a tile for occupancy and a tile for NOI, and no tile for security. Not because security does not matter, but because nobody could produce the number in a comparable shape across the portfolio. The fix is not a better DVR. The fix is one level down from the DVR, at the layer every brand actually shares.
Five rollup KPIs, and the sixth that was always missing
Each of the first five has a standardized source schema. Each produces a portfolio-weighted number a sponsor can put in a quarterly letter. The sixth is operational security, and the reason it never showed up on the letter is that the underlying data never came out of the recorder in a comparable shape.
Occupancy
Rent roll per property, pulled from AppFolio, Yardi, Entrata, or similar. Unit-level status, aggregated to property-level rate, then portfolio-weighted by unit count. Rolled up since the 2000s.
NOI
T-12 general ledger per property. Rolled up to portfolio NOI in Excel, or in whichever asset-management tool the sponsor uses. Standardized line items make this trivial across properties.
DSCR
NOI divided by debt service, per property, then portfolio-weighted by loan balance. Pulled from the lender's servicing system plus the property-level GL. Lives cleanly in a spreadsheet.
Rent growth
New-lease and renewal trade-outs per property, rolled up across the portfolio. The PMS writes these to a lease history table that every property in the portfolio already shares.
Work order SLA
Open work orders, close times, maintenance category, per property, rolled up. PMS again. A 12 property sponsor reads a portfolio SLA number in one click.
Security, the missing sixth
Until every DVR in the portfolio wrote events in one shape, nothing could roll up. Property 1 Hikvision, Property 2 Dahua, Property 3 LTS. The HDMI tap plus OCR of the painted tile name produces the one shape, on top of whatever DVR is already in the rack.
The brand zoo sitting in the equipment room of a typical 12 property portfolio
A single sponsor who has been acquiring Class B and Class C assets for five years will, without exception, have inherited DVRs from three to seven brands. These are the brands that actually show up in the rack. None of them export in each other's format. Each has its own admin UI, its own channel numbering, its own motion-scan artifact shape. A portfolio-level security KPI has to be invariant across every one of them.
How every DVR brand ends up writing the same event row
The numbers that make this a portfolio variable and not a story
Four counts that convert security from a qualitative footnote in the investment memo into a rollable column in the asset register. None of them are invented, all of them come out of the event table the device writes.
A 12 property portfolio generates, across the 30 day observation window, a single table with roughly 0 properties ร 0 tiles = 300 tile-months of coverage, keyed by tile.label, rolling up to one portfolio-weighted incidents-per-1000-resident-days number the LP can read in the quarterly letter.
The 9 field event schema, in full
This is the full shape that every DVR brand in the portfolio ends up writing, regardless of whether the underlying recorder is a 2019 Hikvision or a 2016 Lorex. tile.label is the OCR of the painted camera-name strip. overlay_mask is the set of rectangles the classifier masks out before inference so the clock, the channel bug, and the label strip do not trigger false events. layout_id is what disambiguates tile positions when the property manager toggles between grid sizes.
The five event classes that fill the portfolio KPI
The filter surface is deliberately small. Five labels, a single property key, a single tile key. Nothing else writes rows into the rollup. Everything not in this set stays in the DVR's continuous recording, unchanged, for the rare case a forensic lookup needs raw footage.
the only rows in the portfolio incident table:
- person_in_zone โ an actor crossed a configured polygon
- loiter โ an actor's bounding box persisted past a dwell threshold
- vehicle_dwell โ a vehicle remained stationary past a threshold
- tamper โ a tile's HDMI frame lost structure (blocked, rotated, unplugged)
- package_tamper โ a package-sized object disappeared from a zone
One SQL query across a 12 property, 4 DVR brand portfolio
The payoff of the normalization is this exact query. One event table, one property key, one tile key, one window. No brand special-casing. No per-property channel math. The output is a property-level incident rate and a portfolio-weighted average the sponsor can drop straight into the quarterly LP update.
What the rollout looks like on the wire, property by property
Below is a cut of the install ledger across four properties of different DVR brands. Each row is a property going from dark (no portfolio data) to visible in the same event table. Notice the layout_id and DVR brand differ per property, but the event schema they write to does not.
โHikvision, Dahua, LTS, and Lorex all wrote their first event row into the portfolio table within five minutes of the HDMI tap being powered on. None of them required the DVR password. None of them required a firmware update. The brand of the recorder became irrelevant to the investor dashboard for the first time.โ
Cyrano field notes, 4 property multifamily sponsor onboarding, April 2026
The three points in the investment lifecycle where this KPI pays rent
acquisition, hold, disposition
Acquisition (LOI to close, 30 to 60 days)
Run a 30 day observation window on the seller's existing DVR through the HDMI tap, keyed by tile.label. Compare the property's indexed incident rate against the portfolio baseline. A property running 2x the baseline is either a price concession opportunity or a value-add thesis with teeth. Either way, the number is on the closing memo instead of vibes.
Hold, year 1 (stabilization)
The capex plan usually includes lighting, access control upgrades, a new entry gate. Each of those is supposed to reduce incidents. Before Cyrano, 'supposed to' was the word the sponsor used in the investor letter. After, the before-and-after incident rate becomes a concrete line in the quarterly update alongside occupancy progress.
Hold, year 2 to 5 (cash flow)
The portfolio-weighted incidents_per_1k_rd goes into the quarterly LP letter as a rolling trend. It sits next to occupancy, rent growth, and DSCR. It tells an LP whether the sponsor is running an operationally tight property or coasting on a strong rent market.
Disposition (24 months out, and at listing)
At listing, the 24 month trend in indexed incident rate is the operational provenance equivalent of a clean T-12. A buyer who also has a portfolio dashboard can now read your incident rate into their own model before they send the LOI. The one who offers the best cap rate is the one who believes your number.
Per-property dashboard vs portfolio dashboard
The table below is the gap between the world where security lives on the DVR at each property (everyone's status quo) and the world where the same event schema rolls up to the portfolio view (the point of the normalization).
| Feature | Per-property DVR, as shipped | Portfolio rollup on the normalized schema |
|---|---|---|
| DVR brands supported | One (whichever is in the rack) | All (HDMI is the universal output) |
| Event schema | Brand-proprietary motion-scan CSV | 9 field row, identical across properties |
| Stable camera key | Channel number, shifts on re-cable | tile.label, OCR'd off the painted strip |
| Portfolio KPI | None; security is qualitative | Indexed incidents per 1000 resident-days |
| LP letter line item | A paragraph of narrative | A number next to occupancy and rent growth |
| Rollout model | Per-brand IT integration project | 30 minute HDMI install per property |
| DVR credentials required | Admin password for every box | None; the HDMI output is read-only |
| Survives a DVR swap | No; all historical data is orphaned | Yes; tile.label is re-OCR'd on first frame |
The uncopyable thing
tile.label is the key that makes the portfolio rollup possible.
Every DVR brand paints the human-readable camera name onto each tile of its HDMI multiview as a small text strip. That painted text is a visual convention shared by Hikvision, Dahua, LTS, Swann, Amcrest, Lorex, Night Owl, Q-See, Zmodo, Uniden, Reolink, and Annke. Cyrano OCRs the strip once per layout at install time and stores the result as tile.label on the event row. tile.label survives channel renumbering. tile.label survives a DVR hardware swap. tile.label is the same string on every property that happens to have a Mailroom Interior camera, regardless of which brand's rack it sits in. That is what makes it the right portfolio primary key for operational security, and that is the thing every other approach (ONVIF integrations, per-brand APIs, camera replacement programs) tried and failed to achieve at Class B and Class C multifamily scale.
The sponsor and LP questions this KPI answers
Each of these is a question a sponsor or LP already asks. None of them are answerable today with a DVR per property. All of them become one SQL query against the normalized event table once the HDMI tap is live on each recorder.
What this does not pretend to be
It is not a replacement for the DVR. The DVR keeps recording 24/7 to its local disks exactly as it did before, under the same retention policy, to be used for forensic lookup when one is needed. It is not a replacement for the property manager. Incidents still get triaged, dismissed, or escalated by a human at the property, and the event table is the substrate they work off. It is not a replacement for insurance documentation or tenant-privacy reviews. Those still apply, and the on-edge processing keeps raw video on-premise.
What it is: the specific normalization layer that makes one operational-security KPI comparable across every property in the portfolio, regardless of which DVR brand is in the rack. That one layer is all that stood between the multifamily investor and a rollable security number. Once you have it, security is the sixth portfolio KPI in the dashboard. Before you have it, security is whatever the property manager at each site says it is, and there is no way to check.
Watch a 4 brand, 4 property portfolio roll up to one incident rate
A 15 minute call. We open the normalized event table across Hikvision, Dahua, LTS, and Lorex properties, show the same 9 field row writing from each, and walk the portfolio-weighted incidents_per_1k_rd on a live dashboard.
Book a call โInvest in multifamily real estate, with a real portfolio security KPI: frequently asked questions
Why doesn't my investor dashboard show any security KPI today, even though I have cameras at every property?
Because each property's DVR is a different brand, with a different export format, a different channel numbering convention, and a different timestamp layout. Property 1 is Hikvision, Property 2 is Dahua, Property 3 is LTS, Property 4 is Amcrest. Each box exports motion-scan CSVs in its own shape, each one is tied to a channel number that shifts when cameras get re-cabled, and none of them agree on what a 'loiter event' is. Your property management software can show you occupancy, rent, and work orders across all four properties because those data points were standardized a decade ago. Security was never standardized at the device layer, so it never rolled up, so your investor dashboard never had a tile for it.
What is the specific normalization that finally makes security portfolio-rollable?
Every DVR, regardless of brand, paints the human-readable camera name onto each tile of its HDMI multiview output as a small text strip. That is a visual convention shared by Hikvision, Dahua, LTS, Swann, Amcrest, Lorex, Night Owl, Q-See, Zmodo, and every other Class B and Class C recorder. Cyrano OCRs that strip once per layout at install time and stores the result as tile.label on the event record. tile.label is the stable key that lets the property manager say Mailroom Interior instead of Channel 4, and it is the stable key that lets an LP or a syndicator aggregate Mailroom Interior events across 12 properties even though the underlying channel numbers are different on every DVR.
What are the nine fields in the normalized event schema?
tile.label, tile.index, tile.coords, property, layout_id, overlay_mask, event_class, iso8601_ts, latency_ms. tile.label is the OCR'd painted name. tile.index is the position in the multiview grid. tile.coords is the pixel bounding box of that tile on the HDMI frame. property is the portfolio key. layout_id identifies which multiview grid was being rendered at capture time, so tile positions are disambiguated when the property manager toggles between a 9-tile and a 16-tile view. overlay_mask is the set of rectangles masked out before classification (the clock, the camera-name strip, the channel bug). event_class is one of five labels: person_in_zone, loiter, vehicle_dwell, tamper, package_tamper. iso8601_ts is the classifier trigger time in a real offset. latency_ms is the capture-to-reviewable latency for that event, typically 5000 to 15000.
Why is this the first time a multifamily investor could do portfolio-level security at all?
Because before HDMI-level capture, the only way to normalize across DVR brands was to integrate with each brand's ONVIF or proprietary API, which requires a physical network seat on the property LAN, the DVR's admin password, firmware updates to enable the API, and brand-specific code for each vendor. That is a months-long IT project per property, and most Class B and Class C properties run firmware from 2017 that never had those APIs enabled in the first place. HDMI is the one output every DVR brand has had for 15 years, with no password, no firmware dependency, and no network exposure. The HDMI frame is the portable layer. Everything upstream of the HDMI frame stays brand-proprietary, and the investor does not have to care.
What is indexed incidents per 1000 resident-days, and why is it the right portfolio KPI?
Resident-days is units times occupancy times days in the measurement window. Indexed incidents is the count of normalized event_class rows in that window for that property. The ratio is dimensionless, directly comparable across properties of different size, and rolls up cleanly to a portfolio number. It is the operational-security analog of economic occupancy. On the same dashboard where you read a portfolio-weighted occupancy of 94.2 percent, you can now read a portfolio-weighted incident rate of 0.8 indexed incidents per 1000 resident-days, with the property-level breakout one click away. Nothing about that is possible until the event schema is the same across every DVR brand.
Is this overriding my property management system or my GP dashboard?
No. The event table is an additional column on whatever asset-management view you already run. The normalized row has a property key, so a sponsor who runs AppFolio or Yardi joins the incident count to the unit count by property and gets the ratio. A syndicator who runs a bespoke Excel waterfall pastes the same ratio into a new column next to occupancy and rent growth. The point is not to replace the financial KPIs. The point is to add the one operational KPI that was always the missing dimension in the multifamily investment thesis because no one could measure it across the portfolio.
How long does rollout take across an existing multifamily portfolio?
Per property, the physical install is under 30 minutes. One Cyrano device plugs into the DVR's spare HDMI port via a splitter. No network changes on the property LAN, no DVR credentials, no contractor. From the portfolio side, the rollout is a schedule across properties rather than a single big-bang integration. After the first property is live, every additional property adds a row to the same event table without reshaping anything. You get portfolio coverage as you install, not at the end of a multi-quarter IT project. Typical 10 property portfolio is fully on the same dashboard within three to four weeks, constrained by travel time to the properties, not by the install itself.
What about data privacy, since this is video footage?
The classifier runs on the edge device at the property. The HDMI frame is processed locally into the 9 field event row. Only the event row and the thumbnail leave the property, which are a small fraction of the raw video volume. The full continuous recording stays on the DVR, where it always was, under the same tenant privacy posture the property already runs. From an LP's perspective, the data that rolls up to the portfolio view is already aggregated and stripped to a timestamp, a tile name, and an event class, not raw identifiable video. From the property manager's perspective, the full recording is still on-premise for forensic lookup when one is needed.
What specifically changes in the investment thesis once this KPI exists?
Three things. First, at acquisition, you price security posture instead of guessing at it, by running a 30 day observation window on the existing DVR before closing and comparing the indexed incident rate to the portfolio baseline. Second, in the business plan, the pro forma gets a line item for expected incident rate improvement from the value-add capex, bounded by measured before-and-after numbers, not hope. Third, at disposition, you show the buyer a 24 month trendline of the indexed incident rate alongside the NOI trendline, which is a form of operational provenance that lets you negotiate on cap rate the way a well-kept T-12 does.
What happens if a DVR gets swapped mid-hold?
The new DVR paints a different tile-name strip, at a different pixel offset, in a different font. Cyrano re-OCRs the new layout on first frame and re-keys the tile.label. The event table is unchanged because tile.label is the key, not the DVR-specific channel number. To the portfolio dashboard, a DVR swap is invisible; to the property manager, the filter chips on the review screen still say Mailroom Interior and Loading Dock NE. That continuity across hardware changes is why tile.label is the right key for an investor who holds properties for five to seven years and will see two generations of recorder hardware in that window.
Comments (โขโข)
Leave a comment to see what others are saying.Public and anonymous. No signup.