SOAP web services in OutSystems O11 are consumed via Logic tab → Integrations → SOAP → right-click → Consume SOAP Web Service, pointing to the WSDL URL or file. Service Studio generates typed actions and structures from the WSDL automatically. SOAP is O11-only — ODC does not support SOAP. When consuming SAP, legacy banking, or government services that only expose SOAP endpoints, this is your only native option in O11.
SOAP in OutSystems: The Legacy Integration Layer
Despite REST dominating modern API design, SOAP (Simple Object Access Protocol) remains the standard in enterprise systems built before 2010: SAP ERP, legacy banking platforms, government APIs, insurance systems, and healthcare HL7 interfaces. When you need to integrate with these systems from OutSystems, SOAP consumption is the correct tool. Service Studio handles the heavy lifting: parse the WSDL, generate typed actions for each operation, create input/output structures, and handle XML envelope serialization. You call SOAP operations like regular Server Actions. This tutorial covers the full workflow including WS-Security, error handling, and the critical ODC migration consideration.
Prerequisites
- OutSystems 11 environment (SOAP is not available in ODC)
- WSDL URL or WSDL file from the SOAP service provider
- Service Studio desktop application installed and connected to your O11 environment
- Network access from your OutSystems platform server to the SOAP service endpoint (check with your infrastructure team for on-premises deployments)
Step-by-step guide
Consume a SOAP web service from a WSDL
Consume a SOAP web service from a WSDL
In Service Studio, click the Logic tab on the right-hand panel. Expand Integrations. Right-click SOAP and select Consume SOAP Web Service. The Consume SOAP Web Service dialog opens with two import options: - Remote URL: paste the WSDL URL directly (e.g., https://service.example.com/service?wsdl) - Local File: browse to a downloaded .wsdl file — useful when the WSDL is behind authentication or on an internal network not reachable from Service Studio Click Next. Service Studio downloads and parses the WSDL. A tree view shows all available services, ports, and operations. Check the operations you want to import. Click Finish. Service Studio creates: a SOAP service node under Logic tab → Integrations → SOAP, one action per selected operation (callable as Server Actions), and Structures under Data tab → Structures for all WSDL-defined complex types.
Expected result: The SOAP service appears under Logic tab → Integrations → SOAP with all imported operations listed as callable actions.
Call a SOAP operation from a Server Action
Call a SOAP operation from a Server Action
Calling a generated SOAP action is identical to calling a Server Action. In any Server Action, drag the SOAP operation from the toolbox (or from Logic tab → Integrations → SOAP → [YourService] → [Operation]) into the action flow. The operation node has input and output parameters defined by the WSDL structures. Assign your data to the input parameters before the node and read from the output parameters after. Example action flow for an address validation SOAP service: Start → Assign (RequestAddress.Street = Input.Street, RequestAddress.City = Input.City, RequestAddress.PostalCode = Input.PostalCode) → ValidateAddress (SOAP operation, Request = RequestAddress) → Assign (IsValid = ValidateAddress.Response.IsValid, StandardizedAddress = ValidateAddress.Response.StandardizedAddress) → End The SOAP operation runs server-side — never drag it into a Client Action.
Expected result: The SOAP operation is called successfully and returns data from the external service.
Configure the SOAP endpoint URL per environment
Configure the SOAP endpoint URL per environment
SOAP services often have different endpoint URLs for test and production environments. Override the endpoint URL without redeploying: O11 approach: 1. Create a Site Property: Data tab → Site Properties → right-click → Add Site Property. Name: SoapServiceEndpointUrl, Type: Text, Default: (test endpoint URL) 2. In Service Studio, click the SOAP service node → Properties → Effective URL → set to GetValue(Site.SoapServiceEndpointUrl) expression 3. In Service Center, set the Site Property to the production URL in the production environment This allows the same published module to connect to different SOAP endpoints per environment without any code change. Note: If the WSDL changes (new version of the service), you must refresh the WSDL. Right-click the SOAP service node → Refresh SOAP Web Service → provide updated WSDL → review structural changes → resolve any TrueChange errors → republish.
Expected result: The SOAP service connects to the correct endpoint URL in each environment, driven by the Site Property value in Service Center.
Configure WS-Security with UsernameToken
Configure WS-Security with UsernameToken
Many enterprise SOAP services (especially SAP, banking) require WS-Security headers in the SOAP envelope. Service Studio has built-in WS-Security support. In Service Studio, click your SOAP service node under Logic tab → Integrations → SOAP. In the Properties panel: 1. Find Authentication property → select Username/Password 2. Set Username expression to Site.SoapUsername (a Site Property) 3. Set Password expression to Site.SoapPassword (a Site Property marked as Secret) For more advanced WS-Security configurations (X.509 certificates, signature algorithms, timestamp requirements), you need Integration Studio to create a C# extension. The extension calls the service using .NET's System.ServiceModel.BasicHttpBinding with WCF security configuration, then wraps it in OutSystems actions via Integration Studio's action mapping. Common WS-Security modes OutSystems handles natively: None, Username/Password (UsernameToken PasswordText). Other modes (PasswordDigest, X.509, SAML tokens) require Integration Studio extensions.
Expected result: The SOAP service accepts requests with the correct WS-Security UsernameToken header. Authentication errors (SOAP Fault with authentication message) are resolved.
Handle SOAP faults with exception handlers
Handle SOAP faults with exception handlers
SOAP services return errors as SOAP Fault XML responses, not HTTP error status codes. OutSystems translates SOAP Faults into Communication Exceptions automatically. To handle errors, right-click the Server Action flow after the SOAP operation → Add Exception Handler → Communication Exception. The CommException.Message contains the SOAP Fault string field. The CommException.ExceptionMessage contains the full fault detail. Action flow with error handling: Start → [SOAP Operation] → Assign (success output) → End [Communication Exception] → Assign (IsSuccess=False, ErrorMessage = "Service call failed: " + CommException.Message) → LogError (Module=YourModule, Message="SOAP fault: " + CommException.ExceptionMessage) → End For SOAP services that return business errors inside a successful SOAP response (not a Fault), inspect the response structure fields — the service documentation will define which fields indicate error conditions. Check them with If nodes after the operation call. Service Center → Monitoring → Integrations logs every SOAP request/response including the raw XML envelope — invaluable for debugging malformed requests or unexpected responses.
Expected result: SOAP Faults are caught and translated into user-friendly messages. Errors are logged to Service Center for investigation.
Expose an OutSystems module as a SOAP service
Expose an OutSystems module as a SOAP service
To expose OutSystems actions as a SOAP service for legacy consumers: 1. Logic tab → Integrations → SOAP → right-click → Expose SOAP Web Service 2. Name the service (e.g., LegacyIntegrationService) 3. Right-click the service → Add SOAP Web Service Method 4. Name the method (this becomes the SOAP operation name) 5. Add input/output parameters — these become the WSDL message types 6. Implement the method logic like any Server Action 7. 1-Click Publish After publishing, the WSDL is accessible at: https://<server>/<module>/SoapService.asmx?WSDL Provide this URL to the legacy system consumer to generate their client code. Note: Exposed SOAP services use the default OutSystems authentication unless you add custom validation in the method logic. For WS-Security on exposed services, check the HTTPRequestHandler for SOAPAction headers and implement token validation manually.
Expected result: The OutSystems WSDL is accessible and legacy consumers can generate client stubs from it. SOAP operations return correctly structured XML responses.
Plan for ODC migration when using SOAP
Plan for ODC migration when using SOAP
SOAP is a blocking factor for O11-to-ODC migration. Before beginning migration: 1. Audit all SOAP integrations: in Service Studio, Logic tab → Integrations → SOAP — list every consumed and exposed service 2. For each consumed SOAP service, check if the provider has a REST equivalent — most modern enterprise platforms now offer REST/OpenAPI alongside their SOAP endpoints 3. For SAP: use SAP OData APIs (REST-based) via Integration Builder (O11) or direct REST consumption (ODC compatible) 4. For custom legacy systems: work with the provider to expose a REST wrapper or implement a REST-to-SOAP adapter service 5. For exposed SOAP services: identify all SOAP consumers, migrate them to REST when feasible, or keep those specific modules in O11 as bridging services The O11 and ODC Conversion Assessment Tool (ODC Portal → Convert from O11) flags SOAP dependencies as migration blockers — resolve these before running the assessment.
Expected result: You have a complete inventory of SOAP dependencies and a migration plan that addresses each one before attempting ODC migration.
Complete working example
1/* Server Action: ValidateCustomerAddress2 Calls external SOAP address validation service3 Input: Street (Text), City (Text), PostalCode (Text)4 Output: IsValid (Boolean), StandardizedStreet (Text), ErrorMessage (Text)5*/67Start8 |9 v10[Assign] -- Build SOAP request structure11 AddressRequest.Street = Street12 AddressRequest.City = City13 AddressRequest.PostalCode = PostalCode14 |15 v16[ValidateAddress] -- SOAP operation (generated from WSDL)17 Request = AddressRequest18 |19 v20[If] ValidateAddress.Response.Status = "SUCCESS"21 |22 True -->23 [Assign]24 IsValid = True25 StandardizedStreet = ValidateAddress.Response.StandardizedAddress.Street26 ErrorMessage = ""27 |28 v29 End30 |31 False --> (business error inside successful SOAP response)32 [Assign]33 IsValid = False34 ErrorMessage = ValidateAddress.Response.ErrorDescription35 |36 v37 End3839[Exception Handler: Communication Exception] -- SOAP Fault40 |41 v42[LogError]43 Module = "AddressModule"44 Message = "SOAP Fault from AddressValidation service"45 ErrorDetail = CommException.ExceptionMessage46 |47 v48[Assign]49 IsValid = False50 ErrorMessage = "Address validation service is temporarily unavailable."51 |52 v53EndCommon mistakes
Why it's a problem: Trying to use SOAP services in ODC
How to avoid: SOAP is not supported in ODC at all — no consume, no expose. If your integration requires SOAP, the module must stay on O11. For ODC migration planning, identify REST alternatives for every SOAP service first, or implement a REST-to-SOAP adapter bridge running in O11.
Why it's a problem: Refreshing the WSDL without reviewing the generated structural changes
How to avoid: When a SOAP service provider updates their WSDL (new fields, renamed operations, changed types), right-clicking Refresh SOAP Web Service updates the structures but may break existing Assign nodes that reference renamed or removed fields. Always review TrueChange errors after a WSDL refresh and update all affected flows before republishing.
Why it's a problem: Placing SOAP operation calls directly in a Client Action
How to avoid: SOAP operations run on the OutSystems server and make network calls — they cannot be placed in Client Actions. TrueChange will show an error. Always call SOAP operations from Server Actions, which are then called from Client Actions or Data Actions if needed.
Why it's a problem: Not handling business error responses inside a successful SOAP Fault-free response
How to avoid: Some SOAP services return HTTP 200 with a valid SOAP response, but include error codes or status fields in the response structure. OutSystems will not raise an exception for these. Always inspect the response fields for error indicators and handle them with If nodes after the operation call.
Best practices
- Always override the SOAP endpoint URL via Site Properties so you can point to test vs production endpoints without redeploying.
- Download a local copy of the WSDL file and import from file rather than URL — WSDL URLs on enterprise systems can become temporarily unavailable, blocking your publish cycle.
- Store WS-Security credentials in Site Properties marked as Secret — never in the SOAP service URL or hardcoded in method calls.
- Add a Communication Exception handler to every Server Action that calls a SOAP operation — SOAP services are notorious for returning Fault responses for business errors, not just network failures.
- Check Service Center → Monitoring → Integrations for the raw SOAP XML envelope when debugging — it shows the exact request that was sent and the exact response received.
- Prefer REST over SOAP for any new integrations, even with enterprise systems that offer both — REST generates cleaner OutSystems structures and is ODC-compatible.
- Keep SOAP-dependent modules isolated in their own OutSystems module/app so you can identify all SOAP dependencies quickly when planning ODC migration.
Still stuck?
Copy one of these prompts to get a personalized, step-by-step explanation.
I need to consume a SOAP web service in OutSystems 11 for our legacy payment processor. The service uses WS-Security with UsernameToken PasswordText. The WSDL has 3 operations: SubmitPayment (input: Amount, CardToken, CurrencyCode; output: TransactionId, Status, ErrorCode), QueryPayment (input: TransactionId; output: Status, Amount), and VoidPayment (input: TransactionId; output: Status). Help me design: 1) the Site Properties to store WS-Security credentials and endpoint URL, 2) a Server Action for each operation with proper error handling, 3) how to interpret SOAP Fault vs business-level error responses.
I have a SOAP web service imported in my OutSystems 11 module. The service has an operation GetCustomerData that returns a complex nested structure: CustomerRecord with nested Address (Street, City, State, PostalCode, Country) and ContactList (array of Contact with Type and Value). Write the Server Action flow (using arrow notation) that: calls GetCustomerData with a CustomerId input, maps the nested response to flat local variables, handles the case where ContactList is empty, and handles Communication Exceptions.
Frequently asked questions
Why is SOAP not supported in OutSystems Developer Cloud (ODC)?
ODC is built on a cloud-native, containerized architecture using modern .NET that deliberately excludes legacy WCF-based SOAP infrastructure. OutSystems made the strategic decision to support only REST in ODC to reduce platform complexity, improve performance, and align with modern API standards. Existing O11 SOAP integrations must be replaced with REST equivalents (or kept in O11 as bridging modules) before migrating to ODC.
How do I handle a SOAP service that returns different response structures depending on the operation result?
Some SOAP services use polymorphic response types or xsi:type attributes for conditional structures. OutSystems generates base structures from the WSDL, but may not correctly handle derived types at runtime. In these cases, use Integration Studio (O11) to create a C# extension that calls the service with .NET's WCF client and maps the response to OutSystems-friendly structures. This gives you full control over XML deserialization.
Can I test a SOAP service call without publishing my OutSystems module?
Not directly from Service Studio. Unlike REST methods which have a built-in Test tab in the import dialog, SOAP operations have no in-IDE testing interface. Use Postman or SoapUI to test the SOAP service before importing it. After importing and building a Server Action, use the Service Studio Debugger (F6) with a breakpoint on the SOAP operation node to step through the call and inspect the response structure at runtime.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation