[{"data":1,"prerenderedAt":1145},["ShallowReactive",2],{"article-eadapter-processinglog-errors":3},{"id":4,"title":5,"author":6,"body":7,"category":1130,"description":1131,"extension":1132,"featured":1133,"image":1134,"meta":1135,"navigation":328,"path":1136,"publishedAt":1137,"readingTime":80,"seo":1138,"stem":1139,"tags":1140,"videoUrl":1143,"__hash__":1144},"articles/articles/eadapter-processinglog-errors.md","Decoding CargoWise ProcessingLog Errors: Why HTTP 200 Doesn't Mean Success","Don Dappa",{"type":8,"value":9,"toc":1120},"minimark",[10,14,17,22,25,33,36,40,43,138,141,182,186,189,224,227,250,253,256,260,263,637,642,661,665,668,674,680,686,690,1016,1019,1023,1026,1086,1090,1098,1109,1116],[11,12,13],"p",{},"You send a shipment to CargoWise via eAdapter. You get HTTP 200 back. You log \"success\" and move on. Three days later, operations calls you because the shipment never appeared.",[11,15,16],{},"This is the most common eAdapter integration bug, and it happens because CargoWise does not use HTTP status codes the way you expect.",[18,19,21],"h2",{"id":20},"http-200-means-i-received-your-xml","HTTP 200 Means \"I Received Your XML\"",[11,23,24],{},"That is all it means. Not \"I processed it.\" Not \"I created the record.\" Not \"your data is valid.\" Just: \"I got the bytes.\"",[11,26,27,28,32],{},"The actual result of your operation is buried inside the XML response body, in a structure called ",[29,30,31],"code",{},"UniversalResponse",". Whether your shipment was created, partially updated, or completely rejected — the HTTP status is 200 either way.",[11,34,35],{},"If your integration only checks the HTTP status code, you have a silent data loss bug. Full stop.",[18,37,39],{"id":38},"the-universalresponse-structure","The UniversalResponse Structure",[11,41,42],{},"Every eAdapter response follows this shape:",[44,45,50],"pre",{"className":46,"code":47,"language":48,"meta":49,"style":49},"language-xml shiki shiki-themes github-light","\u003CUniversalResponse xmlns=\"http://www.cargowise.com/Schemas/Universal/2011/11\">\n  \u003CStatus>ERR\u003C/Status>\n  \u003CData>\n    \u003CUniversalEvent>\n      \u003CEvent>\n        \u003CEventType>DIM\u003C/EventType>\n        \u003CEventReference>SHP-00012345\u003C/EventReference>\n      \u003C/Event>\n    \u003C/UniversalEvent>\n  \u003C/Data>\n  \u003CProcessingLog>Warning: Consignee 'ACME CORP' not matched - created as local party.\nError: Container number ABCU123456 failed check digit validation.\nError: Unable to save shipment - mandatory field VoyageNumber is empty.\u003C/ProcessingLog>\n\u003C/UniversalResponse>\n","xml","",[29,51,52,60,66,72,78,84,90,96,102,108,114,120,126,132],{"__ignoreMap":49},[53,54,57],"span",{"class":55,"line":56},"line",1,[53,58,59],{},"\u003CUniversalResponse xmlns=\"http://www.cargowise.com/Schemas/Universal/2011/11\">\n",[53,61,63],{"class":55,"line":62},2,[53,64,65],{},"  \u003CStatus>ERR\u003C/Status>\n",[53,67,69],{"class":55,"line":68},3,[53,70,71],{},"  \u003CData>\n",[53,73,75],{"class":55,"line":74},4,[53,76,77],{},"    \u003CUniversalEvent>\n",[53,79,81],{"class":55,"line":80},5,[53,82,83],{},"      \u003CEvent>\n",[53,85,87],{"class":55,"line":86},6,[53,88,89],{},"        \u003CEventType>DIM\u003C/EventType>\n",[53,91,93],{"class":55,"line":92},7,[53,94,95],{},"        \u003CEventReference>SHP-00012345\u003C/EventReference>\n",[53,97,99],{"class":55,"line":98},8,[53,100,101],{},"      \u003C/Event>\n",[53,103,105],{"class":55,"line":104},9,[53,106,107],{},"    \u003C/UniversalEvent>\n",[53,109,111],{"class":55,"line":110},10,[53,112,113],{},"  \u003C/Data>\n",[53,115,117],{"class":55,"line":116},11,[53,118,119],{},"  \u003CProcessingLog>Warning: Consignee 'ACME CORP' not matched - created as local party.\n",[53,121,123],{"class":55,"line":122},12,[53,124,125],{},"Error: Container number ABCU123456 failed check digit validation.\n",[53,127,129],{"class":55,"line":128},13,[53,130,131],{},"Error: Unable to save shipment - mandatory field VoyageNumber is empty.\u003C/ProcessingLog>\n",[53,133,135],{"class":55,"line":134},14,[53,136,137],{},"\u003C/UniversalResponse>\n",[11,139,140],{},"Three things to notice:",[142,143,144,166,174],"ol",{},[145,146,147,153,154,157,158,161,162,165],"li",{},[148,149,150],"strong",{},[29,151,152],{},"Status"," can be ",[29,155,156],{},"SUC"," (success), ",[29,159,160],{},"ERR"," (error), or ",[29,163,164],{},"PRS"," (processed with warnings). Always check this first.",[145,167,168,173],{},[148,169,170],{},[29,171,172],{},"Data"," contains references to created/updated records. On error, this may be empty or contain partial data.",[145,175,176,181],{},[148,177,178],{},[29,179,180],{},"ProcessingLog"," is where the actual detail lives. And here is the surprise.",[18,183,185],{"id":184},"processinglog-is-flat-text-not-structured-xml","ProcessingLog Is Flat Text, Not Structured XML",[11,187,188],{},"This catches every developer the first time. You would expect something like:",[44,190,192],{"className":46,"code":191,"language":48,"meta":49,"style":49},"\u003C!-- What you expect -->\n\u003CProcessingLog>\n  \u003CEntry severity=\"error\" code=\"VAL001\">\n    \u003CMessage>Container number failed validation\u003C/Message>\n  \u003C/Entry>\n\u003C/ProcessingLog>\n",[29,193,194,199,204,209,214,219],{"__ignoreMap":49},[53,195,196],{"class":55,"line":56},[53,197,198],{},"\u003C!-- What you expect -->\n",[53,200,201],{"class":55,"line":62},[53,202,203],{},"\u003CProcessingLog>\n",[53,205,206],{"class":55,"line":68},[53,207,208],{},"  \u003CEntry severity=\"error\" code=\"VAL001\">\n",[53,210,211],{"class":55,"line":74},[53,212,213],{},"    \u003CMessage>Container number failed validation\u003C/Message>\n",[53,215,216],{"class":55,"line":80},[53,217,218],{},"  \u003C/Entry>\n",[53,220,221],{"class":55,"line":86},[53,222,223],{},"\u003C/ProcessingLog>\n",[11,225,226],{},"What you actually get:",[44,228,230],{"className":46,"code":229,"language":48,"meta":49,"style":49},"\u003C!-- What you actually get -->\n\u003CProcessingLog>Warning: Consignee 'ACME CORP' not matched - created as local party.\nError: Container number ABCU123456 failed check digit validation.\nError: Unable to save shipment - mandatory field VoyageNumber is empty.\u003C/ProcessingLog>\n",[29,231,232,237,242,246],{"__ignoreMap":49},[53,233,234],{"class":55,"line":56},[53,235,236],{},"\u003C!-- What you actually get -->\n",[53,238,239],{"class":55,"line":62},[53,240,241],{},"\u003CProcessingLog>Warning: Consignee 'ACME CORP' not matched - created as local party.\n",[53,243,244],{"class":55,"line":68},[53,245,125],{},[53,247,248],{"class":55,"line":74},[53,249,131],{},[11,251,252],{},"Plain text. Newline-separated. No XML structure inside. No error codes. No severity attributes. Just human-readable strings prefixed with \"Warning:\" or \"Error:\".",[11,254,255],{},"This means you cannot use an XML parser to extract individual errors. You need string parsing.",[18,257,259],{"id":258},"how-to-parse-processinglog-properly","How to Parse ProcessingLog Properly",[11,261,262],{},"Here is the pattern that works reliably:",[44,264,268],{"className":265,"code":266,"language":267,"meta":49,"style":49},"language-typescript shiki shiki-themes github-light","function parseProcessingLog(log: string) {\n  if (!log?.trim()) return { errors: [], warnings: [], info: [] }\n\n  const lines = log\n    .split('\\n')\n    .map((l) => l.trim())\n    .filter(Boolean)\n\n  const errors: string[] = []\n  const warnings: string[] = []\n  const info: string[] = []\n\n  for (const line of lines) {\n    if (line.startsWith('Error:')) {\n      errors.push(line.replace('Error:', '').trim())\n    } else if (line.startsWith('Warning:')) {\n      warnings.push(line.replace('Warning:', '').trim())\n    } else {\n      info.push(line)\n    }\n  }\n\n  return { errors, warnings, info }\n}\n","typescript",[29,269,270,298,324,330,344,366,393,403,407,427,444,461,465,484,503,535,558,584,594,605,611,617,622,631],{"__ignoreMap":49},[53,271,272,276,280,284,288,291,295],{"class":55,"line":56},[53,273,275],{"class":274},"sD7c4","function",[53,277,279],{"class":278},"s7eDp"," parseProcessingLog",[53,281,283],{"class":282},"sgsFI","(",[53,285,287],{"class":286},"sqxcx","log",[53,289,290],{"class":274},":",[53,292,294],{"class":293},"sYu0t"," string",[53,296,297],{"class":282},") {\n",[53,299,300,303,306,309,312,315,318,321],{"class":55,"line":62},[53,301,302],{"class":274},"  if",[53,304,305],{"class":282}," (",[53,307,308],{"class":274},"!",[53,310,311],{"class":282},"log?.",[53,313,314],{"class":278},"trim",[53,316,317],{"class":282},"()) ",[53,319,320],{"class":274},"return",[53,322,323],{"class":282}," { errors: [], warnings: [], info: [] }\n",[53,325,326],{"class":55,"line":68},[53,327,329],{"emptyLinePlaceholder":328},true,"\n",[53,331,332,335,338,341],{"class":55,"line":74},[53,333,334],{"class":274},"  const",[53,336,337],{"class":293}," lines",[53,339,340],{"class":274}," =",[53,342,343],{"class":282}," log\n",[53,345,346,349,352,354,358,361,363],{"class":55,"line":80},[53,347,348],{"class":282},"    .",[53,350,351],{"class":278},"split",[53,353,283],{"class":282},[53,355,357],{"class":356},"sYBdl","'",[53,359,360],{"class":293},"\\n",[53,362,357],{"class":356},[53,364,365],{"class":282},")\n",[53,367,368,370,373,376,379,382,385,388,390],{"class":55,"line":86},[53,369,348],{"class":282},[53,371,372],{"class":278},"map",[53,374,375],{"class":282},"((",[53,377,378],{"class":286},"l",[53,380,381],{"class":282},") ",[53,383,384],{"class":274},"=>",[53,386,387],{"class":282}," l.",[53,389,314],{"class":278},[53,391,392],{"class":282},"())\n",[53,394,395,397,400],{"class":55,"line":92},[53,396,348],{"class":282},[53,398,399],{"class":278},"filter",[53,401,402],{"class":282},"(Boolean)\n",[53,404,405],{"class":55,"line":98},[53,406,329],{"emptyLinePlaceholder":328},[53,408,409,411,414,416,418,421,424],{"class":55,"line":104},[53,410,334],{"class":274},[53,412,413],{"class":293}," errors",[53,415,290],{"class":274},[53,417,294],{"class":293},[53,419,420],{"class":282},"[] ",[53,422,423],{"class":274},"=",[53,425,426],{"class":282}," []\n",[53,428,429,431,434,436,438,440,442],{"class":55,"line":110},[53,430,334],{"class":274},[53,432,433],{"class":293}," warnings",[53,435,290],{"class":274},[53,437,294],{"class":293},[53,439,420],{"class":282},[53,441,423],{"class":274},[53,443,426],{"class":282},[53,445,446,448,451,453,455,457,459],{"class":55,"line":116},[53,447,334],{"class":274},[53,449,450],{"class":293}," info",[53,452,290],{"class":274},[53,454,294],{"class":293},[53,456,420],{"class":282},[53,458,423],{"class":274},[53,460,426],{"class":282},[53,462,463],{"class":55,"line":122},[53,464,329],{"emptyLinePlaceholder":328},[53,466,467,470,472,475,478,481],{"class":55,"line":128},[53,468,469],{"class":274},"  for",[53,471,305],{"class":282},[53,473,474],{"class":274},"const",[53,476,477],{"class":293}," line",[53,479,480],{"class":274}," of",[53,482,483],{"class":282}," lines) {\n",[53,485,486,489,492,495,497,500],{"class":55,"line":134},[53,487,488],{"class":274},"    if",[53,490,491],{"class":282}," (line.",[53,493,494],{"class":278},"startsWith",[53,496,283],{"class":282},[53,498,499],{"class":356},"'Error:'",[53,501,502],{"class":282},")) {\n",[53,504,506,509,512,515,518,520,522,525,528,531,533],{"class":55,"line":505},15,[53,507,508],{"class":282},"      errors.",[53,510,511],{"class":278},"push",[53,513,514],{"class":282},"(line.",[53,516,517],{"class":278},"replace",[53,519,283],{"class":282},[53,521,499],{"class":356},[53,523,524],{"class":282},", ",[53,526,527],{"class":356},"''",[53,529,530],{"class":282},").",[53,532,314],{"class":278},[53,534,392],{"class":282},[53,536,538,541,544,547,549,551,553,556],{"class":55,"line":537},16,[53,539,540],{"class":282},"    } ",[53,542,543],{"class":274},"else",[53,545,546],{"class":274}," if",[53,548,491],{"class":282},[53,550,494],{"class":278},[53,552,283],{"class":282},[53,554,555],{"class":356},"'Warning:'",[53,557,502],{"class":282},[53,559,561,564,566,568,570,572,574,576,578,580,582],{"class":55,"line":560},17,[53,562,563],{"class":282},"      warnings.",[53,565,511],{"class":278},[53,567,514],{"class":282},[53,569,517],{"class":278},[53,571,283],{"class":282},[53,573,555],{"class":356},[53,575,524],{"class":282},[53,577,527],{"class":356},[53,579,530],{"class":282},[53,581,314],{"class":278},[53,583,392],{"class":282},[53,585,587,589,591],{"class":55,"line":586},18,[53,588,540],{"class":282},[53,590,543],{"class":274},[53,592,593],{"class":282}," {\n",[53,595,597,600,602],{"class":55,"line":596},19,[53,598,599],{"class":282},"      info.",[53,601,511],{"class":278},[53,603,604],{"class":282},"(line)\n",[53,606,608],{"class":55,"line":607},20,[53,609,610],{"class":282},"    }\n",[53,612,614],{"class":55,"line":613},21,[53,615,616],{"class":282},"  }\n",[53,618,620],{"class":55,"line":619},22,[53,621,329],{"emptyLinePlaceholder":328},[53,623,625,628],{"class":55,"line":624},23,[53,626,627],{"class":274},"  return",[53,629,630],{"class":282}," { errors, warnings, info }\n",[53,632,634],{"class":55,"line":633},24,[53,635,636],{"class":282},"}\n",[11,638,639],{},[148,640,641],{},"Key rules:",[643,644,645,652,658],"ul",{},[145,646,647,648,651],{},"Lines starting with ",[29,649,650],{},"Error:"," are fatal — the operation did not complete",[145,653,647,654,657],{},[29,655,656],{},"Warning:"," are non-fatal — the operation completed but something was off (e.g., a party was not matched and was created as a local entry)",[145,659,660],{},"Lines with no prefix are informational — usually confirmation messages",[18,662,664],{"id":663},"warnings-you-must-not-ignore","Warnings You Must Not Ignore",[11,666,667],{},"Some warnings are functionally errors for your business process:",[11,669,670,673],{},[148,671,672],{},"\"Consignee not matched - created as local party\""," — Your party data did not match an existing organisation in CargoWise. A throwaway local party was created instead. Your operations team will need to manually fix this.",[11,675,676,679],{},[148,677,678],{},"\"No matching organisation found for code XYZ\""," — You sent an org code that does not exist in this CW instance. The party field may be blank on the shipment.",[11,681,682,685],{},[148,683,684],{},"\"VGM details not updated - container already sealed\""," — Your VGM submission arrived after the container status was updated. This can mean missed deadlines and fines.",[18,687,689],{"id":688},"the-correct-response-checking-pattern","The Correct Response-Checking Pattern",[44,691,693],{"className":265,"code":692,"language":267,"meta":49,"style":49},"// 1. Check HTTP status (catches network/auth failures)\nif (!response.ok) {\n  throw new Error(`eAdapter HTTP error: ${response.status}`)\n}\n\n// 2. Parse the XML response body\nconst xml = await response.text()\nconst parsed = parseUniversalResponse(xml)\n\n// 3. Check the Status element\nif (parsed.status === 'ERR') {\n  const { errors } = parseProcessingLog(parsed.processingLog)\n  throw new Error(`eAdapter rejected: ${errors.join('; ')}`)\n}\n\n// 4. Check for business-critical warnings\nif (parsed.status === 'PRS') {\n  const { warnings } = parseProcessingLog(parsed.processingLog)\n  const criticalWarnings = warnings.filter(\n    (w) => w.includes('not matched') || w.includes('not found')\n  )\n  if (criticalWarnings.length > 0) {\n    // Log for operations review, don't necessarily throw\n    await flagForReview(parsed.reference, criticalWarnings)\n  }\n}\n",[29,694,695,701,713,743,747,751,756,777,792,796,801,816,836,868,872,876,881,894,911,928,967,972,990,995,1006,1011],{"__ignoreMap":49},[53,696,697],{"class":55,"line":56},[53,698,700],{"class":699},"sAwPA","// 1. Check HTTP status (catches network/auth failures)\n",[53,702,703,706,708,710],{"class":55,"line":62},[53,704,705],{"class":274},"if",[53,707,305],{"class":282},[53,709,308],{"class":274},[53,711,712],{"class":282},"response.ok) {\n",[53,714,715,718,721,724,726,729,732,735,738,741],{"class":55,"line":68},[53,716,717],{"class":274},"  throw",[53,719,720],{"class":274}," new",[53,722,723],{"class":278}," Error",[53,725,283],{"class":282},[53,727,728],{"class":356},"`eAdapter HTTP error: ${",[53,730,731],{"class":282},"response",[53,733,734],{"class":356},".",[53,736,737],{"class":282},"status",[53,739,740],{"class":356},"}`",[53,742,365],{"class":282},[53,744,745],{"class":55,"line":74},[53,746,636],{"class":282},[53,748,749],{"class":55,"line":80},[53,750,329],{"emptyLinePlaceholder":328},[53,752,753],{"class":55,"line":86},[53,754,755],{"class":699},"// 2. Parse the XML response body\n",[53,757,758,760,763,765,768,771,774],{"class":55,"line":92},[53,759,474],{"class":274},[53,761,762],{"class":293}," xml",[53,764,340],{"class":274},[53,766,767],{"class":274}," await",[53,769,770],{"class":282}," response.",[53,772,773],{"class":278},"text",[53,775,776],{"class":282},"()\n",[53,778,779,781,784,786,789],{"class":55,"line":98},[53,780,474],{"class":274},[53,782,783],{"class":293}," parsed",[53,785,340],{"class":274},[53,787,788],{"class":278}," parseUniversalResponse",[53,790,791],{"class":282},"(xml)\n",[53,793,794],{"class":55,"line":104},[53,795,329],{"emptyLinePlaceholder":328},[53,797,798],{"class":55,"line":110},[53,799,800],{"class":699},"// 3. Check the Status element\n",[53,802,803,805,808,811,814],{"class":55,"line":116},[53,804,705],{"class":274},[53,806,807],{"class":282}," (parsed.status ",[53,809,810],{"class":274},"===",[53,812,813],{"class":356}," 'ERR'",[53,815,297],{"class":282},[53,817,818,820,823,826,829,831,833],{"class":55,"line":122},[53,819,334],{"class":274},[53,821,822],{"class":282}," { ",[53,824,825],{"class":293},"errors",[53,827,828],{"class":282}," } ",[53,830,423],{"class":274},[53,832,279],{"class":278},[53,834,835],{"class":282},"(parsed.processingLog)\n",[53,837,838,840,842,844,846,849,851,853,856,858,861,864,866],{"class":55,"line":128},[53,839,717],{"class":274},[53,841,720],{"class":274},[53,843,723],{"class":278},[53,845,283],{"class":282},[53,847,848],{"class":356},"`eAdapter rejected: ${",[53,850,825],{"class":282},[53,852,734],{"class":356},[53,854,855],{"class":278},"join",[53,857,283],{"class":356},[53,859,860],{"class":356},"'; '",[53,862,863],{"class":356},")",[53,865,740],{"class":356},[53,867,365],{"class":282},[53,869,870],{"class":55,"line":134},[53,871,636],{"class":282},[53,873,874],{"class":55,"line":505},[53,875,329],{"emptyLinePlaceholder":328},[53,877,878],{"class":55,"line":537},[53,879,880],{"class":699},"// 4. Check for business-critical warnings\n",[53,882,883,885,887,889,892],{"class":55,"line":560},[53,884,705],{"class":274},[53,886,807],{"class":282},[53,888,810],{"class":274},[53,890,891],{"class":356}," 'PRS'",[53,893,297],{"class":282},[53,895,896,898,900,903,905,907,909],{"class":55,"line":586},[53,897,334],{"class":274},[53,899,822],{"class":282},[53,901,902],{"class":293},"warnings",[53,904,828],{"class":282},[53,906,423],{"class":274},[53,908,279],{"class":278},[53,910,835],{"class":282},[53,912,913,915,918,920,923,925],{"class":55,"line":596},[53,914,334],{"class":274},[53,916,917],{"class":293}," criticalWarnings",[53,919,340],{"class":274},[53,921,922],{"class":282}," warnings.",[53,924,399],{"class":278},[53,926,927],{"class":282},"(\n",[53,929,930,933,936,938,940,943,946,948,951,953,956,958,960,962,965],{"class":55,"line":607},[53,931,932],{"class":282},"    (",[53,934,935],{"class":286},"w",[53,937,381],{"class":282},[53,939,384],{"class":274},[53,941,942],{"class":282}," w.",[53,944,945],{"class":278},"includes",[53,947,283],{"class":282},[53,949,950],{"class":356},"'not matched'",[53,952,381],{"class":282},[53,954,955],{"class":274},"||",[53,957,942],{"class":282},[53,959,945],{"class":278},[53,961,283],{"class":282},[53,963,964],{"class":356},"'not found'",[53,966,365],{"class":282},[53,968,969],{"class":55,"line":613},[53,970,971],{"class":282},"  )\n",[53,973,974,976,979,982,985,988],{"class":55,"line":619},[53,975,302],{"class":274},[53,977,978],{"class":282}," (criticalWarnings.",[53,980,981],{"class":293},"length",[53,983,984],{"class":274}," >",[53,986,987],{"class":293}," 0",[53,989,297],{"class":282},[53,991,992],{"class":55,"line":624},[53,993,994],{"class":699},"    // Log for operations review, don't necessarily throw\n",[53,996,997,1000,1003],{"class":55,"line":633},[53,998,999],{"class":274},"    await",[53,1001,1002],{"class":278}," flagForReview",[53,1004,1005],{"class":282},"(parsed.reference, criticalWarnings)\n",[53,1007,1009],{"class":55,"line":1008},25,[53,1010,616],{"class":282},[53,1012,1014],{"class":55,"line":1013},26,[53,1015,636],{"class":282},[11,1017,1018],{},"The three-layer check — HTTP status, then XML Status, then ProcessingLog content — is the minimum for a reliable integration.",[18,1020,1022],{"id":1021},"real-world-error-patterns","Real-World Error Patterns",[11,1024,1025],{},"After processing thousands of eAdapter responses across production integrations, these are the most frequent errors we see:",[1027,1028,1029,1042],"table",{},[1030,1031,1032],"thead",{},[1033,1034,1035,1039],"tr",{},[1036,1037,1038],"th",{},"Error Message Pattern",[1036,1040,1041],{},"Usual Cause",[1043,1044,1045,1054,1062,1070,1078],"tbody",{},[1033,1046,1047,1051],{},[1048,1049,1050],"td",{},"\"Container number failed check digit\"",[1048,1052,1053],{},"ISO 6346 validation — check digit algorithm wrong",[1033,1055,1056,1059],{},[1048,1057,1058],{},"\"Unable to save - mandatory field empty\"",[1048,1060,1061],{},"Required CW field not mapped in your XML",[1033,1063,1064,1067],{},[1048,1065,1066],{},"\"No matching shipment found\"",[1048,1068,1069],{},"Wrong DataTarget type (consol vs shipment)",[1033,1071,1072,1075],{},[1048,1073,1074],{},"\"Duplicate key violation\"",[1048,1076,1077],{},"Sending a create when the record already exists",[1033,1079,1080,1083],{},[1048,1081,1082],{},"\"Organisation code not found\"",[1048,1084,1085],{},"Org code mismatch between systems",[18,1087,1089],{"id":1088},"go-beyond-error-handling","Go Beyond Error Handling",[11,1091,1092,1093,1097],{},"Understanding ProcessingLog parsing is essential, but it is one piece of a larger puzzle. Knowing ",[1094,1095,1096],"em",{},"which"," errors are recoverable, how to implement retry logic that does not create duplicates, and how to build monitoring dashboards that catch silent failures before operations does — that requires deeper knowledge.",[11,1099,1100,1101,1108],{},"Our ",[148,1102,1103],{},[1104,1105,1107],"a",{"href":1106},"/eadapter","Complete eAdapter Integration Guide"," covers the full error-handling architecture, including retry strategies, idempotency patterns, and a ProcessingLog monitoring template you can deploy immediately.",[11,1110,1111],{},[148,1112,1113],{},[1104,1114,1115],{"href":1106},"Get the Complete Guide →",[1117,1118,1119],"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 pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sqxcx, html code.shiki .sqxcx{--shiki-default:#E36209}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":49,"searchDepth":62,"depth":62,"links":1121},[1122,1123,1124,1125,1126,1127,1128,1129],{"id":20,"depth":62,"text":21},{"id":38,"depth":62,"text":39},{"id":184,"depth":62,"text":185},{"id":258,"depth":62,"text":259},{"id":663,"depth":62,"text":664},{"id":688,"depth":62,"text":689},{"id":1021,"depth":62,"text":1022},{"id":1088,"depth":62,"text":1089},"technical","CargoWise eAdapter returns HTTP 200 even when your operation fails. Here's how to actually detect errors, parse the ProcessingLog, and stop losing data silently.","md",false,"/images/articles/eadapter-processinglog.webp",{},"/articles/eadapter-processinglog-errors","2026-03-18",{"title":5,"description":1131},"articles/eadapter-processinglog-errors",[1141,180,1142],"CargoWise eAdapter","error handling",null,"_9Nx2B9gBPa9gUgjjJx5fm7GkQqmL9VF6aMeJdS0FKI",1775327519976]