Inferensys

Prompt

Cap Table Extraction and Normalization Prompt

A practical prompt playbook for using Cap Table Extraction and Normalization Prompt in production AI workflows.
Elegant overhead shot of a polished wooden communal table in a sun-drenched WeWork lounge, laptops and tablets displaying AI workflow dashboards, plants and pendant lights in background.
PROMPT PLAYBOOK

When to Use This Prompt

Define the extraction job, the required inputs, and the boundaries where this prompt should not be used.

This prompt is designed for legal operations, finance, and data engineering teams that need to convert unstructured capitalization tables from term sheets, funding documents, or corporate filings into a machine-readable, normalized JSON structure. The core job-to-be-done is transforming a visual or text-based ownership summary—often a mix of narrative text and embedded tables—into a single source of truth that captures shareholder names, share classes, ownership percentages, and dilution calculations. The ideal user is a developer or analyst building an ingestion pipeline for a cap table management system, a data room, or a compliance audit trail, where manual re-keying is too slow and error-prone.

Use this prompt when the input document contains a definitive capitalization table, even if it spans multiple pages or mixes prose with tabular data. It is appropriate for Series Seed through late-stage term sheets, stock ledgers, and pro forma cap tables included in board decks. The prompt expects a clear [DOCUMENT_TEXT] input and an optional [EXISTING_RECORDS] context for deduplication. It is not designed for extracting ownership information from narrative contracts like stock purchase agreements where the cap table is not explicitly summarized, nor for real-time cap table management platforms that already provide API access. Do not use this prompt for calculating complex waterfall liquidation preferences or option pool modeling; it normalizes stated values, not forward-looking financial simulations.

The prompt works best when paired with a pre-processing step that isolates the cap table section from the broader document and a post-processing validation harness that checks for the 'sum-of-parts' integrity (e.g., fully-diluted shares summing to 100%). Before deploying, ensure you have a human review step for any extraction where the confidence score falls below a defined threshold, particularly for handwritten or heavily redacted documents. If the source document is a scanned image, route it through an OCR pipeline first and include the OCR confidence metadata in the [DOCUMENT_TEXT] input to help the model flag uncertain regions.

PRACTICAL GUARDRAILS

Use Case Fit

Cap table extraction sits at the intersection of high-stakes finance and messy document layouts. This prompt works well for structured term sheets and standard filings but breaks when documents are ambiguous, handwritten, or require legal interpretation beyond extraction.

01

Good Fit: Structured Funding Documents

Use when: processing Series A/B/C term sheets, stock purchase agreements, or corporate filings with clearly labeled share classes, authorized shares, and ownership percentages. Why it works: these documents follow predictable section structures and use standardized capitalization terminology that the model can map to a normalized schema.

02

Bad Fit: Ambiguous or Incomplete Records

Avoid when: the source document is missing share counts, uses inconsistent class names, or contains handwritten amendments. Risk: the model may hallucinate missing values or silently misinterpret non-standard terminology. Guardrail: route documents with low extraction confidence to human review before any downstream calculation.

03

Required Inputs for Reliable Extraction

Must have: source document text or OCR output, target schema with field definitions, and a list of expected share classes if known. Strongly recommended: document date, jurisdiction, and any prior cap table version for reconciliation. Guardrail: missing inputs should trigger a structured error response, not a best-guess extraction.

04

Operational Risk: Silent Dilution Errors

What to watch: pro-rata and fully-diluted calculations that propagate from a single misread percentage or missing option pool entry. Impact: downstream cap table models, investor reports, and board decks can carry errors undetected for months. Guardrail: always run subtotal and cross-check validation before accepting normalized output as authoritative.

05

When to Add Human Review

Escalate when: the document contains convertible notes with complex conversion mechanics, multiple liquidation preferences, or anti-dilution provisions that require legal interpretation. Guardrail: the prompt should flag these conditions and route to a qualified reviewer rather than attempting to resolve them algorithmically.

06

Model Selection Considerations

