[Bug]: UK bank "The Co-Operative Bank Retail" uses duplicate transactionIds #2304

Closed
opened 2026-02-28 20:09:47 -06:00 by GiteaMirror · 1 comment
Owner

Originally created by @stevospinks on GitHub (Jul 23, 2025).

Verified issue does not already exist?

  • I have searched and found no existing issue

What happened?

When syncing data for the UK bank "The Co-Operative Bank Retail" via GoCardless it sometimes returns transactionIds that have been used before.

For my account the transactionId field seems to be an incrementing number from 5210479624, but occasionally numbers like 9998 are used.

After looking through the repo for a solution it looks like Actual uses the internalTransactionId when a transactionId doesn't exist (PR: https://github.com/actualbudget/actual/pull/4241) - it seems to me that using the internalTransactionId would be the required solution for this bank, but as far as I can tell there isn't user facing option to manually use that field.

Here is the data that I get back from GoCardless, with only the important transactions left in. I've redacted the payees but have given the same redacted names to payees that matched:

{
    "status": "ok",
    "data": {
        "institutionId": "COOPERATIVE_RETAIL_CPBKGB22",
        "transactions": {
            "booked": [
                {
                    "transactionId": "9998",
                    "entryReference": "REDACTED OUTGOING 1",
                    "bookingDate": "2025-07-22",
                    "bookingDateTime": "2025-07-22T00:00:00.000Z",
                    "transactionAmount": {
                        "amount": "-69.00",
                        "currency": "GBP"
                    },
                    "additionalInformation": "REDACTED OUTGOING 1",
                    "internalTransactionId": "9f8da74f4de1178831bef1f8bcc6e223",
                    "payeeName": "REDACTED OUTGOING 1",
                    "date": "2025-07-22"
                },
                {
                    "transactionId": "9997",
                    "entryReference": "REDACTED OUTGOING 2",
                    "bookingDate": "2025-07-22",
                    "bookingDateTime": "2025-07-22T00:00:00.000Z",
                    "transactionAmount": {
                        "amount": "-30.96",
                        "currency": "GBP"
                    },
                    "additionalInformation": "REDACTED OUTGOING 2",
                    "internalTransactionId": "5ca818d05de2d5e305be9e735bf33d1a",
                    "payeeName": "REDACTED OUTGOING 2",
                    "date": "2025-07-22"
                },
                {
                    "transactionId": "9991",
                    "entryReference": "REDACTED INCOMING 1",
                    "bookingDate": "2025-07-21",
                    "bookingDateTime": "2025-07-21T00:00:00.000Z",
                    "transactionAmount": {
                        "amount": "104.20",
                        "currency": "GBP"
                    },
                    "additionalInformation": "REDACTED INCOMING 1",
                    "internalTransactionId": "32fe73a72fc9ffa69d3119e3706ca3c3",
                    "payeeName": "REDACTED INCOMING 1",
                    "date": "2025-07-21"
                },
                {
                    "transactionId": "5329990152",
                    "entryReference": "REDACTED OUTGOING 3",
                    "bookingDate": "2025-07-21",
                    "bookingDateTime": "2025-07-21T00:00:00.000Z",
                    "transactionAmount": {
                        "amount": "-51.00",
                        "currency": "GBP"
                    },
                    "additionalInformation": "REDACTED OUTGOING 3",
                    "internalTransactionId": "e936e2308e922b511f39e78b182a3a47",
                    "payeeName": "REDACTED OUTGOING 3",
                    "date": "2025-07-21"
                },
                // ...
                // A couple more 53299901xx
                // ...
                {
                    "transactionId": "9998",
                    "entryReference": "REDACTED OUTGOING 4",
                    "bookingDate": "2025-07-18",
                    "bookingDateTime": "2025-07-18T00:00:00.000Z",
                    "transactionAmount": {
                        "amount": "-4.20",
                        "currency": "GBP"
                    },
                    "additionalInformation": "REDACTED OUTGOING 4",
                    "internalTransactionId": "792904b2b6b7307733f636aacf59545f",
                    "payeeName": "REDACTED OUTGOING 4",
                    "date": "2025-07-18"
                },
                {
                    "transactionId": "9997",
                    "entryReference": "REDACTED OUTGOING 2", // Same merchant as previously
                    "bookingDate": "2025-07-18",
                    "bookingDateTime": "2025-07-18T00:00:00.000Z",
                    "transactionAmount": {
                        "amount": "-2.31",
                        "currency": "GBP"
                    },
                    "additionalInformation": "REDACTED OUTGOING 2", // Same merchant as previously
                    "internalTransactionId": "07fde91f5257bb442ea970f78bca6101",
                    "payeeName": "REDACTED OUTGOING 2", // Same merchant as previously
                    "date": "2025-07-18"
                },
                // ...
                // 9996 through 9992
                // ...
                {
                    "transactionId": "9991",
                    "entryReference": "REDACTED OUTGOING 5",
                    "bookingDate": "2025-07-16",
                    "bookingDateTime": "2025-07-16T00:00:00.000Z",
                    "transactionAmount": {
                        "amount": "-8.95",
                        "currency": "GBP"
                    },
                    "additionalInformation": "REDACTED OUTGOING 5",
                    "internalTransactionId": "20254233c060ff6dc96794dc50539d77",
                    "payeeName": "REDACTED OUTGOING 5",
                    "date": "2025-07-16"
                },
                // ...
                // 9990 through 9983
                // ...
                {
                    "transactionId": "5320855053",
                    "entryReference": "REDACTED OUTGOING 2", // Same merchant as previously
                    "bookingDate": "2025-07-14",
                    "bookingDateTime": "2025-07-14T00:00:00.000Z",
                    "transactionAmount": {
                        "amount": "-7.55",
                        "currency": "GBP"
                    },
                    "additionalInformation": "REDACTED OUTGOING 2", // Same merchant as previously
                    "internalTransactionId": "504092522128fcdaa0c2cdc1a7303d24",
                    "payeeName": "REDACTED OUTGOING 2", // Same merchant as previously
                    "date": "2025-07-14"
                }
                // ...
                // Remainder are 5xxxxxxxxx
                // ...
            ],
            "pending": [ /*...*/ ],
            "all": [ /*...*/ ]
        }
    }
}

