VRPlatformVRPlatform

Statement Layouts

Customizing owner statement layouts, sections, columns, and visibility

Statement Layouts

Overview

Statement layouts are templates that control how owner statements appear. They define:

  • Which sections appear on the statement
  • What data columns display in each section
  • Who can see each section (owner vs manager)
  • How totals are calculated and presented

Create different layouts for different needs - detailed statements for some properties, summary views for others.

Key Concepts

Layout Structure

A layout consists of three main parts:

PartDescription
netRevenueSectionsRevenue, fees, and income breakdown
otherSectionsAdditional custom sections
systemSectionsAuto-generated sections (read-only)

Summary Types

TypeDescription
defaultStandard statement format
invoiceInvoice-style presentation

Sections

Each section has:

  • Name: Section header displayed on statement
  • Columns: Data points shown in the section
  • Visibility: Who can see this section
  • Locked: Whether the section can be modified

Column Types

Columns define what data appears in each section:

TypeDescriptionValue Format
fieldSpecific data fieldField name string
accountsSum of account balancesArray of account IDs
subTotalRunning subtotalCalculation reference
formula.percentagePercentage calculationFormula expression
formula.currencyCurrency calculationFormula expression

Visibility Settings

Control who sees each section and column:

SettingDescription
allVisible to everyone
managerOnly property manager sees this
ownerOnly property owner sees this
noneHidden from everyone

Use cases:

  • Hide internal notes from owners with manager
  • Show owner-specific messages with owner
  • Disable sections temporarily with none

Linked Accounts

The linkedAccounts array shows all accounts referenced in the layout. This determines which account data is pulled into statements using this layout.

Active Listings

Assign layouts to specific listings via activeListingIds. When generating a statement for a listing, the system uses its assigned layout (or the default layout if none assigned).

Default Layout

One layout can be marked as isDefault: true. This layout is used for listings that don't have a specific layout assigned.

Locking Behavior

Layouts become locked when any owner statement uses them:

ConditionEffect
Layout has attached statementsCannot modify sections or columns
Layout has attached statementsCannot delete the layout

The issues array indicates lock status:

{
  "issues": [
    {
      "code": "locked",
      "severity": "warning",
      "context": {
        "attachedStatementCount": 5
      }
    }
  ]
}

To modify a locked layout: Create a new layout with your changes and assign it to listings going forward.

Common Scenarios

Creating a Basic Layout

POST /statement-layouts
{
  "name": "Standard Owner Statement",
  "summaryType": "default",
  "isDefault": true,
  "netRevenueSections": [
    {
      "name": "Rental Revenue",
      "visible": "all",
      "columns": [
        {
          "name": "Rental Income",
          "type": "accounts",
          "value": ["account-rent", "account-cleaning-income"]
        }
      ]
    },
    {
      "name": "Management Fees",
      "visible": "all",
      "columns": [
        {
          "name": "Management Fee (20%)",
          "type": "accounts",
          "value": ["account-mgmt-fee"]
        }
      ]
    }
  ],
  "otherSections": [
    {
      "name": "Property Expenses",
      "visible": "all",
      "columns": [
        {
          "name": "Repairs",
          "type": "accounts",
          "value": ["account-repairs"]
        },
        {
          "name": "Utilities",
          "type": "accounts",
          "value": ["account-utilities"]
        }
      ]
    }
  ]
}

Creating a Detailed Layout with Manager-Only Section

POST /statement-layouts
{
  "name": "Detailed Statement with Internal Notes",
  "summaryType": "default",
  "netRevenueSections": [
    {
      "name": "Revenue Breakdown",
      "visible": "all",
      "columns": [
        {
          "name": "Accommodation",
          "type": "accounts",
          "value": ["account-rent"]
        },
        {
          "name": "Cleaning Fees",
          "type": "accounts",
          "value": ["account-cleaning"]
        },
        {
          "name": "Other Fees",
          "type": "accounts",
          "value": ["account-other-fees"]
        }
      ]
    },
    {
      "name": "Internal Commission Tracking",
      "visible": "manager",
      "columns": [
        {
          "name": "Gross Commission",
          "type": "accounts",
          "value": ["account-commission-gross"]
        },
        {
          "name": "Agent Split",
          "type": "accounts",
          "value": ["account-agent-split"]
        }
      ]
    }
  ],
  "otherSections": []
}

Assigning Layout to Listings

PUT /statement-layouts/layout-123
{
  "activeListingIds": ["listing-abc", "listing-def", "listing-ghi"]
}

Updating a Layout

PUT /statement-layouts/layout-123
{
  "name": "Updated Layout Name",
  "summaryType": "invoice"
}

API Endpoints

MethodEndpointDescription
GET/statement-layoutsList all layouts
GET/statement-layouts/{id}Get layout details
POST/statement-layoutsCreate a layout
PUT/statement-layouts/{id}Update a layout
DELETE/statement-layouts/{id}Delete a layout

Response Structure

{
  "id": "layout-123",
  "name": "Standard Owner Statement",
  "summaryType": "default",
  "isDefault": true,
  "createdAt": "2024-01-15T10:30:00Z",
  "netRevenueSections": [
    {
      "id": "section-1",
      "name": "Rental Revenue",
      "visible": "all",
      "locked": false,
      "columns": [
        {
          "id": "col-1",
          "name": "Rental Income",
          "type": "accounts",
          "value": ["account-rent"],
          "visible": "all",
          "locked": false
        }
      ]
    }
  ],
  "otherSections": [],
  "systemSections": [
    {
      "id": "system-summary",
      "name": "Summary",
      "visible": "all",
      "locked": true,
      "columns": [
        {
          "id": "sys-col-1",
          "name": "Net Income",
          "type": "field",
          "value": "netIncome",
          "visible": "all",
          "locked": true
        }
      ]
    }
  ],
  "activeListings": [
    {"id": "listing-abc", "name": "Beach House"},
    {"id": "listing-def", "name": "Mountain Cabin"}
  ],
  "linkedAccounts": [
    {"id": "account-rent", "name": "Rental Income", "uniqueRef": null, "status": "active"},
    {"id": "account-mgmt-fee", "name": "Management Fee", "uniqueRef": null, "status": "active"}
  ],
  "issues": []
}

Locking Rules

Statement layouts are subject to locking:

ConditionBlocked Operations
Has attached statementsCannot modify sections or columns
Has attached statementsCannot delete
Is default layoutCannot delete (must set another as default first)

On this page