Transactions
A transaction record represents a single financial event on a user’s connected bank account. Transaction data is fetched from Plaid by the mining pipeline, converted into FloatMe’s internal format by the refiner Lambda, and stored in DynamoDB.
Transactions are identified by a Plaid-assigned transaction_id (txn_id) that is stable across updates. Amounts are stored in cents.
See Plaid Mining Pipeline for how transactions are fetched, refined, and stored.
Storage
Table: prod-txn-transactions
Region: us-east-2
Keys
| Key | Value |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The [REMOVED#] prefix on GSI sort keys is how soft-deletes work — see Removal below.
|
Attributes
| Attribute | Description |
|---|---|
|
Always |
|
FloatMe user identifier |
|
Plaid account identifier for the account this transaction belongs to |
|
Plaid-assigned transaction identifier. Stable across updates. |
|
Owner of the account (used for joint accounts) |
|
For a posted transaction, the |
|
|
|
|
|
Channel through which the payment was made: |
|
Additional payment metadata (reference number, PPD ID, payee, payer, etc.) |
|
Transaction name as reported by the financial institution |
|
Raw description string from the financial institution before any enrichment |
|
Cleaned merchant name from Plaid’s enrichment |
|
Geographic location of the transaction (address, city, region, lat/long) |
|
RFC 3339 date ( |
|
RFC 3339 date ( |
|
Plaid legacy category identifier |
|
Plaid legacy category hierarchy array (e.g., |
|
ISO 4217 currency code (e.g., |
|
Unofficial currency code for non-ISO currencies |
|
Transaction amount in cents. Positive = money leaving the account (debit/purchase). Negative = money entering the account (deposit/refund). |
|
String representation of the amount (e.g., |
|
Plaid transaction code classifying the type of transaction (e.g., |
|
Plaid’s newer personal finance category object with |
|
URL of the merchant’s logo image from Plaid’s enrichment |
|
Merchant website URL from Plaid’s enrichment |
Query Patterns
| Query | Index | Conditions |
|---|---|---|
Get a specific transaction by ID |
Primary |
|
List transactions for a user (sorted by date, newest first) |
GSI1 |
|
List transactions for a user filtered by category |
GSI2 |
|
List transactions for a user filtered by account |
GSI3 |
|
List transactions for a user filtered by account and category |
GSI4 |
|
Removal
When Plaid signals that transactions have been removed (via a TRANSACTIONS_REMOVED webhook), FloatMe soft-deletes them rather than physically removing the DynamoDB records. This preserves the audit trail while excluding the records from all list queries.
Soft-delete works by prepending REMOVED# to all four GSI sort keys:
Before removal: DATE#2024-03-15#TXN#abc123 After removal: REMOVED#DATE#2024-03-15#TXN#abc123
All list queries use begins_with DATE# as the sort key condition, which naturally excludes any record whose SK starts with REMOVED#. The primary key is unchanged, so point lookups by txn_id still return the record (with txn_removed = true).
Related Pages
-
Plaid Mining Pipeline — How transactions are fetched, refined, and stored
-
Accounts & Balances — Account records stored in the same table
-
Event-Driven Flows — How transaction writes trigger the feeder and flow to Kinesis
-
Architecture —
prod-txn-transactionstable overview