Commercial property

A single-location fire and allied perils model using construction class, protection class and sprinklers.

A default model in Ptally. Commercial Property: Single Location is one of the default models you can select when you start a new project in Ptally. It comes with its rate tables, rules and 6 tests, ready to adapt to your own product.
The line of business

Commercial property

Commercial property insurance covers a business's buildings and business personal property (BPP) against fire and other perils. Rating traditionally follows the COPE approach: construction, occupancy, protection and exposure.

Methodology

How the model rates

Buildings and BPP are priced separately as rates per $1,000 of value by state. Both are adjusted for construction class and public fire protection class, and the buildings premium receives a credit if the building is sprinklered.

Total insured value is calculated for underwriting rules. Unprotected frame buildings are declined, and high values, coastal states and large unsprinklered buildings are referred.

Three further factors adjust the combined premium: the building's occupancy, the age of the roof and whether the building is occupied or vacant.

9inputs
13steps
6lookup tables
6tests

Inputs

9 fields
FieldLabelTypeDefaultAllowed values
stateStatestringCACA, NY, TX, FL, IL
construction_classISO construction class (1-6)integer31, 2, 3, 4, 5, 6
protection_classISO public protection class (1-10)integer41, 3, 5, 7, 9, 10
building_valueBuilding value ($)integer1000000250000, 1000000, 5000000, 15000000
bpp_valueBusiness personal property value ($)integer20000050000, 200000, 750000, 2500000
sprinkleredBuilding is sprinkleredbooleantruetrue, false
occupancyOccupancystringofficeoffice, retail, warehouse, manufacturing, restaurant
roof_ageRoof age (years)integer105, 10, 20, 30
vacancyVacancystringoccupiedoccupied, partially_vacant, vacant
The model

Step by step

Steps run in order. Each one can use the inputs and the outputs of every step before it.

01Lookup table
State property base rate

Look up buildings and BPP base rates per $1000 sum insured by state. Coastal-exposed states carry a load.

{
  "id": "state_prop_rates",
  "key": "state_prop_rates",
  "step": "collection",
  "name": "State property base rate",
  "retain": true,
  "collection": [
    ["state", "state_building_rate", "state_bpp_rate", "coastal"],
    ["CA", 2.8, 2.2, false],
    ["NY", 2.6, 2.1, false],
    ["TX", 3.1, 2.4, true],
    ["FL", 4.2, 3.2, true],
    ["IL", 2.4, 1.9, false]
  ],
  "format": {
    "state_building_rate": {
      "key": "state_building_rate",
      "label": "State building rate per $1000",
      "exp": "collection.filter(state=={{state}}).map(state_building_rate).first()",
      "type": "decimal",
      "def": 2.8
    },
    "state_bpp_rate": {
      "key": "state_bpp_rate",
      "label": "State BPP rate per $1000",
      "exp": "collection.filter(state=={{state}}).map(state_bpp_rate).first()",
      "type": "decimal",
      "def": 2.2
    },
    "coastal_flag": {
      "key": "coastal_flag",
      "label": "Coastal-exposed state",
      "exp": "collection.filter(state=={{state}}).map(coastal).first()",
      "type": "boolean",
      "def": false
    }
  }
}
02Lookup table
Construction class factor

Frame construction attracts the highest load; fire-resistive gets the largest credit.

{
  "id": "construction_factors",
  "key": "construction_factors",
  "step": "collection",
  "name": "Construction class factor",
  "retain": true,
  "collection": [
    ["construction_class", "construction_class_factor"],
    [1, 1.35],
    [2, 1.15],
    [3, 1],
    [4, 0.9],
    [5, 0.8],
    [6, 0.7]
  ],
  "format": {
    "construction_class_factor": {
      "key": "construction_class_factor",
      "label": "Construction class factor",
      "exp": "collection.filter(construction_class=={{construction_class}}).map(construction_class_factor).first()",
      "type": "decimal",
      "def": 1
    }
  }
}
03Lookup table
Public protection class factor

PC1 (best fire protection) is the largest credit; PC10 (unprotected) is a substantial load.

