Cookbook
Run a 280G cleansing vote
Identify disqualified individuals → compute parachute payments → assemble pre-vote disclosure → execute the 75% non-disqualified-stockholder cleansing vote → preserve the §280G deduction.
Last updated
Identify disqualified individuals, compute parachute payments, route a stockholder cleansing vote that strips the §280G excise tax.
Trigger
A change-of-control transaction is on the calendar with payments to disqualified individuals exceeding 3× their base.
Call sequence
1. Create the analysis
POST /v1/parachute_analyses { entity, transaction, change_of_control_date }2. Compute payments
POST /v1/parachute_analyses/{id}/compute3. List eligible (non-disqualified) voters
GET /v1/parachute_analyses/{id}/eligible_voters4. Route cleansing vote
POST /v1/parachute_analyses/{id}/runIdempotency
Analysis idempotent on `(entity, transaction)`. Recompute is safe.
Webhooks
| Event | Description |
|---|---|
parachute_analysis.computed | Numbers ready. |
parachute_analysis.vote_signed | Threshold met → §280G safe harbor. |
Errors
| Status | Code | Description |
|---|---|---|
422 | vote_threshold_failed | 75% of eligible voters did not approve. Excise tax applies. |
When this recipe applies
- About-to-close M&A where any officer's acceleration + change-in-control payments exceed 3× their 5-year W-2 base amount.
- Private-company transactions only — this is the §280G(b)(5) "small business exception", explicitly unavailable to public-company targets.
- Deals where the deal team would rather preserve the parachute than gross up the officer or strip the acceleration.
- Vested stock only — unvested stockholder votes do not count toward the 75% threshold. Refresh the cap table as of the close-record-date before identifying eligible voters.
This recipe is invoked during the
acquire-a-company flow, between
due_diligence → definitive and the close package fire. The cleansing vote
becomes a close_condition reference on the CorporateTransaction.
Phase 1 — Identify disqualified individuals
The IRS test under §280G(c) defines three categories: officers (top-50 threshold rules), 1%+ shareholders, and members of the highest-paid 1% (or top 250) of employees in the prior 12 months. Tax counsel makes the determination; Matter records the structured output.
curl -X POST https://api.mattermode.com/v1/parachute_analyses \
-H "Authorization: Bearer $MATTER_KEY" \
-H "Matter-Version: 2026-05-01" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"corporate_transaction_id": "ctx_2025AcqStr",
"analysis_kind": "dgcl_pre_close",
"tax_counsel_firm": "Cooley LLP",
"disqualified_individuals": [
{
"stakeholder_id": "stk_F0und3rCEO",
"status_kind": "officer",
"status_basis": "ceo_top_50_compensation",
"tenure_years": 6.0
}
]
}'Add additional entries with status_kind: one_percent_holder or
status_kind: other_high_comp if counsel's determination covers more than
the CEO. The status determination is opaque to Matter — it stores the
counsel-supplied basis verbatim.
Phase 2 — Compute parachute payments
Per individual: base amount (5-year W-2 average), parachute payments
(acceleration value + change-in-control bonus + severance + any other
in-the-event-of-cic payment), 3× test. The compute endpoint runs the
arithmetic, stamps threshold_breach, and returns the canonical breakdown.
curl -X POST https://api.mattermode.com/v1/parachute_analyses/pa_280gCEO/compute \
-H "Authorization: Bearer $MATTER_KEY" \
-H "Matter-Version: 2026-05-01" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"stakeholder_id": "stk_F0und3rCEO",
"compensation_history": [
{"year": 2021, "w2_box_1": {"amount": 18500000, "currency": "usd"}},
{"year": 2022, "w2_box_1": {"amount": 19200000, "currency": "usd"}},
{"year": 2023, "w2_box_1": {"amount": 20000000, "currency": "usd"}},
{"year": 2024, "w2_box_1": {"amount": 20000000, "currency": "usd"}},
{"year": 2025, "w2_box_1": {"amount": 22300000, "currency": "usd"}}
],
"parachute_components": {
"acceleration_value": {"amount": 48000000, "currency": "usd"},
"change_in_control_bonus": {"amount": 15000000, "currency": "usd"},
"severance": {"amount": 9000000, "currency": "usd"},
"other_parachutes": {"amount": 0, "currency": "usd"}
}
}'threshold_breach: true is the trigger. If every individual's breakdown
returns false, the cleansing vote is unnecessary — clear the
close_conditions placeholder via
PATCH /v1/corporate_transactions/{id}/close_conditions and skip ahead to
close.
Phase 3 — Assemble pre-vote disclosure
§280G(b)(5)(B)(i) requires "adequate disclosure" to non-disqualified stockholders — who the disqualified individuals are, the parachute amounts, the consequences of approval/disapproval, the procedure. Matter generates the disclosure Document from a versioned template; tax counsel reviews and co-signs.
curl -X POST https://api.mattermode.com/v1/documents \
-H "Authorization: Bearer $MATTER_KEY" \
-H "Matter-Version: 2026-05-01" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"entity_id": "ent_Nq3KcAbc",
"kind": "280g_cleansing_vote_disclosure_statement",
"template_id": "tpl_280g_disclosure",
"merge_fields": {
"parachute_analysis_id": "pa_280gCEO",
"corporate_transaction_id": "ctx_2025AcqStr"
},
"co_signers": [
{"signer_role": "tax_counsel", "signer_email": "partner@cooley.com"}
]
}'After counsel countersigns (document.execution_status: executed),
distribute to every non-disqualified stockholder via the channel of record.
Matter auto-emits disclosure.delivered per recipient and stamps a
per-recipient delivery timestamp on the resolution's eligible_voters[]
array — the IRS disclosure-adequacy test relies on the per-stockholder
delivery trail.
Phase 4 — Identify non-disqualified stockholders
Eligible voters are every stockholder of record on the close-record-date, excluding the disqualified individuals and persons related to them by family or business under the §280G attribution rules.
curl https://api.mattermode.com/v1/parachute_analyses/pa_280gCEO/eligible_voters \
-H "Authorization: Bearer $MATTER_KEY" \
-H "Matter-Version: 2026-05-01"vote_share_percent percentages renormalise across non-disqualified shares
— 75% means 75% of the non-disqualified pool, not 75% of the cap table.
Phase 5 — Execute the cleansing vote
Open the typed resolution. Each non-disqualified stockholder signs with
signing_capacity: non_disqualified_stockholder and a per-vote vote: yes | no | abstain. The resolution finalises when either the yes-tally
crosses 75% (passed) or the remaining-share arithmetic guarantees yes
can never reach 75% (failed).
curl -X POST https://api.mattermode.com/v1/resolutions \
-H "Authorization: Bearer $MATTER_KEY" \
-H "Matter-Version: 2026-05-01" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"entity_id": "ent_Nq3KcAbc",
"kind": "cleansing_vote",
"subject": "§280G cleansing vote — Acme acquisition",
"cleansing_vote": {
"parachute_analysis_id": "pa_280gCEO",
"disclosure_document_id": "doc_280gDisc",
"threshold": 0.75,
"eligible_voters_source": "parachute_analyses.eligible_voters",
"voting_window_days": 21,
"result": "pending"
},
"delivery": { "channel": "email", "reminder_cadence_days": 3 }
}'Phase 6 — Reference in the close-package
A passed cleansing vote becomes a close-condition entry on the parent
CorporateTransaction. The close package can fire only when this condition
is satisfied.
curl -X PATCH https://api.mattermode.com/v1/corporate_transactions/ctx_2025AcqStr/close_conditions \
-H "Authorization: Bearer $MATTER_KEY" \
-H "Matter-Version: 2026-05-01" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"upsert": {
"condition_kind": "cleansing_vote",
"cleansing_vote_resolution_id": "res_280gVote",
"satisfaction_state": "satisfied"
}
}'Once the close-condition flips to satisfied, the closing → closed
advance unblocks.
Error recovery
| Failure | Cause | Remediation |
|---|---|---|
409 Conflict vote_failed_below_75_percent | Resolution finalised as failed — yes-tally cannot reach 75%. | Re-paper the deal with reduced parachute amounts (deal team typically caps at 2.99× base), then re-run the analysis with the new parachute_components. The original pa_* and res_* remain recorded for the audit trail. |
409 Conflict disclosure_inadequate | Tax counsel rejects the rendered disclosure. | Edit parachute_analysis.compute inputs, regenerate the disclosure Document from the same template, re-distribute to every voter. Existing votes are voided. |
409 Conflict stockholder_list_stale | Cap table refreshed after the analysis was created. | Refresh via GET /entities/{id}/cap_table?as_of=<record_date>, then POST /v1/parachute_analyses/{id}/refresh_eligible_voters. Already-cast votes from still-eligible voters carry over. |
403 Forbidden tier_4_cannot_organize_cleansing_vote | Token is tier-4 autonomous. | Re-issue a tier-3 token. Cleansing votes require human-signed counsel attestations under any policy. |
412 Precondition Failed parachute_analysis_not_computed | Resolution open attempted before parachute_analysis.compute ran. | Run the compute call first. |
408 Request Timeout on voting window | Voting window expired without crossing 75% yes and without remaining-share guarantee of failure. | Window auto-closes the resolution as failed. Re-open via POST /v1/resolutions/{id}/reopen only with counsel sign-off and a fresh disclosure. |
Full taxonomy: errors.
Variations
The most common shape — CEO is the only officer with parachutes breaching
3×. One disqualified_individuals[] entry, one breakdown, one disclosure
paragraph, one eligible_voters query.
CEO + CTO + COO all have acceleration + change-in-control payments breaching 3×. Pass each as a separate entry; Matter computes per-individual breakdowns and aggregates the disclosure.
{
"corporate_transaction_id": "ctx_2025AcqStr",
"tax_counsel_firm": "Wilson Sonsini",
"disqualified_individuals": [
{ "stakeholder_id": "stk_F0und3rCEO", "status_kind": "officer", "compensation_history": [/* … */], "parachute_components": {/* … */} },
{ "stakeholder_id": "stk_F0und3rCTO", "status_kind": "officer", "compensation_history": [/* … */], "parachute_components": {/* … */} },
{ "stakeholder_id": "stk_OprCOO", "status_kind": "officer", "compensation_history": [/* … */], "parachute_components": {/* … */} }
]
}The disclosure Document carries one section per individual; the resolution
remains a single cleansing_vote covering all parachutes in aggregate.
The vote fails. Three real-world paths from here:
- Reduce parachutes below 3×. Deal team caps each individual's parachute at 2.99× base (severance trim, acceleration scale-back, or change-in-control bonus reduction). Re-run the analysis with the new components; no second vote required because the threshold no longer breaches.
- Officer eats the §4999 excise tax. The deal closes as papered; each
officer pays the 20% excise out of pocket; the corp loses the §280G
deduction. Record this with
PATCH /v1/parachute_analyses/{id}settingdisposition: officer_pays_excisefor the audit trail. - Gross-up clause activates. If the employment agreement includes a §280G gross-up, the corp pays the officer enough additional non-parachute cash to make them whole post-tax. Rare in 2026 — most modern employment agreements have stripped gross-ups in favour of §280G best-net-of clauses.
This recipe does not apply. The §280G(b)(5) shareholder-approval exception is explicitly available only to private corporations under §280G(b)(5)(A)(ii) — public-company targets cannot cleanse parachutes via stockholder vote. Public acquirers handle parachute exposure via §280G best-net-of clauses, voluntary parachute reductions, or shareholder- advisory votes (which do not confer the same statutory waiver).
If your target is public, drop cleansing_vote from the
close_conditions[] array entirely and route parachute mitigation through
POST /v1/parachute_analyses/{id}/best_net_of_calculation instead.
FAQ
Related
- Acquire a company — the parent recipe; this cleansing-vote flow runs between
definitiveandclosing. - Execute a stock sale — a 100%-cash buyout where parachute analysis is equally applicable.
- Run a board consent — the resolution-organising primitive; cleansing votes are a typed kind on the same machinery.
- Post-exit manage — the post-close §280G recharacterization variant.