> For the complete documentation index, see [llms.txt](https://support.pears.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://support.pears.io/updates/data-mart-changelog.md).

# Data Mart Changelog

A version-by-version record of changes to the PEARS data mart: tables, columns, types, and how data is populated.

This page records changes to the PEARS [data mart](/analyze/data-mart.md) in reverse chronological order: tables and columns added, deleted, or deprecated. It is written for the analysts and developers who query the data mart directly, so it names tables and columns exactly as they appear in the database.

Releases without data mart changes are not listed. The main [Changelog](/changelog.md) links here from each release that has them. For the standing list of everything currently deprecated, with the dates each was marked and removed, see [Deprecated Tables and Columns](/updates/data-mart-changelog/deprecations.md).

{% hint style="info" %}
**NOTE:** This changelog covers 2026 releases and beyond only. The page was created in September 2026, and the entries below it were compiled from the schema history at that time, so some changes were not announced when they shipped.
{% endhint %}

## Released

{% updates format="full" %}
{% update date="2026-09-30" %}

## 26.16.4

### <i class="fa-plus">:plus:</i> New Columns <a href="#id-26.16.4-new-columns" id="id-26.16.4-new-columns"></a>

From Reporting Year 2027, Youth Programming collects race and ethnicity as one combined question, in the same columns added to `program_activity_demographic` in 26.16.0. Records in earlier reporting periods leave the columns below empty and keep using the existing race and ethnicity columns, which are unchanged. A 2027 record saved before this release may hold only the existing race and ethnicity counts, with the columns below empty.

1. `program_activity_youth`
   * `race_ethnicity_one_american_indian_alaskan_native`, `race_ethnicity_one_asian`, `race_ethnicity_one_black`, `race_ethnicity_one_hawaiian_pacific_islander`, `race_ethnicity_one_hispanic_latino`, `race_ethnicity_one_middle_eastern_north_african`, `race_ethnicity_one_white` — Number of youth reporting that category as their only race or ethnicity.
   * `race_ethnicity_mult_american_indian_alaskan_native`, `race_ethnicity_mult_asian`, `race_ethnicity_mult_black`, `race_ethnicity_mult_hawaiian_pacific_islander`, `race_ethnicity_mult_hispanic_latino`, `race_ethnicity_mult_middle_eastern_north_african`, `race_ethnicity_mult_white` — Number of youth reporting that category among two or more races or ethnicities.
   * `race_ethnicity_two_or_more` — Number of unique youth reporting two or more races or ethnicities.
   * `race_ethnicity_prefer_not_to_respond` — Number of youth who preferred not to report a race or ethnicity.
   * `race_ethnicity_unknown` — Number of youth whose race or ethnicity is unknown.
     {% endupdate %}

{% update date="2026-09-21" %}

## 26.16.0

### <i class="fa-plus">:plus:</i> New Columns <a href="#id-26.16.0-new-columns" id="id-26.16.0-new-columns"></a>

From Reporting Year 2027, PEARS collects race and ethnicity as one combined question in place of the separate race and ethnicity questions. A record in a 2027-or-later reporting period populates the columns below and leaves the existing race and ethnicity columns empty; records in earlier reporting periods keep using the existing columns, which are unchanged.

1. `direct_contact`
   * `race_ethnicity_one_american_indian_alaskan_native`, `race_ethnicity_one_asian`, `race_ethnicity_one_black`, `race_ethnicity_one_hawaiian_pacific_islander`, `race_ethnicity_one_hispanic_latino`, `race_ethnicity_one_middle_eastern_north_african`, `race_ethnicity_one_white` — Number of Direct Contacts reporting that category as their only race or ethnicity.
   * `race_ethnicity_mult_american_indian_alaskan_native`, `race_ethnicity_mult_asian`, `race_ethnicity_mult_black`, `race_ethnicity_mult_hawaiian_pacific_islander`, `race_ethnicity_mult_hispanic_latino`, `race_ethnicity_mult_middle_eastern_north_african`, `race_ethnicity_mult_white` — Number of Direct Contacts reporting that category among two or more races or ethnicities.
   * `race_ethnicity_two_or_more` — Number of Direct Contacts reporting two or more races or ethnicities.
   * `race_ethnicity_prefer_not_to_respond` — Number of Direct Contacts who preferred not to report their race or ethnicity.
   * `race_ethnicity_unknown` — Number of Direct Contacts whose race or ethnicity is unknown.
2. `program_activity_demographic`
   * `race_ethnicity_one_american_indian_alaskan_native`, `race_ethnicity_one_asian`, `race_ethnicity_one_black`, `race_ethnicity_one_hawaiian_pacific_islander`, `race_ethnicity_one_hispanic_latino`, `race_ethnicity_one_middle_eastern_north_african`, `race_ethnicity_one_white` — Number of participants reporting that category as their only race or ethnicity.
   * `race_ethnicity_mult_american_indian_alaskan_native`, `race_ethnicity_mult_asian`, `race_ethnicity_mult_black`, `race_ethnicity_mult_hawaiian_pacific_islander`, `race_ethnicity_mult_hispanic_latino`, `race_ethnicity_mult_middle_eastern_north_african`, `race_ethnicity_mult_white` — Number of participants reporting that category among two or more races or ethnicities.
   * `race_ethnicity_two_or_more` — Number of unique participants reporting two or more races or ethnicities.
   * `race_ethnicity_prefer_not_to_respond` — Number of participants who preferred not to report a race or ethnicity.
   * `race_ethnicity_unknown` — Number of participants whose race or ethnicity is unknown.
3. `pse`
   * `reach_percent_race_ethnicity_american_indian_alaskan_native`, `reach_percent_race_ethnicity_asian`, `reach_percent_race_ethnicity_black`, `reach_percent_race_ethnicity_hawaiian_pacific_islander`, `reach_percent_race_ethnicity_hispanic_latino`, `reach_percent_race_ethnicity_middle_eastern_north_african`, `reach_percent_race_ethnicity_white` — Percentage of the PSE site reach reported as that category.
   * `reach_percent_race_ethnicity_two_or_more` — Percentage of the PSE site reach reported as two or more races or ethnicities.
4. `quarterly_effort`
   * `race_ethnicity_one_american_indian_alaskan_native`, `race_ethnicity_one_asian`, `race_ethnicity_one_black`, `race_ethnicity_one_hawaiian_pacific_islander`, `race_ethnicity_one_hispanic_latino`, `race_ethnicity_one_middle_eastern_north_african`, `race_ethnicity_one_white` — Number of contacts reporting that category as their only race or ethnicity.
   * `race_ethnicity_two_or_more` — Number of contacts reporting two or more races or ethnicities. Quarterly Efforts record the two-or-more total only, with no per-category multiple-selection columns.
   * `race_ethnicity_prefer_not_to_respond` — Number of contacts who preferred not to report their race or ethnicity.
   * `race_ethnicity_unknown` — Number of contacts whose race or ethnicity is unknown.
     {% endupdate %}

{% update date="2026-09-10" %}

## 26.15.0

### <i class="fa-plus">:plus:</i> New Tables <a href="#id-26.15.0-new-tables" id="id-26.15.0-new-tables"></a>

The Partners module replaces the legacy partnership module with one ongoing record per partner organization, and Partner Reports cover a partner across one or more reporting periods.

* Partner records: `partner`, `partner_crm_person`, `partner_activity`, `partner_file`
* Module links and their contribution types: `action_plan_partner`, `action_plan_partner_contribution`, `program_activity_partner`, `program_activity_partner_contribution`, `pse_partner`, `pse_partner_contribution`, `indirect_activity_partner`, `indirect_activity_partner_contribution`, `success_story_partner`, `success_story_partner_contribution`, `response_partner`, `response_partner_contribution`
* CRM interaction links: `crm_interaction_partner`, `crm_interaction_action_plan`
* Partner reports: `partner_report`, `partner_report_reporting_period`, `partner_report_program_area`, `partner_report_assessment`, `partner_report_accomplishment_lesson`, `partner_report_file`
* Activities selected onto a partner report: `partner_report_partner_activity`, `partner_report_action_plan_partner`, `partner_report_program_activity_partner`, `partner_report_pse_partner`, `partner_report_indirect_activity_partner`, `partner_report_success_story_partner`, `partner_report_response_partner`

### <i class="fa-plus">:plus:</i> New Columns <a href="#id-26.15.0-new-columns" id="id-26.15.0-new-columns"></a>

1. `action_plan`
   * `includes_evaluation` — Whether the plan includes the situation assessment and outcome sections.
2. `crm_interaction`
   * `interaction_date` — Date the interaction occurred.
   * `interaction_time` — Time of day the interaction occurred, when one was given.
   * `site_id` — The site associated with the interaction.
   * `site_name` — Name of that site.
3. `crm_person`
   * `external_organization_name` — Free-text name of the external organization this person is affiliated with.

### <i class="fa-triangle-exclamation">:triangle-exclamation:</i> Deprecated Columns — Action Required <a href="#id-26.15.0-deprecated-columns" id="id-26.15.0-deprecated-columns"></a>

{% hint style="warning" %}
Temporarily preserved for backward compatibility. The following will be deleted in a future release. Remove all references to them in your queries, reports, and data extraction routines.
{% endhint %}

1. `crm_interaction`
   * `interaction_datetime` — Use `interaction_date` and `interaction_time`, which are now the source of truth.
   * `is_note_private` — Superseded by record sharing.
2. `crm_person`
   * `site_id` — Use `external_organization_name`.
     {% endupdate %}

{% update date="2026-09-01" %}

## 26.14.0

### <i class="fa-trash">:trash:</i> Deleted Tables <a href="#id-26.14.0-deleted-tables" id="id-26.14.0-deleted-tables"></a>

These tables were previously announced as deprecated, and have now been deleted. Any query still referencing them will fail.

* `event_registration_invoice_item` — Use `event_registration_invoice_line`.
* `event_registration_invoice_history` — Use the payment ledger: `payment_ledger_entry` and `payment_ledger_entry_line`.

### <i class="fa-trash">:trash:</i> Deleted Columns <a href="#id-26.14.0-deleted-columns" id="id-26.14.0-deleted-columns"></a>

These columns were previously announced as deprecated, and have now been deleted. Any query still referencing them will fail.

1. `event_registration_invoice`
   * `payment_status_id` — Use `status_slug`.
   * `payment_status_name` — Use `status_slug`.
   * `event_discount_id` — Use `event_registration_invoice_line.event_discount_id`.
   * `response_json` — Use `payment_transaction.provider_response`.
   * `session_id` — Use `payment_transaction.provider_session_id`.
   * `transaction_id` — Use `payment_transaction.provider_transaction_id`.

### <i class="fa-plus">:plus:</i> New Columns <a href="#id-26.14.0-new-columns" id="id-26.14.0-new-columns"></a>

1. `event`
   * `canceled_at` — When the event was canceled. Replaces `cancelled_at`, matching the spelling used by `event_registration`.
   * `canceled_by_user_id` — The user who canceled the event. Replaces `cancelled_by_user_id`.

### <i class="fa-triangle-exclamation">:triangle-exclamation:</i> Deprecated Tables — Action Required <a href="#id-26.14.0-deprecated-tables" id="id-26.14.0-deprecated-tables"></a>

{% hint style="warning" %}
Temporarily preserved for backward compatibility. The following will be deleted in a future release. Remove all references to them in your queries, reports, and data extraction routines.
{% endhint %}

* `list_payment_status` — Superseded by `list_invoice_status`, which carries the invoice lifecycle status the application now writes. Nothing in PEARS references these values any more, so the rows are frozen at their final values.

### <i class="fa-triangle-exclamation">:triangle-exclamation:</i> Deprecated Columns — Action Required <a href="#id-26.14.0-deprecated-columns" id="id-26.14.0-deprecated-columns"></a>

{% hint style="warning" %}
Temporarily preserved for backward compatibility. The following will be deleted in a future release. Remove all references to them in your queries, reports, and data extraction routines.
{% endhint %}

1. `event`
   * `cancelled_at` — Use `canceled_at`.
   * `cancelled_by_user_id` — Use `canceled_by_user_id`.
     {% endupdate %}

{% update date="2026-08-17" %}

## 26.13.0

### <i class="fa-plus">:plus:</i> New Tables <a href="#id-26.13.0-new-tables" id="id-26.13.0-new-tables"></a>

* `event_session_group` — Breakout blocks: sets of concurrent sessions a registrant picks at most one of.

### <i class="fa-plus">:plus:</i> New Columns <a href="#id-26.13.0-new-columns" id="id-26.13.0-new-columns"></a>

1. `event_registration`
   * `owner_user_id` — The registered user. Differs from `created_user_id` when a staff member added the registration on the registrant's behalf.
   * `waitlisted_at` — When this registration joined the waitlist. Kept after it leaves the waitlist so the history survives.
   * `invite_sent_at` — When a registration invite was last sent to this waitlisted registration. Kept after promotion.
2. `event_registration_type`
   * `enable_waitlist` — Whether a waitlist signup is offered once the registration capacity is met.
3. `event_session`
   * `event_session_group_id` — The breakout block this session belongs to, or NULL for a standalone session.
   * `order` — The session's position within its breakout block.
     {% endupdate %}

{% update date="2026-08-13" %}

## 26.12.0

### <i class="fa-plus">:plus:</i> New Columns <a href="#id-26.12.0-new-columns" id="id-26.12.0-new-columns"></a>

1. `crm_person`
   * `linkedin_link` — Link to the person's LinkedIn profile.

### <i class="fa-triangle-exclamation">:triangle-exclamation:</i> Deprecated Columns — Action Required <a href="#id-26.12.0-deprecated-columns" id="id-26.12.0-deprecated-columns"></a>

{% hint style="warning" %}
Temporarily preserved for backward compatibility. The following will be deleted in a future release. Remove all references to them in your queries, reports, and data extraction routines.
{% endhint %}

1. `list_survey_use`
   * `description` — Description of the survey use.
2. `site`
   * `state_abbreviation` — Legacy two-letter USPS state abbreviation, kept as a mirror of `state_code` and populated for US sites only. Migrate to `site.state_code`.
     {% endupdate %}

{% update date="2026-08-11" %}

## 26.11.0

### <i class="fa-plus">:plus:</i> New Tables <a href="#id-26.11.0-new-tables" id="id-26.11.0-new-tables"></a>

* `list_unit_type` — Unit types managed by each organization. Units reference these to classify themselves.
* `payment_note` — A staff-authored note about a payment collected outside the card processor, such as a check number or a grant reference.

### <i class="fa-plus">:plus:</i> New Columns <a href="#id-26.11.0-new-columns" id="id-26.11.0-new-columns"></a>

1. `start_at` and `end_at` on the 34 list tables below — The availability window for an option: when it becomes available for selection, and the point after which it is not. A null value means no restriction at that end. Together they replace `is_active`, which is deprecated below.
   * `list_age`
   * `list_assessment_approach`
   * `list_assessment_method`
   * `list_assessment_type`
   * `list_census_tract`
   * `list_communication_method`
   * `list_crisis`
   * `list_delivery_method`
   * `list_entity_type`
   * `list_ethnicity`
   * `list_form_element_type`
   * `list_gender`
   * `list_geographic_unit`
   * `list_indicator`
   * `list_intervention_channel`
   * `list_intervention_topic`
   * `list_invoice_status`
   * `list_jurisdiction`
   * `list_ledger_entry_type`
   * `list_market_channel`
   * `list_market_reach_source`
   * `list_market_segment`
   * `list_primary_topic`
   * `list_pse_change`
   * `list_question_type`
   * `list_question_widget`
   * `list_race`
   * `list_reach_source`
   * `list_registration_type`
   * `list_relationship_depth`
   * `list_sector_of_influence`
   * `list_setting`
   * `list_survey_module`
   * `list_survey_use`
2. `order` on the 12 list tables below — The option's position in the list as it is presented to users.
   * `list_assessment_type`
   * `list_delivery_method`
   * `list_entity_type`
   * `list_form_element_type`
   * `list_indicator`
   * `list_intervention_channel`
   * `list_intervention_topic`
   * `list_question_type`
   * `list_relationship_depth`
   * `list_setting`
   * `list_survey_module`
   * `list_survey_use`
3. `slug` on the 6 list tables below — A short text key for the option, derived from its name.
   * `list_entity_type`
   * `list_intervention_channel`
   * `list_intervention_topic`
   * `list_relationship_depth`
   * `list_setting`
   * `list_survey_use`
4. `list_unit`
   * `unit_type_id` — The unit type that classifies this unit, from `list_unit_type`.
5. `payment_ledger_entry`
   * `payment_note_id` — The staff note recorded by the admin mark-as-paid flow, when there is one. NULL otherwise.
6. `site`
   * `postal_code` — Postal code for the site, in any country.
   * `country` — ISO 3166-1 alpha-2 country code, such as `US` or `JP`.
   * `state_code` — Full ISO 3166-2 subdivision code for the state, province, or region, such as `US-KS` or `GB-ENG`. Country-agnostic and never truncated.

### <i class="fa-triangle-exclamation">:triangle-exclamation:</i> Deprecated Columns — Action Required <a href="#id-26.11.0-deprecated-columns" id="id-26.11.0-deprecated-columns"></a>

{% hint style="warning" %}
Temporarily preserved for backward compatibility. The following will be deleted in a future release. Remove all references to them in your queries, reports, and data extraction routines.
{% endhint %}

1. `is_active` on the 26 list tables below — No longer maintained by the application. Use each table's `start_at` / `end_at` availability window instead.
   * `list_age`
   * `list_assessment_approach`
   * `list_assessment_method`
   * `list_census_tract`
   * `list_communication_method`
   * `list_crisis`
   * `list_delivery_method`
   * `list_entity_type`
   * `list_ethnicity`
   * `list_form_element_type`
   * `list_gender`
   * `list_geographic_unit`
   * `list_intervention_channel`
   * `list_intervention_topic`
   * `list_jurisdiction`
   * `list_market_channel`
   * `list_market_reach_source`
   * `list_market_segment`
   * `list_primary_topic`
   * `list_question_type`
   * `list_question_widget`
   * `list_race`
   * `list_reach_source`
   * `list_registration_type`
   * `list_sector_of_influence`
   * `list_setting`
2. `site`
   * `zip_code` — Legacy US ZIP code, kept as a mirror of `postal_code` so existing warehouse pulls keep the column. Populated for US sites only and capped at 10 characters. Migrate to `site.postal_code`.
     {% endupdate %}

{% update date="2026-07-16" %}

## 26.10.0

### <i class="fa-plus">:plus:</i> New Tables <a href="#id-26.10.0-new-tables" id="id-26.10.0-new-tables"></a>

* `user_viewable_user` — Which other users' records each user is allowed to view.
* `user_editable_user` — Which other users' records each user is allowed to edit.
* `user_viewable_unit` — Which units' records each user is allowed to view.
* `user_viewable_program_area` — Which program areas' records each user is allowed to view.

### <i class="fa-plus">:plus:</i> New Columns <a href="#id-26.10.0-new-columns" id="id-26.10.0-new-columns"></a>

1. `program_activity_survey`
   * `response_url` — Public URL for submitting responses to this survey. NULL when responses are aggregated, since aggregate-response surveys are not publicly shareable.
2. `user`
   * `external_id` — An identifier for the user carried over from an external system.
     {% endupdate %}

{% update date="2026-07-01" %}

## 26.9.0

### <i class="fa-plus">:plus:</i> New Tables <a href="#id-26.9.0-new-tables" id="id-26.9.0-new-tables"></a>

The payment system was rebuilt around an append-only ledger. An invoice keeps its current state, and every charge, refund, and void is recorded as its own entry.

* `event_registration_invoice_line` — One row per billed item or applied discount on an invoice. Fees are positive lines, and early-bird and promo discounts are their own negative lines.
* `payment_transaction` — One row per provider charge or refund attempt. A refund points at the original charge through `refunded_transaction_id`. Offline cash and check payments make no provider call.
* `payment_ledger_entry` — Append-only record of every money movement against an invoice. The entries for an invoice sum to the amount collected.
* `payment_ledger_entry_line` — The accounting split of a ledger entry, one signed row per invoice line, fee detail, and registration.
* `list_invoice_status` — Lifecycle statuses for an invoice, referenced by `event_registration_invoice.status_slug`.
* `list_payment_transaction_status` — Statuses for a single charge or refund attempt, referenced by `payment_transaction.status_slug`.
* `list_ledger_entry_type` — The accounting movement a ledger entry records, referenced by `payment_ledger_entry.ledger_entry_type_slug`.

### <i class="fa-plus">:plus:</i> New Columns <a href="#id-26.9.0-new-columns" id="id-26.9.0-new-columns"></a>

1. `event_registration_invoice`
   * `status_slug` — Lifecycle status of the invoice, a text foreign key to `list_invoice_status.slug`: `open`, `paid`, `no_charge`, `discarded`, `refunded`, or `voided`.
   * `superseded_by_id` — The invoice that replaced this one, set when an invoice is discarded or superseded in a partial-payment chain.

### <i class="fa-triangle-exclamation">:triangle-exclamation:</i> Deprecated Tables — Action Required <a href="#id-26.9.0-deprecated-tables" id="id-26.9.0-deprecated-tables"></a>

{% hint style="warning" %}
Temporarily preserved for backward compatibility. The following will be deleted in a future release. Remove all references to them in your queries, reports, and data extraction routines.
{% endhint %}

* `event_registration_invoice_item` — Renamed to `event_registration_invoice_line`, which adds a refunded amount and carries early-bird and promo discounts as their own negative lines.
* `event_registration_invoice_history` — Superseded by the payment ledger. Charges, refunds, and voids are now recorded in `payment_ledger_entry`.

### <i class="fa-triangle-exclamation">:triangle-exclamation:</i> Deprecated Columns — Action Required <a href="#id-26.9.0-deprecated-columns" id="id-26.9.0-deprecated-columns"></a>

{% hint style="warning" %}
Temporarily preserved for backward compatibility. The following will be deleted in a future release. Remove all references to them in your queries, reports, and data extraction routines.
{% endhint %}

1. `event_registration_invoice`
   * `payment_status_id` — Use `status_slug`.
   * `payment_status_name` — Use `status_slug`.
   * `event_discount_id` — The promo discount now lives on `event_registration_invoice_line.event_discount_id`.
   * `response_json` — Moved to `payment_transaction.provider_response`.
   * `session_id` — Moved to `payment_transaction.provider_session_id`.
   * `transaction_id` — Moved to `payment_transaction.provider_transaction_id`.
     {% endupdate %}

{% update date="2026-05-31" %}

## 26.7.0

### <i class="fa-plus">:plus:</i> New Columns <a href="#id-26.7.0-new-columns" id="id-26.7.0-new-columns"></a>

1. `user`
   * `last_seen_at` — The user's most recent authenticated activity in PEARS, refreshed at most once every five minutes.
     {% endupdate %}

{% update date="2026-05-21" %}

## 26.6.0

### <i class="fa-plus">:plus:</i> New Columns <a href="#id-26.6.0-new-columns" id="id-26.6.0-new-columns"></a>

1. `event_payment_method`
   * `is_public_use_only` — Whether the payment method is shown only on public registration forms and hidden from Manage Registrations.
2. `list_payment_method`
   * `is_public_use_only` — Whether the payment method is shown only on public registration forms and hidden from Manage Registrations.
     {% endupdate %}

{% update date="2026-05-19" %}

## 26.5.0

### <i class="fa-plus">:plus:</i> New Columns <a href="#id-26.5.0-new-columns" id="id-26.5.0-new-columns"></a>

1. `event`
   * `is_internal` — Whether the event is internal to the organization.
     {% endupdate %}

{% update date="2026-05-12" %}

## 26.4.0

### <i class="fa-trash">:trash:</i> Deleted Columns <a href="#id-26.4.0-deleted-columns" id="id-26.4.0-deleted-columns"></a>

These columns were removed in this release. Any query still referencing them will fail.

1. `event_registration`
   * `name` — The registrant's name is now split across `first_name` and `last_name`.

### <i class="fa-plus">:plus:</i> New Columns <a href="#id-26.4.0-new-columns" id="id-26.4.0-new-columns"></a>

1. `event_registration`
   * `first_name` — First name of the registrant.
   * `last_name` — Last name of the registrant.
     {% endupdate %}

{% update date="2026-05-10" %}

## 26.3.0

### <i class="fa-plus">:plus:</i> New Columns <a href="#id-26.3.0-new-columns" id="id-26.3.0-new-columns"></a>

1. `indirect_activity`
   * `number_of_volunteers` — The number of volunteers involved in the activity.
   * `total_volunteer_hours` — The total volunteer hours contributed to the activity.
     {% endupdate %}

{% update date="2026-04-21" %}

## 26.1.0

### <i class="fa-plus">:plus:</i> New Tables <a href="#id-26.1.0-new-tables" id="id-26.1.0-new-tables"></a>

* `list_program_area_reporting_period` — Maps program areas to reporting periods, recording which program areas were available to users in each reporting period.

### <i class="fa-plus">:plus:</i> New Columns <a href="#id-26.1.0-new-columns" id="id-26.1.0-new-columns"></a>

1. `list_payment_status`
   * `description` — A brief explanation of what the status means, such as "Invoice created, payment not yet attempted".
     {% endupdate %}

{% update date="2026-04-02" %}

## 25.11.0

### <i class="fa-trash">:trash:</i> Deleted Columns <a href="#id-25.11.0-deleted-columns" id="id-25.11.0-deleted-columns"></a>

These columns were removed in this release. Any query still referencing them will fail.

1. `action_plan_id` on the tables below — Each of these modules can now be linked to more than one action plan, so the single foreign key was replaced by a mapping table named after the module. Join through `coalition_action_plan`, `indirect_activity_action_plan`, and so on.
   * `coalition`
   * `indirect_activity`
   * `partnership`
   * `pse`
   * `social_marketing`
   * `success_story`

### <i class="fa-plus">:plus:</i> New Tables <a href="#id-25.11.0-new-tables" id="id-25.11.0-new-tables"></a>

* `coalition_action_plan` — Maps coalitions to action plans. A coalition can be linked to multiple action plans.
* `indirect_activity_action_plan` — Maps indirect activities to the action plans they are linked to.
* `partnership_action_plan` — Maps partnerships to action plans. A partnership can be linked to multiple action plans.
* `pse_action_plan` — Maps PSE site activities to the action plans they are linked to.
* `social_marketing_action_plan` — Maps social marketing campaigns to the action plans they support.
* `success_story_action_plan` — Maps success stories to the action plans they are associated with.
  {% endupdate %}

{% update date="2026-03-20" %}

## 25.9.4

### <i class="fa-plus">:plus:</i> New Tables <a href="#id-25.9.4-new-tables" id="id-25.9.4-new-tables"></a>

* `event_registration_invoice_history` — The history of an event registration invoice. The invoice's current state stays in `event_registration_invoice`.

### <i class="fa-plus">:plus:</i> New Columns <a href="#id-25.9.4-new-columns" id="id-25.9.4-new-columns"></a>

1. `event_registration_invoice`
   * `payment_status_name` — The name of the payment status, denormalized for easier reporting.
     {% endupdate %}

{% update date="2026-03-12" %}

## 25.8.0

### <i class="fa-plus">:plus:</i> New Columns <a href="#id-25.8.0-new-columns" id="id-25.8.0-new-columns"></a>

1. `list_accounting_code`
   * `organization_id` — The organization this accounting code belongs to. The list is now scoped per organization.
2. `list_payment_method`
   * `organization_id` — The organization this payment method belongs to. The list is now scoped per organization.
     {% endupdate %}

{% update date="2026-03-03" %}

## 25.6.13

### <i class="fa-trash">:trash:</i> Deleted Columns <a href="#id-25.6.13-deleted-columns" id="id-25.6.13-deleted-columns"></a>

These columns were removed in this release. Any query still referencing them will fail.

1. `event_fee_detail`
   * `event_registration_invoice_item_id` — The table no longer describes a single invoice line. An invoice line carries its own fee reference and amount on `event_registration_invoice_item`.
   * `amount_before_discount` — Replaced by a single `amount`.
   * `discount_amount` — Replaced by a single `amount`.

### <i class="fa-plus">:plus:</i> New Columns <a href="#id-25.6.13-new-columns" id="id-25.6.13-new-columns"></a>

1. `event_fee_detail`
   * `accounting_code_id` — The accounting code this portion of the fee is allocated to.
   * `amount` — The amount allocated to that accounting code.
     {% endupdate %}

{% update date="2026-02-19" %}

## 25.5.0

### <i class="fa-trash">:trash:</i> Deleted Columns <a href="#id-25.5.0-deleted-columns" id="id-25.5.0-deleted-columns"></a>

These columns were removed in this release. Any query still referencing them will fail.

1. `action_plan_outcome`
   * `is_state_approved` — Removed with the move to explicit multi-state action plans. An outcome that came from another plan now carries `source_action_plan_id`.

### <i class="fa-plus">:plus:</i> New Columns <a href="#id-25.5.0-new-columns" id="id-25.5.0-new-columns"></a>

1. `action_plan`
   * `multi_state_action_plan_id` — The multi-state action plan this plan is linked to, when there is one.
2. `action_plan_outcome`
   * `source_action_plan_id` — The action plan this outcome originated from.
3. `event`
   * `status` — The event's current status.
   * `cancelled_at` — When the event was cancelled.
   * `cancelled_by_user_id` — The user who cancelled it.
   * `cancellation_reason` — The reason given for cancelling it.
4. `event_registration`
   * `status` — Status of the registration: incomplete, complete, or canceled.
   * `canceled_at` — When the registration was canceled.
   * `canceled_by_user_id` — The user who canceled it.
   * `cancellation_reason` — The reason given for canceling it.
     {% endupdate %}

{% update date="2026-02-10" %}

## 25.4.3

### <i class="fa-trash">:trash:</i> Deleted Columns <a href="#id-25.4.3-deleted-columns" id="id-25.4.3-deleted-columns"></a>

These columns were removed in this release. Any query still referencing them will fail.

1. `event_discount`
   * `num_redemptions` — The stored redemption count is no longer maintained. Count the `event_registration_invoice_item` rows carrying the discount's id instead.
     {% endupdate %}

{% update date="2026-01-27" %}

## 25.1.0

### <i class="fa-trash">:trash:</i> Deleted Columns <a href="#id-25.1.0-deleted-columns" id="id-25.1.0-deleted-columns"></a>

These columns were removed in this release. Any query still referencing them will fail.

1. `action_plan_outcome_indicator`
   * `survey_question_id` — Renamed to `survey_survey_question_id`.
2. `action_plan_report_outcome_indicator`
   * `action_plan_outcome_survey_question_id` — Renamed to `survey_survey_question_id`.
3. `contract`
   * `state_served_id` — Renamed to `served_state_id`.
4. `crm_person`
   * `email` — Email addresses moved to their own table. Read `crm_person_email`, which carries one row per address.
5. `crm_person_race`
   * `person_id` — Renamed to `crm_person_id`.
6. `event_registration`
   * `event_form_id` — Use `event_registration_type_id`.

### <i class="fa-plus">:plus:</i> New Tables <a href="#id-25.1.0-new-tables" id="id-25.1.0-new-tables"></a>

* `crm_person_email` — Email addresses associated with a CRM person, one row per address, with the primary address flagged.

### <i class="fa-plus">:plus:</i> New Columns <a href="#id-25.1.0-new-columns" id="id-25.1.0-new-columns"></a>

1. `action_plan_outcome_indicator`
   * `survey_survey_question_id` — Renamed from `survey_question_id`.
2. `action_plan_report_outcome_indicator`
   * `survey_survey_question_id` — Renamed from `action_plan_outcome_survey_question_id`.
3. `contract`
   * `served_state_id` — Renamed from `state_served_id`.
4. `crm_person_race`
   * `crm_person_id` — Renamed from `person_id`.
5. `event_registration`
   * `event_registration_type_id` — The registration type chosen for this registration, replacing the former event form reference.
     {% endupdate %}

{% update date="2026-01-22" %}

## 25.0.2

### <i class="fa-plus">:plus:</i> New Columns <a href="#id-25.0.2-new-columns" id="id-25.0.2-new-columns"></a>

1. `survey_response_survey_question`
   * `response_count` — The number of times this answer was selected or provided. Greater than 1 only for aggregated responses.
     {% endupdate %}

{% update date="2026-01-20" %}

## 25.0.0

### <i class="fa-trash">:trash:</i> Deleted Tables <a href="#id-25.0.0-deleted-tables" id="id-25.0.0-deleted-tables"></a>

These tables were removed in this release. Any query still referencing them will fail.

* `event_fee_event_session_fee` — Removed in the event accounting rework. Session fees are now their own records in `event_session_fee`, tied to registration types through `event_session_fee_event_registration_type`.

### <i class="fa-trash">:trash:</i> Deleted Columns <a href="#id-25.0.0-deleted-columns" id="id-25.0.0-deleted-columns"></a>

These columns were removed in this release. Any query still referencing them will fail.

1. `event_registration_invoice_item`
   * `event_fee_event_session_fee_id` — Use `event_session_fee_id`.
   * `description` — The line's label remains in `name`, and its fee and discount breakdown is now in `event_fee_detail`.

### <i class="fa-plus">:plus:</i> New Tables <a href="#id-25.0.0-new-tables" id="id-25.0.0-new-tables"></a>

* `event_fee_detail` — The accounting breakdown of an invoice line: the fee it came from, the amount before discount, the discount applied, the taxable amount, and the accounting code.
* `event_session_fee` — A fee attached to an individual event session.
* `event_session_fee_event_registration_type` — Links a session fee to the registration types it applies to.

### <i class="fa-plus">:plus:</i> New Columns <a href="#id-25.0.0-new-columns" id="id-25.0.0-new-columns"></a>

1. `event_additional_fee`
   * `not_discountable_amount` — The portion of the fee that discounts cannot be applied to.
2. `event_fee`
   * `not_discountable_amount` — The portion of the fee that discounts cannot be applied to.
3. `event_registration_invoice_item`
   * `event_registration_id` — The registration this invoice line belongs to.
   * `event_session_fee_id` — The session fee this invoice line charges for.
     {% endupdate %}
     {% endupdates %}
