Primary general liability looks deceptively simple — a limit, a class code, a premium — but it is a class-rated line, and the price is only as good as the exposure basis behind it. A single submission for a mid-market contractor, manufacturer, or retailer arrives as a broker email with the ask, an ACORD/GL application carrying the insured’s identity and requested limits, an exposure-by-class schedule that breaks the operations into rateable units, and loss runs showing what the account has actually cost. The number that decides the premium — the rate applied to the right exposure base for the right class — is never on any one page.

Most intake tools read one document at a time and hand back a flat list of fields. That is not how a GL account is underwritten. InsightXtract runs an agentic, multi-document pipeline that classifies each file, extracts to a per-document schema, consolidates everything into one unified account record by source priority, and validates it against your rules and reference data — so the underwriter opens a single, coded, cited record instead of a stack of files.

flowchart LR A[Broker email
GL application
exposure-by-class
loss runs] --> B[Classify
each document] B --> C[Extract to the
right schema] C --> D[Consolidate
by source priority] D --> E[Standardize
codes + limits] E --> F[Validate
rules + reference data] F --> G[One coded,
cited GL record]

One submission, several documents, one connected record — classify, extract, consolidate, standardize, validate.

The idea that governs everything: the class is the rate

Before the categories, the single most important concept. In general liability, the premium is a rate applied to an exposure base, chosen by class. A $10M-revenue account tells you almost nothing until you know what kind of operation earns it and which exposure base the class rates on — gross sales for a products risk, payroll for a contractor, square footage for premises. Get the class code, the exposure base, and the amount right, and the rate does the rest. Get any one of them wrong and the price is wrong.

So InsightXtract doesn’t just grab a single revenue figure. It captures the identity and coverage as point-in-time facts, and it reads the exposure-by-class schedule as a table — one row per class code — so the rated units line up with the classes they belong to. In the tables below, the Captured column flags how each parameter is stored:

  • Point-in-time — a single static fact about the account or the ask.
  • Current — a value captured once for this term.
  • Per-row — a table: one class, or one claim, per row.

A · Insured identity & classification

Who the account is, how it’s legally structured, and how its operations are classified — the keys for clearance, appetite, and class-based rating. Source: GL application.

ParameterCapturedWhy it matters
Named insured · DBA / trade name · FEINPoint-in-timeThe contract party and unique account key — drives clearance, conflicts, and de-dupe.
Mailing / physical address · risk state · insured statePoint-in-timeVenue and jurisdiction — standardized against US state codes for filings and rating territory.
NAICS code · SIC code · ISO GL class codePoint-in-timeClass-based rating and appetite / knockout — NAICS is validated against the reference table.
Entity type · business description · years in businessPoint-in-timeLegal form, true nature of operations, and stability credit beyond the code.
Hazard gradePoint-in-timeThe severity tier that modifies the base rate for the class.

B · Broker & submission

The distribution chain and the ask itself — who is placing the account and the exact cover being requested. Source: broker submission email.

ParameterCapturedWhy it matters
Broker name · broker emailPoint-in-timeDistribution routing, binding authority, and correspondence trail.
ProductCurrentThe coverage form and workflow the submission belongs to.
Effective dateCurrentTerm start and the binding deadline — normalized to a standard date format.
Requested limitCurrentThe capacity being asked for — the headline of the ask.

C · Coverage & limits

The full limit structure of the GL policy — the shape of the promise, not just the headline number. Each limit is normalized to currency. Source: GL application.

ParameterCapturedWhy it matters
Each-occurrence limitCurrentThe per-loss ceiling — the core of the capacity being offered.
General aggregate limitCurrentThe annual ceiling across all claims — total exposure for the term.
Products / completed-ops aggregate limitCurrentThe separate cap on products and completed-work claims — often the severity tail.
Personal & advertising injury limitCurrentOffense-based cover for libel, slander, and advertising injury.
Medical expense limitCurrentNo-fault premises med-pay — small but a frequency driver.
DeductibleCurrentRetained loss per claim — how much risk the insured holds before the policy responds.
PremiumCurrentThe quoted / target price — the number the exposure basis has to justify.

D · Exposure basis

The rating fuel — the operational size the rate is applied to. Which base matters depends on the class, so InsightXtract captures all of them and records which basis governs. Source: GL application.

ParameterCapturedWhy it matters
Exposure basis (sales / payroll / area / units)CurrentDeclares which unit the class actually rates on — the anchor for the whole calculation.
Estimated revenue · gross salesCurrentThe primary exposure base for products and mercantile classes — normalized to currency.
Total payroll · employee countCurrentThe exposure base for contractor and service classes, and a workforce-size signal.
Subcontractor costsCurrentTransferred and contingent liability the GL policy may absorb — a risk-transfer driver.

E · Exposure by class — one row per class code

This is where the rate meets the risk. InsightXtract reads the exposure schedule as a table — one row per ISO GL class — so the rated units line up with the classes they belong to, instead of collapsing to a single blended number. Source: GL application.