What to watch: smaller models may lose track of multi-page table continuations or confuse share class names across sections. Guardrail: test extraction accuracy on a golden dataset of 20+ cap tables before selecting a model for production. Prefer models with strong table reasoning and long-context handling for multi-page funding documents.

PROMPT PLAYBOOK

Copy-Ready Prompt Template

A reusable prompt for extracting and normalizing cap table data from unstructured documents into a structured, auditable JSON schema.

The following prompt template is designed to be dropped into your application's prompt layer. It instructs the model to act as a financial data extraction specialist, processing capitalization table documents. The prompt uses square-bracket placeholders for all dynamic inputs, allowing you to inject the source document, define the exact output schema, and set operational constraints before each call. This separation ensures the core logic remains stable while the data and rules can be updated independently.

text
You are an expert financial data extraction system. Your task is to process a capitalization table document and extract all shareholder, equity, and dilution information into a strictly normalized JSON structure.

**INPUT DOCUMENT:**

[DOCUMENT_TEXT]

code

**OUTPUT SCHEMA:**
You must output a single JSON object conforming to this exact structure. Do not include any text outside the JSON object.
{
  "company_name": "string",
  "as_of_date": "YYYY-MM-DD",
  "total_authorized_shares": "number | null",
  "total_outstanding_shares": "number | null",
  "fully_diluted_shares": "number | null",
  "share_classes": [
    {
      "class_name": "string (e.g., Common, Series A Preferred)",
      "authorized_shares": "number",
      "issued_shares": "number",
      "outstanding_shares": "number",
      "liquidation_preference": "number | null",
      "conversion_ratio": "number | null",
      "par_value": "number | null"
    }
  ],
  "shareholders": [
    {
      "name": "string",
      "share_class": "string",
      "shares_held": "number",
      "ownership_percentage": "number",
      "fully_diluted_percentage": "number | null",
      "investment_amount": "number | null",
      "acquisition_date": "YYYY-MM-DD | null"
    }
  ],
  "option_pool": {
    "total_shares_reserved": "number | null",
    "issued_shares": "number | null",
    "available_shares": "number | null"
  },
  "convertible_notes": [
    {
      "holder_name": "string",
      "principal_amount": "number",
      "interest_rate": "number | null",
      "maturity_date": "YYYY-MM-DD | null",
      "conversion_discount": "number | null",
      "valuation_cap": "number | null"
    }
  ],
  "extraction_notes": ["string"]
}

**CONSTRAINTS:**
[CONSTRAINTS]

**EXAMPLES:**
[EXAMPLES]

**RISK LEVEL:** [RISK_LEVEL]

**INSTRUCTIONS:**
1. Extract all available data, using `null` for any field where the information is not present or cannot be reliably determined from the document.
2. Calculate `ownership_percentage` as (shares_held / total_outstanding_shares) * 100.
3. Calculate `fully_diluted_percentage` using the `fully_diluted_shares` denominator if available.
4. Reconcile totals: the sum of `outstanding_shares` across all `share_classes` should equal `total_outstanding_shares`. If a discrepancy exists, flag it in `extraction_notes`.
5. For any value that is inferred, interpolated, or calculated rather than directly observed, add a detailed note to `extraction_notes` explaining the method and source cell.
6. If the document contains illegible or ambiguous text, do not guess. Use `null` and add a note describing the issue.

To adapt this template, replace the placeholders with your specific requirements. [DOCUMENT_TEXT] should contain the pre-processed text of the cap table document, ideally with layout hints preserved. [CONSTRAINTS] can be used to enforce rules like 'only extract Series A and later rounds' or 'all monetary values must be in USD'. [EXAMPLES] should be populated with a few-shot demonstration of a correctly parsed cap table to guide the model's output format and edge-case handling. [RISK_LEVEL] should be set to 'high' for production use, which should trigger downstream validation and human review steps in your harness. The next section details how to build that harness.

IMPLEMENTATION TABLE

Prompt Variables

Required and optional inputs for the Cap Table Extraction and Normalization Prompt. Each placeholder must be populated before the prompt is sent to the model. Validation notes describe how to check input quality before execution.