{
  "id": "protection_factors",
  "key": "protection_factors",
  "step": "collection",
  "name": "Public protection class factor",
  "retain": true,
  "collection": [
    ["pc_max", "protection_class_factor"],
    [2, 0.85],
    [5, 1],
    [8, 1.2],
    [10, 1.6]
  ],
  "format": {
    "protection_class_factor": {
      "key": "protection_class_factor",
      "label": "Protection class factor",
      "exp": "collection.filter(pc_max>={{protection_class}}).map(protection_class_factor).first()",
      "type": "decimal",
      "def": 1
    }
  }
}
04Transform
Sprinkler credit

10% credit for sprinklered buildings, no adjustment otherwise. Transform (not calculation) so the boolean input resolves cleanly.

{
  "id": "sprinkler_factor",
  "key": "sprinkler_factor",
  "step": "transform",
  "name": "Sprinkler credit",
  "retain": true,
  "format": {
    "sprinkler_factor": {
      "key": "sprinkler_factor",
      "label": "Sprinkler factor",
      "exp": "{{sprinklered}} == true ? 0.90 : 1.00",
      "type": "decimal",
      "def": 1
    }
  }
}
05Calculation
Total insured value

Building + BPP sum insured: used for refer/exclusion thresholds.

{
  "id": "tiv_calc",
  "key": "tiv_calc",
  "step": "calculation",
  "name": "Total insured value",
  "def": 0,
  "formula": "{{building_value}} + {{bpp_value}}"
}
06Calculation
Building premium

Building value in thousands × state rate × construction × protection × sprinkler.

{
  "id": "building_premium",
  "key": "building_premium",
  "step": "calculation",
  "name": "Building premium",
  "def": 0,
  "formula": "round(({{building_value}} / 1000) * {{state_building_rate}} * {{construction_class_factor}} * {{protection_class_factor}} * {{sprinkler_factor}}, 2)"
}
07Calculation
BPP premium

BPP value in thousands × state BPP rate × construction × protection.

{
  "id": "bpp_premium",
  "key": "bpp_premium",
  "step": "calculation",
  "name": "BPP premium",
  "def": 0,
  "formula": "round(({{bpp_value}} / 1000) * {{state_bpp_rate}} * {{construction_class_factor}} * {{protection_class_factor}}, 2)"
}
08Lookup table
Occupancy factor

What happens in the building drives fire risk. Restaurants and manufacturing carry the highest loads.

{
  "id": "occupancy_prop_rates",
  "key": "occupancy_prop_rates",
  "step": "collection",
  "name": "Occupancy factor",
  "retain": true,
  "collection": [
    ["occupancy_value", "occupancy_prop_factor_rel"],
    ["office", 1],
    ["retail", 1.1],
    ["warehouse", 1.15],
    ["manufacturing", 1.3],
    ["restaurant", 1.4]
  ],
  "format": {
    "occupancy_prop_factor": {
      "key": "occupancy_prop_factor",
      "label": "Occupancy factor",
      "exp": "collection.filter(occupancy_value=={{occupancy}}).map(occupancy_prop_factor_rel).first()",
      "type": "decimal",
      "def": 1
    }
  }
}
09Lookup table
Roof age factor

Older roofs are more likely to fail in storms and let water in.

{
  "id": "roof_age_rates",
  "key": "roof_age_rates",
  "step": "collection",
  "name": "Roof age factor",
  "retain": true,
  "collection": [
    ["roof_age_min", "roof_age_max", "roof_age_factor_rel"],
    [0, 10, 1],
    [11, 20, 1.1],
    [21, 999, 1.25]
  ],
  "format": {
    "roof_age_factor": {
      "key": "roof_age_factor",
      "label": "Roof age factor",
      "exp": "collection.filter(roof_age_min<={{roof_age}}).filter(roof_age_max>={{roof_age}}).map(roof_age_factor_rel).first()",
      "type": "decimal",
      "def": 1
    }
  }
}
10Lookup table
Vacancy factor

Vacant buildings are exposed to vandalism, arson and undetected leaks.

