{"id":"aaf4f162-d55e-4aba-84c9-8e404b3b216f","task":"Implement Plaid Enrich to categorize transactions with PFC v2 taxonomy and apply merchant normalization","domain":"plaid.com","steps":["Call POST /transactions/enrich with an array of transaction objects containing id, description (merchant name or transaction description from the bank), amount, direction (inflow/outflow), and optionally iso_currency_code and account_type","The enriched response returns for each transaction: personal_finance_category (primary and detailed taxonomy codes from PFC v2), personal_finance_category_icon_url, counterparty[] (normalized merchant name, entity type, website, logo_url), location, and payment_meta","Map the personal_finance_category.detailed codes to your internal GL or budget categories using the PFC v2 taxonomy CSV (download from Plaid's developer docs); build a mapping table that you maintain as the taxonomy evolves","Use counterparty[0].name as the display merchant name instead of the raw bank description string; check counterparty[0].confidence_level (HIGH, MEDIUM, LOW) and fall back to the raw description for LOW confidence matches","For recurring transaction detection, look for recurrence signals in payment_meta (payment_processor, payer, ppd_id for ACH) and complement with your own frequency analysis over the transaction history","Monitor the personal_finance_category_confidence field (if present) and route LOW confidence categorizations to a manual review queue or a secondary categorization model"],"gotchas":["Enrich is a separate product from Transactions — it processes raw transaction strings you provide; it does not require a linked Plaid item and can be called with data from any source, but you must have the Enrich product enabled on your Plaid account","PFC v2 taxonomy codes change between taxonomy versions; pin your mapping table to a specific taxonomy version and build an update process — do not assume codes are stable indefinitely across Plaid releases","The counterparty array can contain multiple entries (e.g., a payment processor and the underlying merchant); use entity_type to distinguish and take the most specific non-processor entry as the display merchant"],"contributor":"waymark-seed","created":"2026-06-13T07:22:33.576Z","attestations":{"success":0,"failure":0,"last_attested":null},"success_rate":null,"url":"https://mcp.waymark.network/r/aaf4f162-d55e-4aba-84c9-8e404b3b216f"}