PlaceholderPurposeExampleValidation Notes

[CAP_TABLE_DOCUMENT]

Full text or OCR output of the capitalization table document to extract

Exhibit A – Capitalization Table as of March 15, 2025

Shareholder | Shares | % Ownership...

Must be non-empty string. Check character length > 50. If OCR output, run OCR confidence check before extraction.

[DOCUMENT_TYPE]

Type of source document to set extraction expectations

term_sheet | stock_ledger | 409a_report | certificate_of_incorporation | board_consent

Must match one of the allowed enum values. Controls which fields are expected and which validation rules apply.

[AS_OF_DATE]

Effective date for the cap table snapshot, used to resolve time-sensitive fields

2025-03-15

ISO 8601 date string. If null, prompt will attempt to extract from document. Validate extracted date is within document date range.

[OUTPUT_SCHEMA]

JSON Schema or field specification defining the normalized output structure

{"shareholders": [{"name": "string", "shares": "number", ...}]}

Must be valid JSON Schema or structured field list. Validate with schema parser before prompt assembly. Missing schema causes unstructured output.

[SHARE_CLASS_DEFINITIONS]

Known share class definitions including rights, preferences, and conversion ratios

{"Common": {"type": "common"}, "Series A": {"type": "preferred", "liquidation_preference": "1x", "conversion_ratio": 1}}

Optional. If provided, must be valid JSON object keyed by class name. Used to validate extracted classes and compute fully-diluted values.

[TARGET_CURRENCY]

Currency to normalize any monetary values into

USD

ISO 4217 currency code. If null, values kept in original currency with currency field preserved. Validate against allowed currency list.

[INCLUDE_PRO_RATA]

Whether to compute pro-rata ownership percentages in addition to direct ownership

Boolean. If true, output must include pro_rata_pct field. If false, only direct ownership computed. Validate as boolean before prompt assembly.

[CONFIDENCE_THRESHOLD]

Minimum confidence score for automatic acceptance of extracted values

0.85

Float between 0.0 and 1.0. Values below threshold should be flagged for human review. Default 0.85 if not specified.

PROMPT PLAYBOOK

Implementation Harness Notes

How to wire the cap table extraction prompt into a production document processing pipeline with validation, retries, and human review gates.

This prompt is designed to be the extraction step inside a larger ingestion pipeline, not a standalone chatbot interaction. The typical flow begins with a PDF parser that extracts text and table coordinates, followed by a pre-processing step that identifies candidate cap table pages using a lightweight classifier or keyword heuristic. The prompt receives the raw text of those pages along with any available spatial metadata. After the model returns the normalized JSON, a post-processing validator checks the output against business rules before the data is written to the cap table management system. This separation of concerns—parse, classify, extract, validate, load—keeps each component testable and replaceable.

Wire the prompt into your application using an async job queue. Submit extraction requests with a unique extraction_id, the document text, and any [CONTEXT] such as the company name or funding round label. On success, route the output to a schema validator that checks: (1) all required fields are present and non-null where expected, (2) ownership percentages sum to approximately 100% within a tolerance of 0.01, (3) share counts are positive and internally consistent, and (4) no duplicate shareholder entries exist. If validation fails, retry once with a repair prompt that includes the original output and the specific validation errors. If the retry also fails, flag the extraction for human review and log the full trace—input, output, errors, and model version—for later diagnosis.

Model choice matters here. Use a model with strong structured output capabilities and a large context window if cap tables span multiple pages. Enable JSON mode or structured output constraints to reduce parsing errors. For high-volume production, consider caching the system prompt prefix to reduce latency and cost. Implement idempotency keys on the extraction job to prevent duplicate processing. Most importantly, never auto-commit extracted cap table data to a system of record without either passing validation or receiving human approval. A single misread percentage or missing shareholder can cascade into incorrect dilution calculations, option pool sizing, and investor reporting errors that are expensive to unwind.

IMPLEMENTATION TABLE

