IDoc status 31 — IDoc Status 31 Outbound Error No Further Processing
Status 31 is an outbound-only IDoc status meaning processing has stopped with an error and will not continue automatically. Unlike syntax or port errors, 31 is usually set deliberately by custom exit or program logic that rejected the IDoc on a business rule, so the fix requires finding and correcting that rule's trigger, not just resubmitting the IDoc.
Covers the outbound status 31, a terminal error state that most often comes from custom validation logic rather than a standard ALE or port failure. Focuses on why it gets set, how to trace the responsible exit or program, and why blind reprocessing risks duplicate output.
Published 16 Sept 2026· 1,007 words
What the status means
Status 31 applies only to outbound IDocs. It sits after generation (status 01) but signals that processing has been stopped due to an error, and the IDoc will not progress to being passed to the port (status 03) or dispatched further. It differs from the more specific technical failure points such as a syntax check error or an ALE service error, both of which are raised automatically by the standard IDoc layer at a known point in the pipeline. Status 31 is frequently set explicitly, by a user exit, BAdI, or custom program that decided, based on a business condition, that the IDoc should not go any further. Because the trigger is often custom code rather than a standard check, the reason is not always obvious from the status record alone.
Why it appears
- A custom outbound exit or BAdI implemented in the output or ALE distribution logic performs a business validation (missing partner data, incomplete master record, failed duplicate check) and explicitly sets the IDoc to status 31 rather than letting it proceed
- Output determination or message control has a custom condition or requirement routine that decides mid-process not to send the message, and the exception handling routine used marks the IDoc with 31
- ALE distribution model filters (object type or segment filter groups) are evaluated by custom code after generation, and the rejection branch of that code sets status 31 instead of leaving the IDoc unprocessed
- A Z-program responsible for creating and releasing the IDoc contains a manual status-set call used to kill processing when a data completeness check fails, for example a required reference field is blank
- Someone has manually set status 31 through IDoc administration to flag a batch of IDocs as known-bad, intending to hold them until a data correction is delivered, and this gets forgotten
- A mapping or enrichment step performed before the standard syntax check throws an exception that a generic catch block defaults to status 31 instead of a more specific error status, hiding the real technical cause
What to inspect
- WE02 or WE05 to open the IDoc and read the status record text attached to 31, which usually names the failed check or points to a log
- SLG1 filtered by the relevant object and IDoc number, since custom exits often write the real error detail to the application log rather than the status text itself
- WE20 to check the partner profile for the outbound message type, confirming process code, port, and any custom output condition attached
- WE41 or WE42 to identify which custom process code or exit is assigned to this message type, then review that code for the explicit status 31 logic
- The ALE distribution model definition, if filter groups or segment filters are in use, to confirm whether a filter rejection is the actual trigger
How to reprocess safely
Read the status record text and any linked application log entry first, since status 31 is almost never self-explanatory from the status code alone. Identify the specific business condition that the exit or program checked and failed, then correct the underlying data or configuration: the missing partner detail, the incomplete master record, the wrong filter setting. Because status 31 typically means the IDoc never reached the port and no data left the system, the safest reprocessing route is usually to regenerate the IDoc by rerunning the output or distribution trigger from the source document, rather than forcing the existing errored IDoc forward. Before doing that, confirm through the output control record on the source document (or equivalent output history) that no partial or duplicate message was already sent, particularly if the custom exit ran after the source document was already committed. Only after the data fix is in place and verified should reprocessing be triggered, and it should be re-run through the same process that originally failed, not a generic status override.
The fix people try first (and why it fails)
The reflex fix is to treat 31 like a routine technical glitch and force it through reprocessing (for example resetting status and rerunning via the standard reprocessing report) without reading why it was stopped. Since 31 usually reflects a deliberate business-rule rejection in custom code, bypassing it skips the check that exists for a reason. If the reprocessing path re-triggers output determination on the source document, this can generate a second, separate outbound message alongside whatever was already sent, producing duplicate deliveries or duplicate postings at the receiver. It also guarantees the same block reappears on the next run since the underlying data was never corrected.
Whose problem this is
This belongs to the interface or functional team that owns the outbound scenario, since the status is usually the product of custom validation logic tied to a business rule rather than a basis or transport-layer fault. Development involvement is needed to read the exit or BAdI code that raised the status. Hand over the IDoc number, the exact status record text, any linked application log entry, and the source document number.
Common pitfalls
The status text is sometimes generic, such as a pointer to check the log, which gets mistaken for a stalled but otherwise healthy IDoc rather than a deliberate stop. Teams used to standard syntax or port errors sometimes only check the technical layer and miss that custom exit code, not the ALE framework, produced the status. Mass reprocessing tools are occasionally configured to skip IDocs in status 31 on the assumption that it is non-recoverable, which can create a false sense that the issue was handled when it was simply excluded from the run.
Related SAP objects
Reviewed pages this object connects to in the ERPClimb knowledge graph.
Source: ERPClimb — https://erpclimb.com/sap-idoc/status-31ERPClimb is an independent platform and is not affiliated with SAP SE. Reference pages are written and reviewed by SAP consultants for learning and troubleshooting.