{
  "id": "vacancy_rates",
  "key": "vacancy_rates",
  "step": "collection",
  "name": "Vacancy factor",
  "retain": true,
  "collection": [
    ["vacancy_value", "vacancy_factor_rel"],
    ["occupied", 1],
    ["partially_vacant", 1.15],
    ["vacant", 1.4]
  ],
  "format": {
    "vacancy_factor": {
      "key": "vacancy_factor",
      "label": "Vacancy factor",
      "exp": "collection.filter(vacancy_value=={{vacancy}}).map(vacancy_factor_rel).first()",
      "type": "decimal",
      "def": 1
    }
  }
}
11Calculation
Policy premium

Building + BPP premium plus $250 policy fee. Multiplied by the occupancy factor, roof age factor, vacancy factor.

{
  "id": "policy_premium",
  "key": "policy_premium",
  "step": "calculation",
  "name": "Policy premium",
  "def": 0,
  "formula": "round(({{building_premium}} + {{bpp_premium}}) * {{occupancy_prop_factor}} * {{roof_age_factor}} * {{vacancy_factor}} + 250, 2)"
}
12Decline rules
Property exclusions

Decline unprotected frame construction (PC10 + Class 1): outside standard property appetite.

{
  "id": "prop_exclusions",
  "key": "prop_exclusions",
  "step": "exclusion",
  "name": "Property exclusions",
  "def": false,
  "items": [
    {
      "id": "unprotected_frame",
      "name": "Unprotected frame construction",
      "exp": "{{construction_class}} == 1 && {{protection_class}} == 10",
      "def": false
    }
  ]
}
13Refer rules
Property refers

Refer high TIV, coastal state exposures, and non-sprinklered large buildings for underwriter review.

{
  "id": "prop_refers",
  "key": "prop_refers",
  "step": "refer",
  "name": "Property refers",
  "def": false,
  "items": [
    {
      "id": "high_tiv",
      "name": "Total insured value over $10m",
      "exp": "{{tiv_calc}} > 10000000",
      "def": false
    },
    {
      "id": "coastal_exposure",
      "name": "Coastal state exposure",
      "exp": "{{coastal_flag}} == true",
      "def": false
    },
    {
      "id": "large_non_sprinklered",
      "name": "Non-sprinklered building over $2m",
      "exp": "{{sprinklered}} == false && {{building_value}} > 2000000",
      "def": false
    }
  ]
}
Worked example

Worked example: retail building with a 20 year old roof

This quote was priced by the Ptally rating engine. The trace below follows it through every step to the final result.

Quote input
{
  "state": "CA",
  "construction_class": 4,
  "protection_class": 3,
  "building_value": 800000,
  "bpp_value": 150000,
  "sprinklered": true,
  "occupancy": "retail",
  "roof_age": 20,
  "vacancy": "occupied"
}
Result2,804.79VALID
Calculation trace
  1. State property base rateLookup table
    state_building_rate = 2.8 · state_bpp_rate = 2.2 · coastal_flag = false
  2. Construction class factorLookup table
    construction_class_factor = 0.9
  3. Public protection class factorLookup table
    protection_class_factor = 1
  4. Sprinkler creditTransform
    true == true ? 0.90 : 1.00 → 0.9
  5. Total insured valueCalculation
    800,000 + 150,000 = 950,000
  6. Building premiumCalculation
    round((800,000 / 1000) * 2.8 * 0.9 * 1 * 0.9, 2) = 1,814.4
  7. BPP premiumCalculation
    round((150,000 / 1000) * 2.2 * 0.9 * 1, 2) = 297
  8. Occupancy factorLookup table
    occupancy_prop_factor = 1.1
  9. Roof age factorLookup table
    roof_age_factor = 1.1
  10. Vacancy factorLookup table
    vacancy_factor = 1
  11. Policy premiumCalculation
    round((1,814.4 + 297) * 1.1 * 1.1 * 1 + 250, 2) = 2,804.79
  12. Property exclusionsDecline rules
    Unprotected frame construction: not fired
  13. Property refersRefer rules
    Total insured value over $10m: not firedCoastal state exposure: not firedNon-sprinklered building over $2m: not fired
Start from this model

Select commercial property as the default model for a new project, then change the rates, rules and tests to match your product. Our consultants can do this for you, with no implementation fee.

Talk to our team