[{"data":1,"prerenderedAt":644},["ShallowReactive",2],{"\u002Fblog\u002Fpain002-reading-payment-status-reports-from-your-bank":3},{"id":4,"title":5,"body":6,"description":635,"extension":636,"lastUpdatedAt":637,"meta":638,"navigation":639,"path":640,"publishedAt":637,"seo":641,"stem":642,"__hash__":643},"blog\u002Fblog\u002F0065.pain002-reading-payment-status-reports-from-your-bank.md","pain.002: reading payment status reports from your bank",{"type":7,"value":8,"toc":625},"minimark",[9,19,22,27,34,41,45,48,58,69,73,112,126,205,210,214,220,286,302,306,321,496,513,517,524,533,536,540,543,574,580,584,593,603,609,614,621],[10,11,12,13,18],"p",{},"After you submit a ",[14,15,17],"a",{"href":16},"\u002Fblog\u002Fpain001-deep-dive-building-a-swiss-credit-transfer-file","pain.001 payment file"," to your bank, the bank does not just process it silently. It sends back a pain.002 message — the Customer Payment Status Report. This message tells you whether your file was accepted, whether individual transactions were rejected, and why.",[10,20,21],{},"Most ERP and treasury systems handle this automatically, but when something goes wrong — a file is rejected, a payment does not land, or reconciliation does not balance — you often need to read the pain.002 directly to understand what happened. This post explains the structure and the most important codes.",[23,24,26],"h2",{"id":25},"what-pain002-is","What pain.002 is",[10,28,29,33],{},[30,31,32],"code",{},"pain.002.001.10"," (or pain.002 for short) is the ISO 20022 message type for Customer Payment Status Report. Swiss banks return it after processing a payment initiation file (pain.001). A single pain.002 can report on the entire file, on individual payment batches within the file, or on individual transactions — sometimes all three levels in the same document.",[10,35,36,37,40],{},"The pain.002 is not a payment confirmation. It is a processing status update. A status of ",[30,38,39],{},"ACSC"," (Accepted Settlement Completed) does not mean the money is in the recipient's account — it means your bank has processed the transaction and sent it into the clearing system. The final confirmation comes from the account statement (camt.054 or camt.053).",[23,42,44],{"id":43},"the-three-level-structure","The three-level structure",[10,46,47],{},"Pain.002 mirrors the three-level hierarchy of pain.001:",[49,50,55],"pre",{"className":51,"code":53,"language":54},[52],"language-text","GrpHdr (Group Header)\n  └─ OrgnlGrpInfAndSts (Original Group Information and Status)\n       └─ TxInfAndSts (Transaction Information and Status) — one per transaction\n","text",[30,56,53],{"__ignoreMap":57},"",[10,59,60,61,64,65,68],{},"Not every pain.002 uses all three levels. A file-level rejection (for example, if the file failed schema validation) will have a status only in ",[30,62,63],{},"OrgnlGrpInfAndSts",". A transaction-level rejection (for example, an invalid IBAN on one payment) will have a status in ",[30,66,67],{},"TxInfAndSts"," for that transaction.",[23,70,72],{"id":71},"group-level-status","Group-level status",[49,74,78],{"className":75,"code":76,"language":77,"meta":57,"style":57},"language-xml shiki shiki-themes github-light github-dark","\u003COrgnlGrpInfAndSts>\n  \u003COrgnlMsgId>PAYMENT-2024-001\u003C\u002FOrgnlMsgId>\n  \u003COrgnlMsgNmId>pain.001.001.09\u003C\u002FOrgnlMsgNmId>\n  \u003CGrpSts>ACTC\u003C\u002FGrpSts>\n\u003C\u002FOrgnlGrpInfAndSts>\n","xml",[30,79,80,88,94,100,106],{"__ignoreMap":57},[81,82,85],"span",{"class":83,"line":84},"line",1,[81,86,87],{},"\u003COrgnlGrpInfAndSts>\n",[81,89,91],{"class":83,"line":90},2,[81,92,93],{},"  \u003COrgnlMsgId>PAYMENT-2024-001\u003C\u002FOrgnlMsgId>\n",[81,95,97],{"class":83,"line":96},3,[81,98,99],{},"  \u003COrgnlMsgNmId>pain.001.001.09\u003C\u002FOrgnlMsgNmId>\n",[81,101,103],{"class":83,"line":102},4,[81,104,105],{},"  \u003CGrpSts>ACTC\u003C\u002FGrpSts>\n",[81,107,109],{"class":83,"line":108},5,[81,110,111],{},"\u003C\u002FOrgnlGrpInfAndSts>\n",[10,113,114,117,118,121,122,125],{},[30,115,116],{},"OrgnlMsgId"," matches the ",[30,119,120],{},"MsgId"," from your pain.001 file. This is how you link the status report back to the payment file you submitted. The ",[30,123,124],{},"GrpSts"," code tells you the overall result:",[127,128,129,142],"table",{},[130,131,132],"thead",{},[133,134,135,139],"tr",{},[136,137,138],"th",{},"Code",[136,140,141],{},"Meaning",[143,144,145,156,166,175,185,195],"tbody",{},[133,146,147,153],{},[148,149,150],"td",{},[30,151,152],{},"ACTC",[148,154,155],{},"Accepted — technical validation passed, processing is underway",[133,157,158,163],{},[148,159,160],{},[30,161,162],{},"ACCP",[148,164,165],{},"Accepted — customer profile validation passed",[133,167,168,172],{},[148,169,170],{},[30,171,39],{},[148,173,174],{},"Accepted Settlement Completed — all transactions processed",[133,176,177,182],{},[148,178,179],{},[30,180,181],{},"ACWC",[148,183,184],{},"Accepted With Change — accepted but with modifications (rare)",[133,186,187,192],{},[148,188,189],{},[30,190,191],{},"RJCT",[148,193,194],{},"Rejected — the entire file was rejected",[133,196,197,202],{},[148,198,199],{},[30,200,201],{},"PART",[148,203,204],{},"Partially accepted — some transactions accepted, some rejected",[10,206,207,209],{},[30,208,201],{}," is the most operationally important status because it means you need to find out which transactions failed and resubmit only those, while the accepted ones are already in the clearing system (do not resubmit them).",[23,211,213],{"id":212},"transaction-level-status","Transaction-level status",[10,215,216,217,219],{},"For each rejected transaction, the ",[30,218,67],{}," block identifies it and explains why:",[49,221,223],{"className":75,"code":222,"language":77,"meta":57,"style":57},"\u003CTxInfAndSts>\n  \u003COrgnlEndToEndId>INV-2024-0047\u003C\u002FOrgnlEndToEndId>\n  \u003COrgnlInstrId>PMT-001\u003C\u002FOrgnlInstrId>\n  \u003CTxSts>RJCT\u003C\u002FTxSts>\n  \u003CStsRsnInf>\n    \u003CRsn>\n      \u003CCd>AC01\u003C\u002FCd>\n    \u003C\u002FRsn>\n    \u003CAddtlInf>Account number does not exist\u003C\u002FAddtlInf>\n  \u003C\u002FStsRsnInf>\n\u003C\u002FTxInfAndSts>\n",[30,224,225,230,235,240,245,250,256,262,268,274,280],{"__ignoreMap":57},[81,226,227],{"class":83,"line":84},[81,228,229],{},"\u003CTxInfAndSts>\n",[81,231,232],{"class":83,"line":90},[81,233,234],{},"  \u003COrgnlEndToEndId>INV-2024-0047\u003C\u002FOrgnlEndToEndId>\n",[81,236,237],{"class":83,"line":96},[81,238,239],{},"  \u003COrgnlInstrId>PMT-001\u003C\u002FOrgnlInstrId>\n",[81,241,242],{"class":83,"line":102},[81,243,244],{},"  \u003CTxSts>RJCT\u003C\u002FTxSts>\n",[81,246,247],{"class":83,"line":108},[81,248,249],{},"  \u003CStsRsnInf>\n",[81,251,253],{"class":83,"line":252},6,[81,254,255],{},"    \u003CRsn>\n",[81,257,259],{"class":83,"line":258},7,[81,260,261],{},"      \u003CCd>AC01\u003C\u002FCd>\n",[81,263,265],{"class":83,"line":264},8,[81,266,267],{},"    \u003C\u002FRsn>\n",[81,269,271],{"class":83,"line":270},9,[81,272,273],{},"    \u003CAddtlInf>Account number does not exist\u003C\u002FAddtlInf>\n",[81,275,277],{"class":83,"line":276},10,[81,278,279],{},"  \u003C\u002FStsRsnInf>\n",[81,281,283],{"class":83,"line":282},11,[81,284,285],{},"\u003C\u002FTxInfAndSts>\n",[10,287,288,117,291,294,295,117,298,301],{},[30,289,290],{},"OrgnlEndToEndId",[30,292,293],{},"EndToEndId"," from your pain.001. If you used the supplier's invoice number as the end-to-end ID (as recommended), you can immediately see which invoice payment failed. ",[30,296,297],{},"OrgnlInstrId",[30,299,300],{},"InstrId",".",[23,303,305],{"id":304},"rejection-reason-codes","Rejection reason codes",[10,307,308,309,312,313,316,317,320],{},"The ",[30,310,311],{},"Cd"," element in ",[30,314,315],{},"StsRsnInf\u002FRsn"," carries a code from the ISO 20022 ",[30,318,319],{},"ExternalStatusReason1Code"," list. The most common ones in Swiss processing:",[127,322,323,335],{},[130,324,325],{},[133,326,327,329,332],{},[136,328,138],{},[136,330,331],{},"Reason",[136,333,334],{},"Typical cause",[143,336,337,350,363,376,389,402,418,431,444,457,470,483],{},[133,338,339,344,347],{},[148,340,341],{},[30,342,343],{},"AC01",[148,345,346],{},"Incorrect account number",[148,348,349],{},"IBAN check digit failed or account closed",[133,351,352,357,360],{},[148,353,354],{},[30,355,356],{},"AC04",[148,358,359],{},"Closed account number",[148,361,362],{},"The account exists but is closed",[133,364,365,370,373],{},[148,366,367],{},[30,368,369],{},"AC06",[148,371,372],{},"Blocked account",[148,374,375],{},"Account is frozen or has restrictions",[133,377,378,383,386],{},[148,379,380],{},[30,381,382],{},"AG01",[148,384,385],{},"Transaction forbidden",[148,387,388],{},"Payment type not allowed for this account",[133,390,391,396,399],{},[148,392,393],{},[30,394,395],{},"AM04",[148,397,398],{},"Insufficient funds",[148,400,401],{},"Debit account does not have enough balance",[133,403,404,409,412],{},[148,405,406],{},[30,407,408],{},"AM05",[148,410,411],{},"Duplicate payment",[148,413,414,415,417],{},"Same ",[30,416,293],{}," already processed",[133,419,420,425,428],{},[148,421,422],{},[30,423,424],{},"BE01",[148,426,427],{},"Inconsistent with end customer",[148,429,430],{},"Creditor details do not match bank records",[133,432,433,438,441],{},[148,434,435],{},[30,436,437],{},"DT01",[148,439,440],{},"Invalid date",[148,442,443],{},"Execution date in the past or a non-banking day",[133,445,446,451,454],{},[148,447,448],{},[30,449,450],{},"FF01",[148,452,453],{},"Invalid file format",[148,455,456],{},"Structural error in the pain.001 file",[133,458,459,464,467],{},[148,460,461],{},[30,462,463],{},"MS02",[148,465,466],{},"Reason not specified",[148,468,469],{},"Bank rejects but does not give a specific code",[133,471,472,477,480],{},[148,473,474],{},[30,475,476],{},"RC01",[148,478,479],{},"Bank identifier incorrect",[148,481,482],{},"Invalid BIC or clearing number",[133,484,485,490,493],{},[148,486,487],{},[30,488,489],{},"RR01",[148,491,492],{},"Missing debtor information",[148,494,495],{},"Required fields in the debtor block are empty",[10,497,498,500,501,503,504,506,507,509,510,512],{},[30,499,343],{}," and ",[30,502,408],{}," are the most common in practice. ",[30,505,343],{}," usually means the IBAN you have on file for the supplier is wrong or outdated — the bank's validation caught a check digit error, or the account no longer exists. ",[30,508,408],{}," (duplicate) triggers when you submit the same ",[30,511,293],{}," twice — which can happen if a file is resubmitted after a connectivity issue and both attempts reached the bank.",[23,514,516],{"id":515},"pending-status","Pending status",[10,518,519,520,523],{},"Not all pain.002 messages are final. A bank may send an intermediate status of ",[30,521,522],{},"PDNG"," (pending) for transactions that have been received but not yet processed — for example, a payment scheduled for a future date. You will receive a subsequent pain.002 with a final status when the payment is actually executed or rejected.",[49,525,527],{"className":75,"code":526,"language":77,"meta":57,"style":57},"\u003CTxSts>PDNG\u003C\u002FTxSts>\n",[30,528,529],{"__ignoreMap":57},[81,530,531],{"class":83,"line":84},[81,532,526],{},[10,534,535],{},"Systems that process pain.002 automatically need to handle this case: a pending status means keep waiting, not that the payment is done.",[23,537,539],{"id":538},"matching-pain002-back-to-your-records","Matching pain.002 back to your records",[10,541,542],{},"The matching logic in your system should work as follows:",[544,545,546,553,562,565,571],"ol",{},[547,548,549,550,552],"li",{},"Read ",[30,551,116],{}," from the group header — this identifies the pain.001 file the report refers to",[547,554,555,556,558,559,561],{},"For each ",[30,557,67],{},", read ",[30,560,290],{}," — this identifies the individual payment",[547,563,564],{},"Look up the transaction in your payment register using the end-to-end ID",[547,566,567,568],{},"Update the transaction status based on ",[30,569,570],{},"TxSts",[547,572,573],{},"For rejections, store the reason code and log it for the operator",[10,575,576,577,579],{},"This is why using meaningful, unique values for ",[30,578,293],{}," in pain.001 matters so much. If you used an invoice number, the pain.002 rejection immediately tells you which supplier invoice needs attention. If you used a generated sequence number with no connection to the original invoice, finding it again requires a lookup table.",[23,581,583],{"id":582},"what-to-do-with-rejections","What to do with rejections",[10,585,586,587,590,591,301],{},"For file-level rejections (",[30,588,589],{},"GrpSts = RJCT","): fix the structural issue and resubmit the entire file with a new ",[30,592,120],{},[10,594,595,596,599,600,602],{},"For transaction-level rejections (",[30,597,598],{},"TxSts = RJCT",") within a partially accepted file: correct only the rejected transactions and submit a new pain.001 file containing only those — not the whole original batch. Resubmitting already-accepted transactions will trigger ",[30,601,408],{}," (duplicate) errors.",[10,604,605,606,608],{},"For ",[30,607,343],{}," (wrong IBAN): contact the supplier, get the correct bank details, update your vendor master, and resubmit the payment.",[10,610,605,611,613],{},[30,612,395],{}," (insufficient funds): the debit account did not have enough balance at execution time. Top up the account and resubmit — this is typically a timing issue with a treasury transfer.",[10,615,308,616,620],{},[14,617,619],{"href":618},"\u002Fblog\u002Fcamt054-how-to-parse-booking-notifications-for-reconciliation","camt.054 post"," covers how to reconcile completed payments against your invoices once the transactions are settled.",[622,623,624],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":57,"searchDepth":90,"depth":90,"links":626},[627,628,629,630,631,632,633,634],{"id":25,"depth":90,"text":26},{"id":43,"depth":90,"text":44},{"id":71,"depth":90,"text":72},{"id":212,"depth":90,"text":213},{"id":304,"depth":90,"text":305},{"id":515,"depth":90,"text":516},{"id":538,"depth":90,"text":539},{"id":582,"depth":90,"text":583},"How to interpret a pain.002 status report — accepted, rejected, and pending payments — returned by your bank.","md","2027-01-01",{},true,"\u002Fblog\u002Fpain002-reading-payment-status-reports-from-your-bank",{"title":5,"description":635},"blog\u002F0065.pain002-reading-payment-status-reports-from-your-bank","1d25W5fLKAlbYmX5oLy-2QK3ryRFbToGV9a0qgeBaOs",1777452178048]