Migrate deprecated API fields to the payments array

The GET /v1/events response for transaction_attempt.* events now includes a payments array. The top-level donation and recurring_plan fields have been deprecated and were removed on May 1, 2026.

What changed and why

Previously, each transaction_attempt.* event had a single donation and recurring_plan at the top level — a 1:1 relationship. A payment can now contain multiple donations and recurring plans in a single transaction. The payments array correctly represents this.

Response before and after

During the transition period, until October 30, 2026, both the old fields and payments[] are present in every response. The old top-level donation and recurring_plan fields reflect only one donation and one recurring plan per event. Since a single transaction can now contain multiple donations and recurring plans, these fields no longer represent the full transaction. After the transition period, they are removed and only payments[] remains.

Before

1{
2  "id": "66911bb67616b5001045cccc",
3  "type": "transaction_attempt.success",
4  "donation": "DXXXXXXX",      // donation
5  "recurring_plan": "RXXXXXXX" // recurring plan
6}

During transition

1{
2  "id": "66911bb67616b5001045cccc",
3  "type": "transaction_attempt.success",
4  "donation": "DXXXXXXX",      // deprecated: donation
5  "recurring_plan": null,      // deprecated: recurring plan
6  "payments": [
7    { "donation": "DXXXXXXX", "recurring_plan": null },       // one-time donation
8    { "donation": "DXXXXXXX", "recurring_plan": "RXXXXXXX" }, // donation with recurring plan
9    { "donation": null,       "recurring_plan": "RXXXXXXX" }  // recurring plan with a future start date
10  ]
11}

After removal

1{
2  "id": "66911bb67616b5001045cccc",
3  "type": "transaction_attempt.success",
4  "payments": [
5    { "donation": "DXXXXXXX", "recurring_plan": null },       // one-time donation
6    { "donation": "DXXXXXXX", "recurring_plan": "RXXXXXXX" }, // donation with recurring plan
7    { "donation": null,       "recurring_plan": "RXXXXXXX" }  // recurring plan with a future start date
8  ]
9}

How to migrate

  1. Find any code that reads event.donation or event.recurring_plan from transaction_attempt.* events.
  2. Replace those reads with a loop over event.payments[].
  3. Expect null values — donation is null for recurring plans with a future start date, and recurring_plan is null for one-time donations.

Still need help?

Need help with something not covered in Support Center? Connect with a support engineer for more assistance.
Email us