Propexo Integration¶
MeterBase integrates with property management systems (PMS) through Propexo, a unified API that normalizes data across multiple PMS platforms. This integration enables importing properties, syncing units and leases, and posting RUBS tenant charges directly to your PMS.
What Is Propexo?¶
Propexo is a middleware platform that provides a single, normalized API for interacting with property management systems. Instead of building separate integrations for each PMS, MeterBase connects to Propexo once and gains access to all supported platforms.
Supported PMS Platforms¶
| PMS | Property Import | Unit Sync | Lease Sync | Charge Posting |
|---|---|---|---|---|
| Yardi Voyager | Yes | Yes | Yes | Yes |
| RealPage | Yes | Yes | Yes | Yes |
| Entrata | Yes | Yes | Yes | Yes |
| AppFolio | Yes | Yes | Yes | Yes |
| Buildium | Yes | Yes | Yes | Yes |
| Rent Manager | Yes | Yes | Yes | Yes |
| MRI Software | Yes | Yes | Yes | Yes |
| Propertyware | Yes | Yes | Yes | Yes |
| RentVine | Yes | Yes | Yes | Beta |
| Res-Man | Yes | Yes | Yes | Beta |
Setup¶
Step 1: Get a Propexo Account¶
Sign up at propexo.com and obtain your API credentials:
- API Key -- Used to authenticate API requests
- Integration ID -- Identifies your Propexo integration
Step 2: Configure MeterBase¶
Add the Propexo credentials to your .env file:
PROPEXO_API_KEY=your-propexo-api-key
PROPEXO_BASE_URL=https://api.propexo.com
PROPEXO_WEBHOOK_SECRET=your-webhook-signing-secret
Step 3: Connect Your PMS in Propexo¶
In the Propexo dashboard:
- Create a new Connection for your PMS
- Enter your PMS credentials (Yardi username/password, RealPage API key, etc.)
- Authorize Propexo to access your PMS data
- Note the Connection ID -- you will need it in MeterBase
Step 4: Register the Connection in MeterBase¶
- Navigate to Integrations > Propexo
- Click Add Connection
- Enter the Propexo Connection ID
- Select the PMS type
- Click Connect
- MeterBase validates the connection and shows available properties
Import Properties from PMS¶
Once connected, import properties from your PMS into MeterBase:
- Go to Integrations > Propexo
- Select your connection
- Click Import Properties
- Review the list of properties available in your PMS
- Select properties to import
- Assign them to a MeterBase portfolio
- Click Import
# List available properties from PMS
curl "https://api.meterbase.io/api/propexo/connections/1/properties" \
-H "Authorization: Bearer $TOKEN"
# Import selected properties
curl -X POST https://api.meterbase.io/api/propexo/import-properties \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"connection_id": 1,
"portfolio_id": 1,
"propexo_property_ids": ["prop_001", "prop_002", "prop_003"]
}'
Imported properties automatically include:
- Property name and address
- Unit count
- Square footage (if available in the PMS)
- Automatic utility lookup by ZIP code
Sync Units and Leases¶
After importing properties, sync unit-level data for RUBS calculations:
curl -X POST https://api.meterbase.io/api/propexo/sync-units \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"property_id": 1}'
This pulls from the PMS:
| Data | Description | Used For |
|---|---|---|
| Unit number | Unit identifier (e.g., "101", "A-202") | RUBS allocation |
| Square footage | Unit floor area | sqft-based allocation |
| Bedrooms | Bedroom count | bed/bath allocation |
| Bathrooms | Bathroom count | bed/bath allocation |
| Occupancy status | Occupied or vacant | Vacancy handling |
| Occupant count | Number of residents (from lease) | Occupant-based allocation |
| Lease start/end | Active lease dates | Proration and compliance |
| Resident name | Primary leaseholder | Charge posting |
Automatic Sync
When PROPEXO_SYNC_INTERVAL is set (default: 3600 seconds), MeterBase automatically syncs unit data at the configured interval. Disable by setting the value to 0.
The Billing Flow¶
The complete PMS-connected RUBS workflow:
Charge Posting¶
Posting RUBS charges back to the PMS is the most critical part of the integration. Here is how it works in detail.
How It Works¶
- Job creation -- When you confirm RUBS charges for posting, MeterBase creates an async charge posting job.
- Per-unit posting -- The background worker iterates through each unit's charge and posts it to the PMS via Propexo.
- Charge code mapping -- Each charge is posted with a configurable charge code (e.g.,
UTIL,RUBS,ELEC) that maps to your PMS's chart of accounts. - Confirmation tracking -- Propexo returns a charge ID for each posted charge. MeterBase stores this for audit and deduplication.
- Error handling -- If a charge fails to post (e.g., the resident moved out, the unit does not exist in the PMS), it is flagged for manual review.
Charge Posting Request¶
curl -X POST https://api.meterbase.io/api/rubs/post-charges \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"property_id": 1,
"bill_id": 42,
"charge_date": "2026-04-01",
"charge_code": "UTIL",
"description": "March 2026 Utility Charge (RUBS)",
"post_to_pms": true
}'
Job Status¶
Monitor the charge posting job:
Response:
{
"job_id": "job_abc123",
"status": "completed",
"total_charges": 45,
"posted": 44,
"failed": 1,
"failures": [
{
"unit": "304",
"amount": 142.50,
"error": "Resident lease expired. No active lease found for unit 304.",
"propexo_error_code": "LEASE_NOT_FOUND"
}
]
}
Deduplication¶
MeterBase prevents duplicate charges through multiple safeguards:
- Each RUBS calculation is associated with a specific bill ID and billing period
- The system checks for existing charges for the same bill/period before posting
- Propexo returns unique charge IDs that are stored locally for reference
- A confirmation step in the UI shows if charges for this period have already been posted
Enable Charge Posting Carefully
Set PROPEXO_CHARGE_POSTING_ENABLED=true in your environment only after:
- Successfully testing the full flow in a sandbox/test PMS environment
- Verifying that charge codes map correctly to your PMS chart of accounts
- Confirming that RUBS calculations produce expected results
- Getting approval from your accounting team
Webhook Support¶
Propexo can send webhooks to MeterBase for real-time updates. See the Webhook Guide for full details.
Key webhook events:
| Event | Description | MeterBase Action |
|---|---|---|
data.new |
New property, unit, or lease created in PMS | Auto-import or flag for review |
data.update |
Existing record updated in PMS | Update local data |
sync.complete |
Full sync completed | Refresh all unit data |
Data Model Mapping¶
How Propexo fields map to MeterBase fields:
Properties¶
| Propexo Field | MeterBase Field | Notes |
|---|---|---|
id |
propexo_property_id |
External reference ID |
name |
name |
Property name |
address.street |
address |
Street address |
address.city |
city |
City |
address.state |
state |
Two-letter state code |
address.zip |
zip_code |
5-digit ZIP |
unit_count |
unit_count |
Total units |
total_sqft |
square_footage |
May be null in some PMS |
Units¶
| Propexo Field | MeterBase Field | Notes |
|---|---|---|
id |
propexo_unit_id |
External reference ID |
unit_number |
unit_number |
Unit identifier |
sqft |
sqft |
Unit floor area |
bedrooms |
bedrooms |
Bedroom count |
bathrooms |
bathrooms |
Bathroom count |
status |
occupied |
Mapped to boolean |
current_lease.occupant_count |
occupant_count |
From active lease |
Charges (Outbound)¶
| MeterBase Field | Propexo Field | Notes |
|---|---|---|
unit.propexo_unit_id |
unit_id |
Target unit |
charge_amount |
amount |
Dollar amount |
charge_date |
effective_date |
When the charge applies |
charge_code |
charge_code |
Maps to PMS chart of accounts |
description |
description |
Free-text description |
Troubleshooting¶
Connection fails to validate¶
- Verify your Propexo API key is correct in
.env - Ensure the Propexo Connection ID matches an active connection in the Propexo dashboard
- Check that the PMS credentials in Propexo are still valid (passwords may have expired)
Properties not appearing for import¶
- The PMS connection may still be syncing. Initial sync can take 5-30 minutes depending on portfolio size.
- Check the Propexo dashboard for sync status and errors.
- Some PMS platforms require specific permissions to expose property data via API.
Unit data is incomplete¶
- Not all PMS platforms expose every field. Square footage and occupant count may be unavailable.
- Check the PMS configuration to ensure unit-level data fields are populated.
- For missing sqft, enter values manually in MeterBase or import via CSV.
Charge posting fails¶
| Error | Cause | Resolution |
|---|---|---|
LEASE_NOT_FOUND |
No active lease for the unit | Verify occupancy status; unit may have turned over |
INVALID_CHARGE_CODE |
Charge code not configured in PMS | Set up the charge code in your PMS before posting |
DUPLICATE_CHARGE |
Charge for this period already exists | Check if charges were already posted; use the deduplication check |
AUTHORIZATION_FAILED |
PMS credentials expired | Re-authenticate in the Propexo dashboard |
RATE_LIMITED |
Too many API calls to PMS | Wait and retry; MeterBase automatically retries with backoff |
Sync is slow or timing out¶
- Large portfolios (500+ properties) may take 30-60 minutes for initial sync
- Set
PROPEXO_SYNC_INTERVALto a reasonable value (3600+ seconds) to avoid excessive API calls - For very large portfolios, sync during off-peak hours
Test Environment
Most PMS platforms offer sandbox or test environments. Always test the full integration flow (import, sync, calculate, post) in a test environment before connecting to production.