A single-location fire and allied perils model using construction class, protection class and sprinklers.
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.
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.
| Field | Label | Type | Default | Allowed values |
|---|---|---|---|---|
state | State | string | CA | CA, NY, TX, FL, IL |
construction_class | ISO construction class (1-6) | integer | 3 | 1, 2, 3, 4, 5, 6 |
protection_class | ISO public protection class (1-10) | integer | 4 | 1, 3, 5, 7, 9, 10 |
building_value | Building value ($) | integer | 1000000 | 250000, 1000000, 5000000, 15000000 |
bpp_value | Business personal property value ($) | integer | 200000 | 50000, 200000, 750000, 2500000 |
sprinklered | Building is sprinklered | boolean | true | true, false |
occupancy | Occupancy | string | office | office, retail, warehouse, manufacturing, restaurant |
roof_age | Roof age (years) | integer | 10 | 5, 10, 20, 30 |
vacancy | Vacancy | string | occupied | occupied, partially_vacant, vacant |
Steps run in order. Each one can use the inputs and the outputs of every step before it.
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
}
}
}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
}
}
}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
}
}
}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
}
}
}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}}"
}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)"
}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)"
}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
}
}
}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
}
}
}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
}
}
}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)"
}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
}
]
}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
}
]
}This quote was priced by the Ptally rating engine. The trace below follows it through every step to the final result.
{
"state": "CA",
"construction_class": 4,
"protection_class": 3,
"building_value": 800000,
"bpp_value": 150000,
"sprinklered": true,
"occupancy": "retail",
"roof_age": 20,
"vacancy": "occupied"
}state_building_rate = 2.8 · state_bpp_rate = 2.2 · coastal_flag = falseconstruction_class_factor = 0.9protection_class_factor = 1true == true ? 0.90 : 1.00 → 0.9800,000 + 150,000 = 950,000round((800,000 / 1000) * 2.8 * 0.9 * 1 * 0.9, 2) = 1,814.4round((150,000 / 1000) * 2.2 * 0.9 * 1, 2) = 297occupancy_prop_factor = 1.1roof_age_factor = 1.1vacancy_factor = 1round((1,814.4 + 297) * 1.1 * 1.1 * 1 + 250, 2) = 2,804.79Unprotected frame construction: not firedTotal insured value over $10m: not firedCoastal state exposure: not firedNon-sprinklered building over $2m: not firedSelect 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.