How can we reproduce the issue?

  • Connect an account for the UK bank "The Co-Operative Bank Retail" via GoCardless
  • Run the bank sync
  • Make some more transactions IRL
  • Run the bank sync again

Where are you hosting Actual?

Docker

What browsers are you seeing the problem on?

Chrome

Operating System

Mac OSX

Originally created by @stevospinks on GitHub (Jul 23, 2025). ### Verified issue does not already exist? - [x] I have searched and found no existing issue ### What happened? When syncing data for the UK bank "The Co-Operative Bank Retail" via GoCardless it sometimes returns `transactionId`s that have been used before. For my account the `transactionId` field seems to be an incrementing number from `5210479624`, but occasionally numbers like `9998` are used. After looking through the repo for a solution it looks like Actual uses the `internalTransactionId` when a `transactionId` doesn't exist (PR: https://github.com/actualbudget/actual/pull/4241) - it seems to me that using the `internalTransactionId` would be the required solution for this bank, but as far as I can tell there isn't user facing option to manually use that field. Here is the data that I get back from GoCardless, with only the important transactions left in. I've redacted the payees but have given the same redacted names to payees that matched: ```jsonc { "status": "ok", "data": { "institutionId": "COOPERATIVE_RETAIL_CPBKGB22", "transactions": { "booked": [ { "transactionId": "9998", "entryReference": "REDACTED OUTGOING 1", "bookingDate": "2025-07-22", "bookingDateTime": "2025-07-22T00:00:00.000Z", "transactionAmount": { "amount": "-69.00", "currency": "GBP" }, "additionalInformation": "REDACTED OUTGOING 1", "internalTransactionId": "9f8da74f4de1178831bef1f8bcc6e223", "payeeName": "REDACTED OUTGOING 1", "date": "2025-07-22" }, { "transactionId": "9997", "entryReference": "REDACTED OUTGOING 2", "bookingDate": "2025-07-22", "bookingDateTime": "2025-07-22T00:00:00.000Z", "transactionAmount": { "amount": "-30.96", "currency": "GBP" }, "additionalInformation": "REDACTED OUTGOING 2", "internalTransactionId": "5ca818d05de2d5e305be9e735bf33d1a", "payeeName": "REDACTED OUTGOING 2", "date": "2025-07-22" }, { "transactionId": "9991", "entryReference": "REDACTED INCOMING 1", "bookingDate": "2025-07-21", "bookingDateTime": "2025-07-21T00:00:00.000Z", "transactionAmount": { "amount": "104.20", "currency": "GBP" }, "additionalInformation": "REDACTED INCOMING 1", "internalTransactionId": "32fe73a72fc9ffa69d3119e3706ca3c3", "payeeName": "REDACTED INCOMING 1", "date": "2025-07-21" }, { "transactionId": "5329990152", "entryReference": "REDACTED OUTGOING 3", "bookingDate": "2025-07-21", "bookingDateTime": "2025-07-21T00:00:00.000Z", "transactionAmount": { "amount": "-51.00", "currency": "GBP" }, "additionalInformation": "REDACTED OUTGOING 3", "internalTransactionId": "e936e2308e922b511f39e78b182a3a47", "payeeName": "REDACTED OUTGOING 3", "date": "2025-07-21" }, // ... // A couple more 53299901xx // ... { "transactionId": "9998", "entryReference": "REDACTED OUTGOING 4", "bookingDate": "2025-07-18", "bookingDateTime": "2025-07-18T00:00:00.000Z", "transactionAmount": { "amount": "-4.20", "currency": "GBP" }, "additionalInformation": "REDACTED OUTGOING 4", "internalTransactionId": "792904b2b6b7307733f636aacf59545f", "payeeName": "REDACTED OUTGOING 4", "date": "2025-07-18" }, { "transactionId": "9997", "entryReference": "REDACTED OUTGOING 2", // Same merchant as previously "bookingDate": "2025-07-18", "bookingDateTime": "2025-07-18T00:00:00.000Z", "transactionAmount": { "amount": "-2.31", "currency": "GBP" }, "additionalInformation": "REDACTED OUTGOING 2", // Same merchant as previously "internalTransactionId": "07fde91f5257bb442ea970f78bca6101", "payeeName": "REDACTED OUTGOING 2", // Same merchant as previously "date": "2025-07-18" }, // ... // 9996 through 9992 // ... { "transactionId": "9991", "entryReference": "REDACTED OUTGOING 5", "bookingDate": "2025-07-16", "bookingDateTime": "2025-07-16T00:00:00.000Z", "transactionAmount": { "amount": "-8.95", "currency": "GBP" }, "additionalInformation": "REDACTED OUTGOING 5", "internalTransactionId": "20254233c060ff6dc96794dc50539d77", "payeeName": "REDACTED OUTGOING 5", "date": "2025-07-16" }, // ... // 9990 through 9983 // ... { "transactionId": "5320855053", "entryReference": "REDACTED OUTGOING 2", // Same merchant as previously "bookingDate": "2025-07-14", "bookingDateTime": "2025-07-14T00:00:00.000Z", "transactionAmount": { "amount": "-7.55", "currency": "GBP" }, "additionalInformation": "REDACTED OUTGOING 2", // Same merchant as previously "internalTransactionId": "504092522128fcdaa0c2cdc1a7303d24", "payeeName": "REDACTED OUTGOING 2", // Same merchant as previously "date": "2025-07-14" } // ... // Remainder are 5xxxxxxxxx // ... ], "pending": [ /*...*/ ], "all": [ /*...*/ ] } } } ``` ### How can we reproduce the issue? - Connect an account for the UK bank "The Co-Operative Bank Retail" via GoCardless - Run the bank sync - Make some more transactions IRL - Run the bank sync again ### Where are you hosting Actual? Docker ### What browsers are you seeing the problem on? Chrome ### Operating System Mac OSX
GiteaMirror added the bug label 2026-02-28 20:09:47 -06:00
Author
Owner

@matt-fidd commented on GitHub (Jul 23, 2025):

Duplicate of https://github.com/actualbudget/actual/issues/2495

internalTransactionId is hard to implement at the moment as it is not generated for pending transactions, only booked ones.

If you reach out in Discord there might be someone who can help you out with a workaround in your specific case but we do not offer bank sync support over Github issues.

@matt-fidd commented on GitHub (Jul 23, 2025): Duplicate of https://github.com/actualbudget/actual/issues/2495 internalTransactionId is hard to implement at the moment as it is not generated for pending transactions, only booked ones. If you reach out in Discord there might be someone who can help you out with a workaround in your specific case but we do not offer bank sync support over Github issues.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/actual#2304