Skip to content

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.

flowchart LR G["MeterBase"] <--> P["Propexo API"] P <--> Y["Yardi Voyager"] P <--> R["RealPage"] P <--> E["Entrata"] P <--> A["AppFolio"] P <--> B["Buildium"] P <--> RM["Rent Manager"] P <--> M["MRI Software"] P <--> PW["Propertyware"] P <--> RV["RentVine"] P <--> RS["Res-Man"]

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:

  1. Create a new Connection for your PMS
  2. Enter your PMS credentials (Yardi username/password, RealPage API key, etc.)
  3. Authorize Propexo to access your PMS data
  4. Note the Connection ID -- you will need it in MeterBase

Step 4: Register the Connection in MeterBase

  1. Navigate to Integrations > Propexo
  2. Click Add Connection
  3. Enter the Propexo Connection ID
  4. Select the PMS type
  5. Click Connect
  6. MeterBase validates the connection and shows available properties
curl -X POST https://api.meterbase.io/api/propexo/connections \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "propexo_connection_id": "conn_abc123",
    "pms_type": "yardi",
    "name": "Yardi - West Coast Portfolio"
  }'

Import Properties from PMS

Once connected, import properties from your PMS into MeterBase:

  1. Go to Integrations > Propexo
  2. Select your connection
  3. Click Import Properties
  4. Review the list of properties available in your PMS
  5. Select properties to import
  6. Assign them to a MeterBase portfolio
  7. 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:

sequenceDiagram participant PMS as Property Management System participant P as Propexo participant G as MeterBase participant W as MeterBase Worker Note over G: Step 1: Sync Unit Data G->>P: GET /units?property_id=X P->>PMS: Fetch units, leases, occupancy PMS-->>P: Unit data P-->>G: Normalized unit list G->>G: Update local unit records Note over G: Step 2: Upload Bill + Calculate RUBS G->>G: User uploads bill PDF G->>G: AI extracts bill data G->>G: User runs RUBS calculation G->>G: Review charges per unit Note over G: Step 3: Post Charges to PMS G->>W: Create charge posting job W->>P: POST /charges (for each unit) P->>PMS: Create resident charge PMS-->>P: Charge confirmation P-->>W: Charge ID + status W->>G: Update job status Note over G: Step 4: Verify G->>G: User reviews posting results

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

  1. Job creation -- When you confirm RUBS charges for posting, MeterBase creates an async charge posting job.
  2. Per-unit posting -- The background worker iterates through each unit's charge and posts it to the PMS via Propexo.
  3. 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.
  4. Confirmation tracking -- Propexo returns a charge ID for each posted charge. MeterBase stores this for audit and deduplication.
  5. 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:

curl "https://api.meterbase.io/api/rubs/post-status/job_abc123" \
  -H "Authorization: Bearer $TOKEN"

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:

  1. Successfully testing the full flow in a sandbox/test PMS environment
  2. Verifying that charge codes map correctly to your PMS chart of accounts
  3. Confirming that RUBS calculations produce expected results
  4. 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_INTERVAL to 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.