How CAMAudit's 12-rule engine catches CAM overcharges: deterministic math for fee and share errors, AI classification for lease language. Results in under 5 minutes.
Run the audit before you decide whether this applies to your lease.
Find My OverchargesFind overcharges in your CAM reconciliation. Most audits complete in under 5 minutes.
Find My OverchargesSee a sample report firstMost CAM billing errors go undiscovered because tenants have no practical way to check the math. A landlord's reconciliation statement shows totals. Catching an overcharge means working backward through the specific lease provisions that limit those totals.
I built CAMAudit to do that work systematically, on every reconciliation, without requiring a law degree or a forensic accountant. The methodology rests on two non-negotiable design decisions: deterministic Python arithmetic for all numeric rules, and AI-assisted classification only for language-based rules. This article explains both, including the exact formulas each rule uses.
Here's the thing: those two tasks, reading lease language and checking arithmetic, are fundamentally different problems. Conflating them is how you end up with audit tools that are confident but wrong.
The CAM audit industry runs on two approaches: manual review (expensive, slow, dependent on the reviewer's lease familiarity) and rules-of-thumb pattern matching (imprecise, inconsistent). Both share one weakness: they depend on someone knowing which provisions to look for.
CAMAudit's approach differs in three ways.
Lease-specific, not generic. Every rule evaluates against your uploaded lease, not industry averages or standard NNN terms. If your lease caps management fees at 4%, the overcharge calculation uses 4%. Full stop.
Deterministic math, not estimates. For the six numeric detection rules, every calculation produces an exact dollar amount with a complete audit trail. Run the same documents twice and you get the same number. There is no probabilistic component in the math.
AI for extraction, not calculation. Claude Sonnet 4.6 extracts lease terms and classifies expense line items. It does not compute management fee overcharges or pro-rata share errors. Those are arithmetic operations with one correct answer.
“I built CAMAudit because the math in these audits is not hard. The hard part is reliably extracting the right numbers from the lease language. Once you have the numbers, a Python function gives you the exact answer every time.”
Every CAMAudit run processes documents through two sequential phases before generating any finding.
AWS Textract converts uploaded PDF documents to structured text. Claude Sonnet 4.6 then reads the lease and extracts the 13 provision categories the detection rules require:
| Extracted field | What it captures | Rules that use it |
|---|---|---|
management_fee_cap_pct | Percentage cap on management fees, defined base | Rule 3 |
tenant_sf and denominator_definition | Tenant square footage, denominator formula | Rule 4 |
gross_up_threshold | Target occupancy %, variable/fixed expense split | Rule 5 |
cam_cap_pct and cam_cap_type | Annual cap %, cumulative vs. compounded | Rule 6 |
base_year and base_year_expenses | Base year, documented costs, occupancy that year | Rule 7 |
excluded_categories |
The extraction output is a structured JSON object. Every downstream calculation references that object by field name. If a provision does not exist in the lease, the associated rule is flagged as not applicable rather than running against a default assumption.
All 13 detection rules run in parallel against the extraction output and the reconciliation data. Math rules (3, 4, 5, 6, 7, 13, 18) run as Python arithmetic functions with no probabilistic component. Classification rules (1, 2, 9, 10, 11, 12) combine extracted lease language with AI-assisted expense line item categorization.
Each rule returns either a finding with a calculated dollar amount, or a clean result. No gray zone, no confidence interval.
Rules 3, 4, 5, 6, 7, 13, and 18 are deterministic arithmetic checks. The lease provides the limit. The reconciliation provides the billed amount. The rule calculates the difference.
What it detects: Management fee billed at a rate above the lease cap, calculated on a base wider than the lease permits, or computed as a circular fee-on-fee.
billed_fee = reconciliation.management_fee_amount
permitted_fee = base_expenses × lease.management_fee_cap_pct
overcharge = max(0, billed_fee - permitted_fee)
# Fee-on-fee detection
correct_fee = expenses_before_fee × lease.management_fee_cap_pct
circular_fee = total_cam_including_fee × lease.management_fee_cap_pct
fee_on_fee_overcharge = max(0, billed_fee - correct_fee)
Example: Lease caps management fees at 5% of controllable expenses. Building operating expenses before the fee: $500,000. Correct fee: $25,000. If the landlord computes 5% on the post-fee total (circular), the fee becomes $26,316. Overcharge: $1,316 per year building-wide. For a tenant at 7.5% pro-rata share: $99 per year, compounding across a 10-year lease.
Frequency: Management fee issues appear in 15 to 25% of audited NNN leases. Fee-on-fee specifically: 5 to 10%.
What it detects: The tenant's percentage in the reconciliation does not match the lease's denominator definition.
expected_share = tenant_sf / denominator_sf
billed_share = reconciliation.tenant_share_pct
error = abs(billed_share - expected_share)
overcharge = (billed_share - expected_share) × total_cam_pool
The denominator is where the largest errors originate. Common manipulations: using occupied square footage instead of total leasable area (inflates the share when occupancy is low), excluding anchor tenants from the denominator without a lease basis, and failing to update the denominator after a building expansion.
Example: Building is 100,000 SF. Tenant is 7,500 SF. Lease-defined denominator: total leasable area. Correct share: 7.5%. Landlord computes against 75,000 SF, excluding 25,000 SF vacant space. Resulting share: 10%. On $1,000,000 in building CAM, that is a $25,000 annual overcharge.
Frequency: Pro-rata share errors are among the most common findings. A documented OAG audit identified $55,421 in excess pro-rata charges over six years from denominator manipulation alone.
What it detects: Fixed expenses that do not vary with occupancy (property taxes, insurance, security contracts) are being grossed up as if they do.
variable_expenses = reconciliation.expenses_flagged_as_variable
fixed_expenses = reconciliation.expenses_flagged_as_fixed
actual_occupancy = reconciliation.occupancy_pct
# Correct: gross up variable expenses only
correct_grossed_up_variable = variable_expenses / actual_occupancy
correct_total = correct_grossed_up_variable + fixed_expenses
# Incorrect: gross up everything
incorrect_total = (variable_expenses + fixed_expenses) / actual_occupancy
overcharge_per_tenant = (incorrect_total - correct_total) × pro_rata_share
Example: Building at 70% occupancy. Variable cleaning costs: $200,000. Fixed insurance: $150,000. Correct grossed-up total: ($200,000 / 0.70) + $150,000 = $435,714. Incorrect (everything grossed up): $350,000 / 0.70 = $500,000. Building-wide overcharge: $64,286. For a 10% tenant: $6,429 per year.
Frequency: Gross-up errors appear in 25 to 35% of audited leases. The overcharge grows at lower occupancy levels and compounds in base-year leases where both the base and comparison years use incorrect methodology.
What it detects: Year-over-year increases in controllable CAM expenses exceed the lease's stated annual cap.
# Compounded cap
max_allowed_compounded = base_year_cam × (1 + cap_pct) ** years_elapsed
# Cumulative cap
max_allowed_cumulative = base_year_cam × (1 + cap_pct × years_elapsed)
# Use whichever formula the lease specifies
max_allowed = max_allowed_compounded # or max_allowed_cumulative
overcharge = max(0, billed_cam - max_allowed)
Not so fast on assuming these two cap types are interchangeable. A 5% compounded cap on a $100,000 base reaches $127,628 after 5 years. A 5% cumulative cap on the same base reaches $125,000. That $2,628 difference in Year 5 widens every year after.
Example: Lease uses a 5% cumulative CAM cap. Base year controllable expenses: $100,000. Year 5 billed: $130,000. Maximum permitted: $125,000. Overcharge: $5,000 building-wide. For a 7.5% tenant: $375 for that year, with similar amounts accruing in prior years.
Frequency: CAM cap violations appear in 15 to 25% of NNN leases that have cap provisions. The most common cause is property management software not configured to enforce individual lease cap terms.
What it detects: The base year expense was established at below-stabilized occupancy without a gross-up adjustment, creating a permanent understatement that inflates every year's escalation charge.
base_year_actual = lease_extraction.base_year_expenses_per_sf
boma_benchmark_low = property_type_benchmark × 0.85
if base_year_occupancy < 0.90 and not base_year_grossed_up:
# Estimate the gross-up that should have been applied
variable_pct = 0.60 # typical variable expense share
fixed_pct = 0.40
adjusted_base = (
base_year_actual * fixed_pct
+ (base_year_actual * variable_pct) / base_year_occupancy
)
annual_overcharge = (adjusted_base - base_year_actual) × tenant_sf
cumulative_overcharge = annual_overcharge × lease_years_remaining
Example: Building was at 65% occupancy in the base year. The landlord locked in $8.00/SF as the base. At 90% stabilized occupancy, variable expenses (60% of total) would have been 38% higher: $8.00 × 0.40 + ($8.00 × 0.60 / 0.65) = $10.58/SF normalized. The $2.58/SF understatement inflates every dollar of escalation above $8.00/SF. On a 7,500 SF space over a 10-year lease: $193,500 cumulative overcharge.
Frequency: Base year errors appear in 15 to 25% of base-year leases. A $1.00 to $2.00/SF error is typical, and the dollar impact is the largest of any single rule on a per-year basis over a long lease term.
What it detects: Expenses labeled "controllable" in the lease have grown beyond the cap that applies specifically to that category, separate from any general CAM cap.
controllable_expenses_current = reconciliation.controllable_cam_total
controllable_expenses_base = base_year.controllable_cam_total
cap_pct = lease.controllable_expense_cap_pct
max_allowed = controllable_expenses_base × (1 + cap_pct) ** years_elapsed
overcharge = max(0, controllable_expenses_current - max_allowed)
tenant_overcharge = overcharge × pro_rata_share
Example: Office lease with a 3% controllable expense cap. Base year controllable expenses: $80,000. After Year 4, maximum permitted: $80,000 × (1.03)^4 = $90,061. Billed controllable expenses: $95,000. Overcharge: $4,939 building-wide.
What it detects: The annual reconciliation true-up payment billed by the landlord exceeds the correct amount — the difference between the tenant's actual share of building operating expenses and the monthly estimates the tenant already paid throughout the year.
tenant_share_of_actual = total_building_opex × pro_rata_share
expected_true_up = tenant_share_of_actual - sum(monthly_estimates_paid)
overcharge = max(0, billed_true_up - expected_true_up)
# Tolerance: max($50, tenant_share_of_actual × 0.5%)
flag_if: billed_true_up > expected_true_up + tolerance
Example: Building total operating expenses: $412,837.60. Tenant at 10% pro-rata share. Tenant's actual share: $41,283.76. Monthly estimates paid: $3,000 × 12 = $36,000.00. Expected true-up: $41,283.76 − $36,000.00 = $5,283.76. Landlord bills $8,500.00 as the "Balance Due." Overcharge: $8,500.00 − $5,283.76 = $3,216.24.
Frequency: True-up arithmetic errors appear wherever landlords manually compute year-end balances outside their property management system. Government tenants with transparent A/P records (like Charleston County, SC) provide direct verification of the actual payment amounts, making the overcharge straightforward to document.
Rules 1, 2, 9, 10, 11, and 12 require semantic understanding of lease language and expense line item descriptions. These rules use Claude Sonnet 4.6 to compare extracted lease provisions against reconciliation categories.
What the AI checks: Whether the tenant's lease type (gross, modified gross, full-service gross) permits CAM pass-throughs at all.
Evidence it looks for: The rent section of the lease must contain explicit authorization for additional rent in the form of operating expense pass-throughs. A gross lease with no such language means the entire reconciliation billing is unauthorized.
What constitutes a finding: CAM charges billed separately on a gross lease where no pass-through authorization exists. Modified gross leases with a base year provision are handled separately under Rule 7.
What the AI checks: Whether any expense line item in the reconciliation falls into a category the lease explicitly prohibits from the CAM pool.
Evidence it looks for: The exclusion list in the lease's operating expense or CAM definition section. Common items on that list: capital expenditures, leasing commissions, mortgage debt service, executive salaries, litigation costs, depreciation, and costs for above-standard services provided to specific tenants.
What constitutes a finding: Any reconciliation line item that matches an excluded category, with the finding amount equal to the tenant's pro-rata share of that line item.
In practice, the hardest classification calls here are borderline repair-vs.-capital questions. A line item labeled "HVAC unit replacement: Unit 4B" is straightforwardly a capital expenditure. A line item labeled "HVAC maintenance and repair: Q4" requires the AI to assess whether the underlying work was routine maintenance (operating) or a system replacement (capital). The AI flags ambiguous descriptions for tenant review rather than guessing.
What the AI checks: Whether the insurance types and dollar amounts in the reconciliation correspond to coverages the lease permits, and whether the amounts billed match documented premiums.
Evidence it looks for: The insurance section of the lease specifying required and permitted coverage types (property, liability, umbrella, rental value). Market rate benchmarks by property type and region. Any premium invoice data available in the reconciliation package.
What constitutes a finding: Insurance billed above documented premium amounts, coverage types not permitted by the lease, or premium allocations that include commission retention by the landlord.
What the AI checks: Whether property taxes are allocated using the methodology the lease requires, and whether any tax appeal refunds were credited to tenants.
Evidence it looks for: The tax provision in the lease defining which taxes may be passed through and whether special assessment district charges are included. Any indication in the reconciliation that a tax appeal was filed for the period.
What constitutes a finding: Tax amounts billed above the documented assessment, charges for tax categories not covered by the lease's definition, or a missing credit for a tax refund obtained after appeal.
What the AI checks: Whether utility charges in the CAM pool overlap with utilities billed directly to the tenant, and whether the allocation methodology matches the lease.
Evidence it looks for: Sub-metering language in the lease specifying which utilities are directly billed to the tenant. Utility line items in both the CAM reconciliation and any direct billing. The allocation basis (pro-rata by square footage, direct metering, or blended).
What constitutes a finding: The same utility appearing in both the CAM pool and a direct billing, utility charges allocated by a method not permitted by the lease, or common-area utility costs that include service to tenant-exclusive spaces.
What the AI checks: Whether expenses in the CAM pool relate to genuinely common areas that benefit all tenants, or to spaces and services that benefit specific tenants or the landlord exclusively.
Evidence it looks for: The lease's definition of "common area." Expense descriptions that reference specific suite numbers, building wings, tenant names, or equipment that serves only one tenant. Work order or invoice descriptions that indicate location-specific services.
What constitutes a finding: Any expense that, based on its description and the lease's common area definition, relates to a non-common space. Examples include management office costs, basement storage serving only the landlord, HVAC serving a rooftop mechanical room exclusive to one tenant, and service corridors not accessible to the tenant's customers.
“The hardest classification call in a CAM audit is the borderline common area question. Is the lobby on the second floor, accessible only through one tenant's space, a common area or a tenant-exclusive amenity? The lease definition controls. That is exactly the kind of question the AI handles well.”
When a landlord's property management system charges 5.2% management fees against a lease capped at 4%, there is one correct answer for the overcharge: the difference, multiplied by the tenant's pro-rata share. That answer is a number, not a range, not an estimate, not subject to interpretation.
Using AI to calculate that number introduces variability where none is warranted. An AI-computed overcharge amount might be correct on one run and off by a rounding convention on the next. That inconsistency is a problem when the output is a formal dispute document sent to a landlord.
CAMAudit's math rules are Python functions. Same inputs produce the same output. The computation chain is: lease extraction → Python rule function → calculated overcharge → finding report. No probabilistic step between the lease number and the finding dollar amount.
This architecture also makes findings auditable. Anyone with the source documents can verify a math finding by hand. The formula is documented, the inputs trace back to the uploaded documents, and the arithmetic is elementary. That traceability is what makes a finding defensible in a formal dispute or in court.
“If I am handing a tenant a document they are going to send to a landlord saying you owe us $8,400, that number needs to be right every time. Deterministic code is the only way to guarantee that.”
Upload your lease. CAMAudit runs 13 detection rules in under 5 minutes.
Find My OverchargesTarget processing time from upload to findings: under 5 minutes for standard-length commercial leases and reconciliation statements.
When an audit produces findings, tenants can generate a dispute letter draft directly from the finding report. The letter is grounded on the audit output, not on generic templates.
Each finding included in the letter contributes three elements: the specific lease section that sets the limit, the dollar calculation showing how the overcharge was computed, and a citation to the reconciliation line items being challenged. The letter requests a specific response from the landlord: either an acknowledgment and credit, or a written explanation of the basis for the charge.
CAMAudit's dispute letter drafts reference legal precedent relevant to each finding type. The legal citations come from a 50-state database of commercial lease dispute case law, selected by the AI based on the property's state and the error type at issue. Three tone options are available: collaborative (framed as a billing question), neutral (formal accounting dispute), and firm (asserting a clear contract breach with a deadline for response).
The dispute letter is a draft. Review it before sending, and consider consulting an attorney for findings involving large dollar amounts or an adversarial landlord.
For a deeper look at how error rates and recovery amounts break down across all 12 rules, see the CAM Overcharge Index 2026. If you are evaluating whether to use CAMAudit or a traditional audit firm, the CAM audit company comparison covers the economics of each provider type.
| Explicit exclusion list from the lease |
| Rule 2 |
lease_type | Gross, modified gross, NNN | Rule 1 |
controllable_cap_pct | Cap on controllable expense growth | Rule 13 |
permitted_insurance_types | Coverage types and dollar limits authorized | Rule 9 |
tax_provisions | Tax allocation methodology, appeal credit language | Rule 10 |
utility_provisions | Sub-metering language, allocation basis | Rule 11 |
common_area_definition | Scope of "common area" under the lease | Rule 12 |
monthly_estimates | Monthly CAM estimates paid throughout the year | Rule 18 |