ColumnTypeWhy it matters
Class codePer-rowThe ISO GL classification for this slice of operations — picks the base rate.
Class descriptionPer-rowWhat the code actually covers — the human check on the coding.
Exposure basePer-rowThe unit this class rates on (sales, payroll, area) — can differ row to row.
Exposure amountPer-rowThe size of this class’s operations — the multiplier for its rate, in currency.
RatePer-rowThe rate per exposure unit — amount × rate is the class’s premium contribution.

F · Products & completed operations

The severity tail of a GL account — the harm a product or a finished job can cause after it leaves the insured’s hands. Source: GL application.

ParameterCapturedWhy it matters
Products / completed-operations descriptionCurrentWhat the insured makes or builds — the nature of the products-liability exposure.
Products / completed-ops limitCurrentThe dedicated aggregate for products claims — the cap on the severity tail.

G · Additional insureds & risk transfer

Where liability actually lands — the contracts and endorsements that pull other parties’ exposure onto (or off) this policy. Source: GL application.

ParameterCapturedWhy it matters
Additional-insureds countCurrentHow much other-party exposure the policy is extended to — a scope-creep signal.
Subcontractor costsCurrentThe scale of work handed to subs — risk transferred in, and quality of that transfer.
Underlying scheduleCurrentThe policies this GL sits under or alongside — coordination with any excess tower.

H · Loss history — loss runs, one row per claim

The single biggest pricing input. InsightXtract reads each claim as a row across the loss run and standardizes the states and money fields so the rollups — frequency, severity, open reserves — can be computed cleanly. Source: loss run (Excel).

ColumnTypeWhy it matters
Claim number · date of lossPer-rowEach loss’s identity and timing — the basis for year-over-year frequency.
Claimant · line · statePer-rowWho was hurt, under which coverage, in which venue — state normalized to US codes.
Cause of lossPer-rowThe nature of the claim — slip-and-fall vs. products vs. completed-ops severity.
Incurred · paid · reservePer-rowTotal cost, cash out, and open exposure still on the books — all in currency.
Status (open / closed)Per-rowWhether the loss can still develop — open claims are future volatility.

From several documents to one connected record

Pulling these parameters out of three or four documents is only half the job. The value is in consolidation: the insured named on the application, the broker on the email, the classes on the exposure schedule, and the claims on the loss run all describe one account. InsightXtract merges them by a declared source-of-truth priority — the application wins on insured identity and limits, the email supplies the broker and the ask — then standardizes the result: state codes and NAICS resolved against reference tables, every limit and loss amount formatted as currency, the effective date normalized. Fields carry provenance and confidence, so every value is cited back to the document and page it came from.

The InsightXtract extraction workspace — a primary general liability submission consolidated into one coded record: insured identity, coverage limits, the exposure-by-class schedule, and the loss run, each field cited to its source document
The consolidated GL submission in the extraction workspace — every document’s values merged into one coded record, each field cited back to its source.

Why coded, not just captured

An underwriter doesn’t want raw text — they want the class code validated, the state resolved, the limits comparable across accounts. Standardizing at extraction time means the exposure-by-class schedule and the loss run arrive ready to rate, with the reference-data checks already run and any mismatch flagged as a warning instead of surfacing as a mispriced quote.

Why it matters to the business

Comprehensive, structured, class-aware extraction isn’t a data-entry nicety — it changes the economics and quality of the book:

  • Accurate class-based rating. Reading the exposure-by-class schedule as a table — class code, base, amount, and rate per row — means the premium is built from the right units for the right classes, not a blended guess.
  • Products / completed-ops severity in view. The description and the dedicated aggregate are captured by default, so the severity tail that produces the biggest GL losses reaches the underwriter instead of hiding in an application field.
  • Subcontractor risk transfer, priced. Subcontractor costs and additional-insured counts surface how much liability is being transferred in — and how well — which is exactly what separates two contractors with identical revenue.
  • Loss trend you can trust. Each claim as a row, with incurred, paid, reserve, and status standardized, means frequency and severity roll up cleanly — and open reserves flag the accounts still developing.
  • Consistency and auditability. The same categories, coded the same way, validated against the same reference data, every time — with provenance to the source document. That is the difference between a repeatable book and one that depends on which underwriter opened the file.

The Primary General Liability agent extracts all of this today — the insured identity and classification; the broker and submission; the full coverage-limit structure; the exposure basis; the exposure-by-class schedule; products / completed-operations; additional insureds and risk transfer; and the loss run — consolidated into one coded record of 35+ fields and two linked tables, every value standardized, validated, and cited to its source document. The point this post makes is why it matters: in a class-rated line, the class, the base, and the loss trend are what move the price, so they’re captured by default. And because it’s all configuration — fields and tables in the agent’s output contract, not code — the schema keeps pace with what underwriters ask for.