Expected Output Contract

Defines the normalized JSON structure for extracted cap table data. Use this contract to validate model output before ingestion into downstream systems.

Field or ElementType or FormatRequiredValidation Rule

security_holders

Array of objects

Must contain at least one entry. Each object must pass the security_holder schema checks.

security_holders[].name

String

Non-empty string. Must match a named entity in the source document. Flag if extracted from context rather than explicit label.

security_holders[].share_class

String (enum)

Must be one of: Common, Preferred, Preferred-A, Preferred-B, Preferred-C, SAFE, Convertible Note, Warrant, Option, Other. Use Other only when no standard class matches.

security_holders[].shares_outstanding

Number

Non-negative number. Must reconcile with source document cell value. Null not allowed; use 0 if explicitly zero.

security_holders[].ownership_percent

Number

Value between 0 and 100. Sum across all holders must be between 99.5 and 100.5. Flag if outside this range.

security_holders[].fully_diluted_percent

Number

Value between 0 and 100. If present, must be less than or equal to ownership_percent. Null allowed when dilution data is absent.

security_holders[].pro_rata_rights

Boolean or null

true, false, or null. Null means not stated in source. Do not infer from share class alone.

extraction_metadata

Object

Must contain source_page, extraction_confidence, and missing_fields array. See sub-field rules below.

extraction_metadata.source_page

Number

Positive integer. Must correspond to a page number visible in or inferable from the source document.

extraction_metadata.extraction_confidence

Number

Value between 0.0 and 1.0. Score below 0.85 must trigger human review routing.

extraction_metadata.missing_fields

Array of strings

List field names that were expected but not found. Empty array if all expected fields present. Use exact field path notation.

PRACTICAL GUARDRAILS

Common Failure Modes

Cap table extraction fails in predictable ways. These are the most common failure modes when extracting and normalizing capitalization tables from term sheets, funding documents, and corporate filings, along with practical mitigations.

01

Share Class Misclassification

What to watch: The model conflates preferred stock series (Series A, Series A-1, Series Seed) or misclassifies common stock as preferred. This happens when share class labels are abbreviated, inconsistent, or embedded in paragraph text rather than table headers. Guardrail: Provide a closed enum of expected share classes in the output schema and require the model to map every extracted class to an enum value. Flag unmapped classes for human review rather than guessing.

02

Ownership Percentage Summation Drift

What to watch: Extracted ownership percentages do not sum to 100% on either a fully-diluted or pro-rata basis. Causes include missed shareholders, double-counting option pool shares, or rounding errors that compound across rows. Guardrail: Add a post-extraction validation step that sums percentages by basis (fully-diluted, pro-rata) and flags any total outside 99.5%-100.5%. Route flagged extractions to human review with the discrepancy amount.

03

Option Pool and Warrant Omission

What to watch: The model extracts only issued and outstanding shares but misses unallocated option pool reserves, outstanding warrants, or convertible notes that affect fully-diluted ownership. These are often described in footnotes or separate sections, not the main cap table. Guardrail: Include explicit fields for option pool size, warrants outstanding, and convertible instruments in the output schema. Instruct the model to scan footnotes and surrounding paragraphs, not just the primary table. Return null with a reason when these fields are not found.

04

Dilution Calculation Errors on Pro-Rata Views

What to watch: The model calculates pro-rata ownership incorrectly by applying the wrong denominator or failing to account for anti-dilution provisions, participation rights, or conversion ratios. This produces misleading ownership percentages that propagate into downstream cap table models. Guardrail: Require the model to output both the raw extracted values and the calculated values separately, with explicit formulas or assumptions noted. Never let calculated values overwrite extracted values without traceability.

05

Shareholder Name Normalization Failures

What to watch: The same shareholder appears under multiple name variants across documents (e.g., 'Acme Ventures II, LP' vs. 'Acme Ventures II, L.P.' vs. 'Acme II'). This fragments ownership records and inflates shareholder counts. Guardrail: Add a normalization step that strips punctuation, standardizes entity suffixes, and groups near-match names for human deduplication. Output both the raw name and the normalized name with a confidence score on the match.

