Yardi Charge Code vs Recovery Code: Understanding the Difference
If you've ever tried to trace a CAM billing error in Yardi Voyager back to its source, you've likely encountered the charge code / recovery code distinction — and found it more confusing than it should be. These two concepts are documented separately in Yardi's help system, configured in different menu locations, and interact in ways that aren't immediately obvious. Here's how they actually work and how to map them correctly.
What Charge Codes Do
A charge code in Yardi is a billing object. It controls:
- What appears on the tenant's invoice: The line item description the tenant sees (e.g., "CAM Charges," "Operating Expenses," "Tax Recovery")
- Which GL account the revenue posts to: When a tenant pays, which account receives the credit
- The billing frequency: Monthly, quarterly, annual
- The charge calculation method: Fixed amount, formula-based, or recovery-pool-driven
Charge codes live in the Charge Code Setup table (Administration > Setup > Charge Codes). They are referenced in the lease under the Billing tab — each billing row on the lease points to a charge code.
Charge codes answer the question: How do we bill this to the tenant, and how do we record it?
They do not answer: How do we calculate the amount?
What Recovery Codes Do
A recovery code is a calculation object. It controls:
- Which recovery pool the calculation draws from: The expense pool containing CAM expenses
- The recovery methodology: Pro-rata share calculation method, gross-up settings, cap application
- The expense categories included: Which pool expenses flow into this tenant's calculation
Recovery codes live under Administration > Setup > Recovery Codes. They are assigned at two points: (1) in the recovery pool as the default, and (2) in the tenant's billing record as a tenant-specific override.
Recovery codes answer the question: How do we calculate the amount the tenant owes?
They do not control billing frequency, invoice line item descriptions, or GL posting.
The Mapping Relationship
The full data flow for a CAM charge in Yardi is:
GL Expenses → Recovery Pool → Recovery Code → Charge Code → Tenant Invoice
- Expenses post to GL accounts mapped to a recovery pool
- The recovery pool calculates total recoverable expenses
- The recovery code defines how each tenant's share is calculated from the pool
- The charge code generates the invoice line item using the recovery code's output
- The invoice is posted to the tenant's billing record
A correctly configured charge code has a Recovery Code field populated — this is where the two systems link. If this field is blank, the charge code is not connected to any recovery pool calculation.
Common Mapping Errors
Error 1: Charge code without a recovery code
The charge code exists and generates invoices, but the Recovery Code field is empty. Yardi cannot calculate the amount from pool data, so it falls back to a fixed amount or manual entry. This is the most common cause of CAM estimates that never update automatically.
How to find it: Run a Charge Code List report and add the Recovery Code column. Any CAM-related charge code showing blank in the Recovery Code column has this problem.
Error 2: Wrong recovery pool assigned to recovery code
The charge code links to a recovery code, but that recovery code points to the wrong recovery pool. This often happens when a property has multiple pools (base building, retail anchor, office) and the assignment was made incorrectly during initial setup.
How to identify it: Compare the tenants assigned to each charge code against the expected expense pool. A retail tenant assigned to an office recovery code is billing from the wrong pool.
Error 3: Multiple charge codes, one recovery code
Some properties bill CAM expenses as multiple line items (operating expenses, taxes, insurance separately) but use a single recovery code that covers all three categories. The recovery code total gets applied to the first charge code that runs the calculation, and subsequent charge codes either duplicate or zero out.
How to fix it: For separate billing line items, create separate recovery codes linked to separate pools (or sub-pools), each covering only the expenses relevant to that charge code.
Error 4: Recovery code exists but isn't linked to the active lease
A recovery code was set up correctly, but the lease amendment added a new charge code that doesn't reference it. The tenant is being billed from the old charge code (with the old recovery code) while the amended lease expects the new structure.
How to Audit Your Setup
A charge code / recovery code audit should run before every reconciliation cycle:
- Export the charge code list (Administration > Setup > Charge Codes) with the Recovery Code column visible
- For each CAM-related charge code, verify the Recovery Code field is populated
- Export the recovery code list (Administration > Setup > Recovery Codes) with the Pool Name column visible
- For each recovery code, verify it points to the correct pool for that property and tenant type
- Spot-check three leases — your largest tenant, smallest tenant, and any tenant with recent lease amendments — and verify the charge code and recovery code assignments match lease terms
If you find a charge code without a recovery code, assign the correct recovery code before running the next billing cycle. Do not create a workaround by hardcoding amounts — that masks the configuration problem and creates a maintenance burden every year.
CapVeri's configuration audit tool analyzes your Yardi export and flags charge codes without linked recovery codes, recovery codes pointing to incorrect pools, and tenants whose billing setup diverges from their lease terms — before reconciliation statements go out.