[GH-ISSUE #7678] CSV import preview shows false updates when raw payee is not title-cased #72899

Closed
opened 2026-05-16 13:49:13 -05:00 by GiteaMirror · 2 comments
Owner

Originally created by @tekumara on GitHub (May 2, 2026).
Original GitHub issue: https://github.com/actualbudget/actual/issues/7678

This was generated by AI during triage.

Summary

CSV import preview can show a matched transaction as “updated” even when there is no meaningful change to import. In the observed case, the existing raw imported payee contains text that is not title-cased, and the preview appears to compare it against a normalized/title-cased version generated during import.

Example

Existing transaction:

{
  "date": "2025-10-20",
  "amount": -2500,
  "payee_name": "Example Payee",
  "imported_payee": "Example Payee 00000000P-22267650",
  "notes": null,
  "cleared": true
}

CSV row:

Date,Payee,Debit,Credit
20/10/2025,Example Payee 00000000P-22267650,25.00,

The UI preview shows the matched transaction as an update, even though the existing transaction already has the same raw imported payee.

Suspected cause

The UI appears to send roughly:

{
  "date": "2025-10-20",
  "amount": -2500,
  "payee_name": "Example Payee 00000000P-22267650"
}

Because imported_payee is omitted, the backend derives it from normalized payee_name, for example:

- Example Payee 00000000P-22267650
+ Example Payee 00000000p-22267650

That case-only difference makes reconciliation think the matched transaction would be updated.

Expected behavior

The preview should not show an update when the only difference is casing introduced during import normalization.

This avoids noisy/false preview updates.

Suggested fix

Likely area:

packages/desktop-client/src/components/modals/ImportTransactionsModal/ImportTransactionsModal.tsx

When constructing CSV preview/final import transactions, set imported_payee from the raw mapped payee value.

Version

Observed in Actual 26.4.0.

Originally created by @tekumara on GitHub (May 2, 2026). Original GitHub issue: https://github.com/actualbudget/actual/issues/7678 > *This was generated by AI during triage.* ## Summary CSV import preview can show a matched transaction as “updated” even when there is no meaningful change to import. In the observed case, the existing raw imported payee contains text that is not [title-cased](https://github.com/actualbudget/actual/blob/v26.4.0/packages/loot-core/src/server/accounts/title/index.ts#L32-L60), and the preview appears to compare it against a normalized/title-cased version generated during import. ## Example Existing transaction: ```json { "date": "2025-10-20", "amount": -2500, "payee_name": "Example Payee", "imported_payee": "Example Payee 00000000P-22267650", "notes": null, "cleared": true } ``` CSV row: ```csv Date,Payee,Debit,Credit 20/10/2025,Example Payee 00000000P-22267650,25.00, ``` The UI preview shows the matched transaction as an update, even though the existing transaction already has the same raw imported payee. ## Suspected cause The UI appears to send roughly: ```json { "date": "2025-10-20", "amount": -2500, "payee_name": "Example Payee 00000000P-22267650" } ``` Because `imported_payee` is omitted, the backend derives it from normalized `payee_name`, for example: ```diff - Example Payee 00000000P-22267650 + Example Payee 00000000p-22267650 ``` That case-only difference makes reconciliation think the matched transaction would be updated. ## Expected behavior The preview should not show an update when the only difference is casing introduced during import normalization. This avoids noisy/false preview updates. ## Suggested fix Likely area: ```text packages/desktop-client/src/components/modals/ImportTransactionsModal/ImportTransactionsModal.tsx ``` When constructing CSV preview/final import transactions, set `imported_payee` from the raw mapped payee value. ## Version Observed in Actual `26.4.0`.
Author
Owner

@tekumara commented on GitHub (May 2, 2026):

I think this behaviour is expected. If a imported_payee is provided during import it will be used raw. If not, the payee_name will be normalised/title-cased (which is what the UI import does).

<!-- gh-comment-id:4363623032 --> @tekumara commented on GitHub (May 2, 2026): I think this behaviour is expected. If a `imported_payee` is provided during import it will be used raw. If not, the `payee_name` will be [normalised/title-cased](https://github.com/actualbudget/actual/blob/v26.4.0/packages/loot-core/src/server/accounts/title/index.ts#L32-L60) (which is what the UI import does).
Author
Owner

@tekumara commented on GitHub (May 2, 2026):

However, it would be good if this normalisation behaviour was documented.

<!-- gh-comment-id:4363627764 --> @tekumara commented on GitHub (May 2, 2026): However, it would be good if this normalisation behaviour was documented.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/actual#72899