06

Multi-Document Inconsistency Blindness

What to watch: When extracting from multiple documents (term sheet, charter, later amendments), the model treats each document independently and does not flag contradictions in share counts, authorized shares, or ownership percentages across sources. Guardrail: After extracting from each document, run a cross-document reconciliation prompt that compares key fields (total authorized shares, per-class share counts, major holder percentages) and flags discrepancies with source citations for each conflicting value.

IMPLEMENTATION TABLE

Evaluation Rubric

Test the quality of cap table extraction outputs before shipping. Each criterion targets a specific failure mode common in financial document processing.

CriterionPass StandardFailure SignalTest Method

Shareholder Completeness

All named shareholders from source document appear in output with no additions

Missing shareholder entity or hallucinated shareholder name not present in source

Manual count comparison between source document shareholder list and output [SHAREHOLDERS] array length

Share Class Accuracy

Every shareholder assigned correct share class matching source document designation

Common vs Preferred mismatch or invented share class not in source

Spot-check 5 shareholders against source document class labels; verify against [SHARE_CLASSES] enum

Ownership Percentage Sum

Total ownership percentages sum to 100% ± 0.01% across all shareholders

Sum deviates beyond tolerance or individual percentages exceed 100%

Automated summation check on [OWNERSHIP_PCT] field across all output rows

Fully-Diluted Calculation

Fully-diluted percentages account for options, warrants, and convertible securities per source

Fully-diluted values equal basic ownership when dilution instruments exist in source

Compare [FULLY_DILUTED_PCT] against manual calculation using source option pool and warrant data

Pro-Rata Rights Flagging

Pro-rata rights correctly identified as true only for shareholders with contractual participation rights

Pro-rata marked true for all major investors or false for all shareholders

Cross-reference [PRO_RATA_RIGHTS] boolean against source document participation-rights clauses for 3 known holders

Dilution Impact Attribution

Each funding round dilution correctly attributed to specific shareholders with before/after percentages

Dilution applied uniformly across all shareholders or missing round-level breakdown

Verify [DILUTION_EVENTS] array contains per-round entries with matching pre-money and post-money ownership deltas

Null Handling for Missing Fields

Missing data fields output as null with explicit [MISSING_FIELDS] array documenting gaps

Empty string or zero used as placeholder for genuinely absent data

Scan output for zero-value ownership percentages and empty string fields; confirm each maps to source absence

Source Citation Traceability

Every extracted value cites source page, section, or table reference

Values present without any source grounding or citation points to wrong document location

Random-sample 10 extracted values and verify [SOURCE_CITATION] field resolves to correct document position

ADAPTATION OPTIONS

Adapt This Prompt

How to adapt

Use the base prompt with a single cap table document and lighter validation. Remove strict schema enforcement and focus on extracting the core fields: shareholder names, share classes, ownership percentages. Accept JSON output without requiring pro-rata or fully-diluted views.

Simplify the prompt by removing the [FULLY_DILUTED_CALCULATION] and [PRO_RATA_RIGHTS] sections. Replace with: Extract the basic cap table structure. If a field is missing, mark it as null.

Watch for

  • Missing share class distinctions when documents use non-standard terminology
  • Ownership percentages that don't sum to 100% without a reconciliation check
  • Confusion between authorized, issued, and outstanding shares
  • No validation of extracted values against document evidence
Prasad Kumkar

About the author

Prasad Kumkar

CEO & MD, Inference Systems

Prasad Kumkar is the CEO & MD of Inference Systems and writes about AI systems architecture, LLM infrastructure, model serving, evaluation, and production deployment. Over 5+ years, he has worked across computer vision models, L5 autonomous vehicle systems, and LLM research, with a focus on taking complex AI ideas into real-world engineering systems.

His work and writing cover AI systems, large language models, AI agents, multimodal systems, autonomous systems, inference optimization, RAG, evaluation, and production AI engineering.