OUTSYSTEMS + ODC
OutSystems Interview Questions & Answers
Prepare for your next OutSystems interview with 101 expert interview questions covering ODC, O11, architecture, APIs, database, BPT, security, deployment, and enterprise software development.
Architecture
How modules are supposed to sit relative to each other, and what breaks when they don't.
Q1 What is 3-layer architecture
OutSystems apps are organized into three layers so that reuse flows one way only, downward. Foundation is the bottom layer and holds generic, reusable pieces that carry no business meaning, things like date utilities or a generic REST connector. Core sits above it and holds the business logic and services specific to your domain, for example the logic that calculates an insurance premium or validates a loan application. End-User is the top layer and holds the screens and UI that people actually interact with. A module in a lower layer is never allowed to reference something in a higher layer, that rule is what keeps the whole application tree from turning into spaghetti as it grows.
End-User
Screens, blocks, mobile UI
Core
Business logic, services, processes
Foundation
Generic utilities, integrations
Q2 What is Architecture validation rule, explain
These are automated checks that Service Studio and the Architecture Dashboard run against your dependency graph. They catch things like a Foundation module referencing a Core module, or a circular reference between two modules, or a module nobody uses anymore. Think of it as a linter for architecture rather than for code syntax. Ignoring these warnings for a while is fine during early development, but letting them pile up in a growing enterprise app is how technical debt quietly builds up until a refactor becomes painful.
Q3 How do you solve the circular dependency
First you find what both modules actually need from each other and pull that shared piece into a lower common module, usually in Foundation or Core, so both sides can reference it downward instead of referencing each other sideways. If the coupling is more about notifying the other side something happened rather than needing data back, an event is often cleaner than a direct call, since events decouple the producer from having to know who is listening. In ODC specifically, cyclic dependency between libraries is not just discouraged, the platform actively blocks it at publish time, so you are forced to break the cycle before you can even deploy.
Q4 How do you solve the upward reference issue
An upward reference happens when a lower layer module points to something in a higher layer, which breaks the whole point of layering. The fix is almost always to move the referenced element down to where it actually belongs, so the lower module never had a reason to look up in the first place. If moving it down is not practical because of how the logic is used elsewhere, you invert the relationship with a callback or an event so the higher layer subscribes to the lower layer instead of the lower layer calling up.
Q5 In what type of modules we should put the API consumption
API consumption belongs in Core layer service or integration modules, wrapped inside a server action with a clear name like GetCustomerFromCRM, not scattered directly inside screen logic. This way if the third party changes their contract, you fix it in one place instead of hunting through every screen that happened to call the raw REST method. It also means the End-User layer only knows about your clean internal action, not the messy details of authentication headers or response parsing.
Q6 Tell 5 Architectural and Development best practices
Five that matter most in practice:
- • Keep the layering strict, nothing references upward and nothing loops back on itself
- • Give every module a single clear responsibility instead of letting it become a dumping ground
- • Follow one naming convention across the whole application
- • Separate UI from business logic, screens should call actions, not contain business rules
- • Reuse through Core or Foundation modules instead of copy pasting logic across apps
Q7 What are the sub layers of core layer
OutSystems does not officially name sub layers inside Core in its documentation, but in practice most architects split it into Core Services, which holds business logic, entities and processes, and Core Widgets, which holds reusable business specific UI components that are still generic enough to be shared across multiple End-User apps. This is a convention teams adopt for clarity, not a rule enforced by the platform itself.
Q8 What are the sub layers of the foundation layer
Same situation as Core, this is convention rather than an official platform rule. Foundation is commonly split into Foundation Utilities, which are generic helpers with zero business meaning like string formatting or date math, and Foundation Data or Integration, which holds generic connectors to external systems that any app in the company might need, like a generic email sender or a generic file storage wrapper.
Q9 How OutSystems knows that an application is foundation layer application
There is no checkbox anywhere that says this module is Foundation. The Architecture Dashboard figures it out by analyzing the dependency graph, if a module has no dependency on anything business specific and is consumed by a wide spread of other modules, it gets treated as sitting at the foundation of the tree. It is an inferred position based on how the module behaves, not a declared property.
Q10 What are the naming conventions best practices
A few conventions worth holding the line on:
- • Use PascalCase consistently for modules, entities and actions
- • Name actions like a sentence describing what they do, GetCustomerById, not just GetCustomer
- • Avoid abbreviations that only make sense to the person who wrote them
- • Prefix or group modules by domain so the module list reads like a map
- • Stay consistent across the whole team, the exact convention matters less than everyone following it
Logic
The building blocks that actually run your business rules, client side and server side.
Q11 What type of Actions are available in OutSystems
OutSystems gives you several types of actions, each scoped to a different context:
- • Screen actions, triggered by a UI event on a specific screen
- • Client actions, run in the browser, can call server actions
- • Server actions, run on the server, can touch the database
- • Web block actions, scoped to a reusable block
- • Timers, scheduled or background logic with no user present
- • Data actions, wrap complex or Advanced SQL based queries
- • Service actions, an ODC concept, public actions exposed by one app and consumed by another
Q12 Why we should not call two server actions in one client action
Every server action call is a full network round trip from the browser to the server and back. Calling two of them one after another inside a client action means the user waits for two round trips instead of one, and if the first one succeeds but the second fails, you can end up in a half completed state that is annoying to recover from. Merging the logic into a single server action means one round trip, one transaction, and a cleaner failure story.
Q13 What is the difference between calling two server actions A and B in a client action and merging A and B in C and calling C in the client action
Calling A then B separately gives you two network trips with the client doing something in between, which is sometimes necessary if the client genuinely needs to react to A's result before deciding what to send in B. But if there is no real reason for the client to see the intermediate result, merging A and B into a single server action C and calling that once is faster, more atomic since it runs inside one transaction, and simpler to reason about when something goes wrong.
Q14 Why we can not have output parameter in screen client action
A client action fired directly from a UI event, like a button click, has no caller waiting to receive a returned value, the browser event just triggers it and moves on. Since there is nobody positioned to consume an output, the platform does not let you define one on that type of action. Client actions that are called from other actions, rather than directly from a UI event, can have outputs.
Q15 What is server action
It is logic that runs on the OutSystems server rather than in the browser. It can read and write entities, call other server actions, run business rules, and be exposed to be called from client actions, other server actions, or through a REST API. Anything involving the database has to go through a server action, the client side simply cannot touch the database directly.
Q16 What is action as a function / What is the function property of an action
When you set an action's Is Function property to yes, it can be used inline inside an expression the same way you would use a built in function, instead of being called as a separate node in the flow. It has to behave like a pure calculation, given the same inputs it returns the same single output, without side effects on the screen.
Q17 Can an action as a function have multiple Output parameters
No. It can only ever have one.
Q18 If an action as a function can not have multiple Output Parameters, why
Because it is meant to slot into an expression the same way a formula does, and an expression can only evaluate to one value at a time. If you need multiple pieces of data back, you call it as a regular action in the flow instead of as a function, and read each output parameter separately from the flow node.
Q19 What is the difference between server action and service action
A server action lives and runs inside your own module. A service action, which is an ODC concept, is a public action exposed by a different app and consumed almost like a lightweight REST call. It creates what OutSystems calls a weak dependency between the two apps rather than a hard compile time dependency, which matters a lot for how independently the two apps can evolve.
Q20 If I add a new attribute in service action, will I require to refresh the consumers
No, and this is actually one of the nicer things about the weak dependency model. Because the consumer talks to the service action almost like a REST call rather than compiling directly against it, a change on the producer side takes effect immediately for every consumer without them needing to be republished.
Aggregate and Data Action
When the visual query builder is enough, and when it isn't.
Q21 What is difference between Aggregate and data action
An Aggregate is the visual, declarative way to query data, you drag entities in, set filters, sorting and joins through the UI and OutSystems generates the SQL behind the scenes. A Data Action is what you reach for when the query is too complex for that visual model, it can wrap Advanced SQL, call stored procedures, or combine multiple queries and in memory logic that an Aggregate alone cannot express.
Q22 When you would use aggregate and when Data action
Aggregate covers the vast majority of day to day screens, simple lists, filters, basic joins between related entities. You move to a Data Action when you genuinely need something the Aggregate cannot do, complex multi table joins with database specific functions, heavy performance tuning, or logic that has to combine several queries with conditional branching in between.
Q23 How you would apply an In condition in an Aggregate
You build the filter expression comparing the attribute against a list of allowed values, commonly using something like ListIndexOf against a Record List, or chaining OR conditions if the list is small and known. There is no literal IN keyword box in the Aggregate editor, so you express it through the filter expression logic instead.
Q24 What is only with, with or without, and With Join conditions in Aggregate
With is an inner join, it only returns records where the related entity actually has a match. With or Without is a left outer join, it keeps the base record even if there is no related match, filling the related columns with nulls. Only With filters the base entity down to records that do have a related match, but without pulling in the related entity's own columns, it behaves like a semi join used purely as a filter.
UI Design
Composing reusable UI without fighting the framework's own CSS cascade.
Q25 What is On after fetch property of Aggregate and Data action
It is a hook that runs right after the query executes but before the data is handed back to whatever called it. You use it to apply extra in memory filtering, transformation, or enrichment on the fetched records, things that would be awkward or impossible to express purely in the database query itself.
Q26 Can we change the Grid column count from 12 to 14, if yes how
No, not in a supported way. OutSystems UI is built on a Bootstrap style 12 column responsive grid and that number is baked into the framework's CSS. You can technically override it with custom CSS to force more columns, but you would be fighting the responsive framework and it tends to break on mobile breakpoints, so it is not something I would ship.
Q27 What are the CSS best practices
Keep it disciplined:
- • Lean on the existing Style Guide and built in classes and CSS variables before writing anything custom
- • Scope custom CSS at the block or screen level, not a global stylesheet
- • Avoid inline styles and avoid reaching for important as a quick fix
- • Keep colors and spacing consistent with the app's design system
Q28 If there is a Screen and a block inside screen, screen is having a CSS designed, block is also having its own CSS defined, which css will load first and which CSS take the highest precedence
The screen's CSS loads first because it is the outer container being rendered. The block's CSS loads after it since the block renders inside the screen. Given equal specificity, whatever loads later in the cascade wins, so the block's CSS generally takes precedence over the screen's CSS for the elements inside that block.
Q29 Can we call a web-block inside another web-block
Yes, nesting web blocks inside other web blocks is fully supported and is actually a common pattern for building composable UI, a card block might contain a smaller tag block inside it, for example.
Q30 There a web-blok which fetched data based on category selection from the screen, we want to update the web-block data when user change the category, what is the way
Pass the selected category into the block as an Input Parameter. When the category changes on the screen, you set that input parameter and refresh the block so it re-fetches its data using the new value. In practice this means wiring the screen's category change event to update the block's input and trigger its refresh, rather than trying to reach into the block's internal aggregate from the screen directly.
Q31 Can a web block trigger multiple event
Yes, a single web block can define and expose more than one distinct event to whatever is consuming it.
Q32 Can a web block trigger multiple events one after another
Yes, within its own internal logic flow a block can fire one event, continue processing, and then fire another, they do not have to be mutually exclusive.
Q33 Give me a scenario where you will use web blocks
A product card that shows the image, price and an add to cart button, reused across a search results page, a category page and a recommendations widget. Each block manages its own internal state and logic, but the screens using it just drop it in and pass a product identifier.
Database
Relationships, indexes and the rules that keep child records from going orphaned.
Q34 What is referential Integrity Rules
These are the rules, Delete, Protect or Ignore, that OutSystems applies to a relationship between two entities to control what happens on the child side when the parent record is deleted. They exist so you do not end up with orphaned child records pointing at a parent that no longer exists, which is a common source of subtle data corruption if left unmanaged.
Q35 When to use delete rule, and when to use protect rule give a real life scenario
Use Delete when the child record has no meaning without its parent, an OrderLine cannot exist without its Order, so deleting the Order should cascade and remove its OrderLines automatically. Use Protect when the parent must not be deletable while dependents still exist, you do not want someone accidentally deleting a Customer record while that customer still has open Orders sitting in the system, Protect stops that deletion and forces the dependents to be handled first.
Q36 There is a table Category What is the difference between CreatCatgory and CreateOrUpdateCategory action
CreateCategory always inserts a brand new record and will fail or create a duplicate if you accidentally call it twice with the same intended identity. CreateOrUpdateCategory checks the Id you pass in, if it is zero or not provided it inserts a new record, if a valid existing Id is passed it updates that record instead, this is the classic upsert pattern and it is safer to expose to a caller that might not know whether the record already exists.
Q37 There is table Category what is the difference between GetCategory and GetCategoryForUpdate action
GetCategory is a plain read, you get the current values and that is it. GetCategoryForUpdate reads the record while also preparing it for a safe update later, it typically returns the optimistic locking information the platform needs so that when you save changes, it can detect if someone else modified the record in between your read and your write, and stop you from silently overwriting their change.
Q38 When to use Aggregate and when to use Advanced SQL
Aggregate first, always, because it is maintained visually and OutSystems keeps the generated SQL efficient and in sync with your entity model automatically. You drop down to Advanced SQL only when you hit something Aggregate genuinely cannot express, complex multi table joins with database specific syntax, window functions, or a query that needs serious performance tuning that the Aggregate's generated SQL cannot achieve.
Q39 What is Expand Inline property of advanced SQL
It lets you bring a related entity's attributes directly into the output structure of your Advanced SQL query, as if they came from the same query, without writing a separate follow up query to fetch them. It is mainly a convenience for structuring nested output cleanly.
Q40 What is the difference between count and length property of an Aggregate
Count asks the database directly for the number of matching rows without actually pulling the row data into memory, so it is fast and cheap even against a huge table. Length is a property of the record list you already fetched, it just tells you how many records are sitting in memory after the fetch happened. If you only need a number and not the records themselves, Count is the better choice.
Q41 When to use Count and When to use Length
Use Count when you need a total and do not need the actual data, for example showing how many pending orders exist without displaying them. Use Length when you have already fetched the list for another reason and just need to know its size while you are working with it.
Q42 How DB Transaction works in OutSystems
Every server action runs inside an implicit database transaction managed by the platform. If the action completes its flow without hitting an unhandled exception, the transaction commits and all the changes made during that action are saved together. If something throws an unhandled exception partway through, the platform automatically rolls back everything that happened in that action, so you do not end up with half saved data.
Q43 What is Indexing
An index is a separate structure the database builds on top of one or more columns so it can find matching rows quickly instead of scanning the entire table. It speeds up reads and filtering significantly, at the cost of a bit of extra storage and slightly slower writes since the index has to be kept up to date.
Q44 What happen when we Index an attribute
Queries that filter or sort on that attribute get noticeably faster because the database can jump straight to the relevant rows instead of scanning the whole table. The trade off is that every insert or update touching that attribute now also has to update the index, so write operations get a little slower and the table takes up more storage.
Q45 What is clustered index and non clustered index
A clustered index physically determines the order the table's rows are stored on disk, and a table can only have one, it is almost always built on the primary key. A non clustered index is a separate lookup structure that points back to the actual rows rather than storing the data itself, and a table can have many of them, one for each column or combination of columns you frequently query on.
Q46 What is one to one mapping give realistic example
Every record on one side maps to exactly one record on the other side, and vice versa. A common example is Employee and EmployeeConfidentialDetails, where the sensitive salary and personal data is kept in a separate entity linked one to one with the main Employee record, often for access control reasons.
Q47 What is one to many mapping give realistic example
One record on the parent side can relate to many records on the child side, but each child belongs to only one parent. Customer and Orders is the textbook case, one Customer can place many Orders over time, but each individual Order belongs to exactly one Customer.
Q48 What is many to many mapping give realistic example
Records on both sides can relate to multiple records on the other side. Students and Courses is the classic example, a student can be enrolled in many courses and a course can have many students, and you resolve this with a junction entity, StudentCourse, that holds a foreign key to both sides.
Q49 How we would move a table from one module to another in OutSystems, what are the best practices
Create the entity fresh in the target module, usually a shared Foundation or Core module, publish it there and expose it as public. Then go through every consumer of the old entity and repoint their references to the new location, checking the Architecture Dashboard for anything you missed. If there is live data, plan the migration carefully, you generally want to migrate the data across before cutting consumers over, and avoid a window where both copies exist and can drift apart.
Q50 What are the possible data types of primary key of an entity
Most commonly an auto generated Identifier, which is an integer under the hood. But you can also use Text as a primary key if you need a natural key like a code, or a GUID if you need globally unique identifiers, for example in distributed or multi tenant scenarios.
Q51 What is the difference between static entity and normal entity
A static entity holds fixed reference or lookup data that is defined and managed by developers or admins in the design environment, things like a list of Order Statuses or Country codes, and it gets compiled and deployed along with the app. A normal entity holds dynamic business data that end users create, update and delete at runtime through regular CRUD operations.
Q52 How we will make sure that the ID of the attributes remains same in all the environments for a static entity
Static entity records and their Ids are part of the entity definition itself in Service Studio or ODC Studio, so when you deploy, they get pushed identically to every environment as part of the app package. As long as nobody manually edits or reorders those records directly in a higher environment outside of the normal deployment flow, the Ids stay consistent across Development, Test and Production.
Q53 What are the database best practices
The habits that keep a data model healthy as it grows:
- • Normalize sensibly, let referential integrity rules do the work instead of manual checks
- • Index the columns you actually filter and sort on frequently, not everything blindly
- • Prefer Aggregate over Advanced SQL unless there is a real reason not to
- • Keep entity and attribute naming clear enough that a newcomer understands the model unaided
API
Consuming and exposing REST cleanly, with timeouts and headers handled on purpose.
Q54 What type of API methods allowed in OutSystems
Standard REST verbs, plus SOAP for legacy cases:
- • GET
- • POST
- • PUT
- • PATCH
- • DELETE
- • SOAP based web services, supported in O11 for older integrations
Q55 Can make API URL dynamic while consuming an API, can we have that as a parameter
Yes, the base URL does not have to be hardcoded. You can drive it from a configurable value so the same consumed API definition can point to different endpoints depending on where it is running.
Q56 What is the way to have that Dynamic respective to the environment
Store the base URL in a Site Property in O11 or a Setting in ODC, and give it a different value per environment or stage. The module code stays exactly the same, only the configured value changes as the app moves from Development to Test to Production, which is the whole point, no code change needed to point at the right endpoint.
Q57 Where we can see the API logs
In O11 you would look at Service Center's integration and traffic monitoring screens to see request and response history. In ODC the equivalent is the monitoring and traces section inside ODC Portal.
Q58 When we use onBeforeRequest give realistic scenario
You use it whenever something needs to be added to the outgoing request right before it is sent, and that something is dynamic, not static. A common case is fetching a fresh access token and attaching it as an Authorization header, since a hardcoded header on the method definition would not work for a token that expires and needs refreshing.
Q59 When we use OnAfterRequest give realistic scenario
You use it to look at the raw response right after it comes back, before the platform's normal parsing takes over. A realistic case is a third party API that returns a non standard error format in the body even on a 200 status code, you would inspect the raw response here to detect that and raise a proper exception instead of letting it silently look like a success.
Q60 How can I get the header parameters from the request header
You read them inside the OnBeforeRequest or OnAfterRequest callback using the RequestHeaders or ResponseHeaders structure that gets passed in. There are also built in functions like HeadersServer that let you inspect headers on an incoming request your own app is exposing.
Q61 What are the different ways to set the header parameters while consuming the API
Three ways, depending on how dynamic the value needs to be:
- • Static headers directly in the Method Headers configuration
- • Dynamic headers at runtime inside the OnBeforeRequest callback, like a refreshed token
- • Lower level control through OnBeforeRequestAdvanced with custom code, for things like client certificates
Q62 How you will handle timeout while consuming APIs
Set an explicit Timeout value on the REST method rather than relying on the default, especially for slow third party services. Wrap the call in proper exception handling so a timeout does not crash the flow, and depending on the criticality of the call, add retry logic with a sensible backoff rather than retrying instantly in a loop.
Q63 What is the best practice associated to consuming third party APIs
Four habits that save you the 2 AM incident:
- • Always set explicit timeouts, never trust the default blindly
- • Wrap every external call in exception handling with logging
- • Never hardcode credentials or URLs, keep them in Site Properties or Settings
- • Respect the provider's rate limits
BPT and Timers
Human driven workflow versus unattended background jobs, and when each earns its place.
Q64 What is BPT
Business Process Technology is OutSystems' visual engine for modeling long running processes that involve human steps, approvals and decisions spread across time, sometimes days or weeks. Instead of coding all the state tracking and task assignment yourself, you model the process as a flow with activities, and the platform handles task creation, assignment and tracking for you.
Q65 Is there anything we can not do programatically and only can do via BPT? if no, they why we require BPT at all
There is nothing that is strictly impossible to build by hand, you could code your own workflow engine with tables tracking state and a screen listing tasks. But BPT gives you that entire infrastructure out of the box, task inboxes, deadlines and escalations, a visual representation of where every instance of the process currently sits, and an audit trail, all without you building and maintaining it yourself. For anything involving human approval steps that stretch over time, it saves a genuinely large amount of custom development.
Q66 How you will handle timeout in BPT call
You add a Deadline or Timer activity to the specific process step that has a time limit, so if the assigned person does not act within that window, the process automatically escalates to someone else, sends a reminder, or moves forward on its own depending on how you configure it.
Q67 When to use Automatic BPT and when to use timer
BPT when the process genuinely needs human involvement, approvals, or you need visual tracking of where a long running business process currently stands. Timer when it is a background job with no human decision involved, a nightly cleanup, a scheduled report generation, a batch of reminder emails, something that just needs to run on a schedule without anyone approving anything.
Q68 Why we need timers
Because some work needs to happen without a user sitting there to trigger it, scheduled reports, cleanup of stale records, syncing data with an external system every night, sending reminder notifications. Timers give you that scheduled, unattended execution.
Q69 Can we trigger a timer on a button click
Not as a true scheduled timer trigger, a timer is meant to run on its own schedule. What you typically do is pull the actual logic the timer runs into a separate callable action, then call that same action both from the timer's scheduled run and from the button click handler when you want it to run on demand, so you are not duplicating the logic in two places.
Q70 How can give a timer scheduling controle in Application to admin
Expose the timer's interval or enabled state as a Site Property or Setting that an admin screen can update, rather than something hardcoded that requires a developer to change and republish. Some teams build a small admin screen that lets an authorized user toggle timers on and off or adjust the schedule without touching Service Studio at all.
Q71 How to manage timeouts in timers
Timers have a maximum allowed execution time configured at the module or platform level, and if a timer runs long processing a huge dataset, it risks hitting that limit. The usual fix is to design the timer to process in smaller batches across multiple scheduled runs instead of trying to do everything in one long execution, picking up where the last run left off.
Q72 if a timer is running how would you stop that
You can manually abort a running timer from Service Center in O11 or from the equivalent monitoring screen in ODC Portal. For a cleaner stop that does not leave things in a half finished state, it is better to design the timer's own logic to periodically check a stop flag or status and exit gracefully on its own rather than being killed mid execution.
Deployment & Advanced OutSystems
Dependencies, environments and how a change actually reaches production.
Q73 What are the ways to deploy an application in OutSystems
A few paths depending on the platform and how automated you want it:
- • LifeTime's deployment pipeline, promoting an app from Development through Test to Production
- • Direct publish from Service Studio straight to Development for quick iteration
- • Automated CI or CD through LifeTime's deployment APIs
- • In ODC, the stage pipeline inside ODC Portal
Q74 What is the difference between hard dependency and soft reference
A hard dependency is a direct, strong reference, the consuming module is compiled against the exact element it depends on, and if that element breaks or changes incompatibly, the consumer's deployment gets blocked until it is fixed. A soft or weak reference, like consuming a service action in ODC, is loosely coupled, the consumer calls it more like a REST style interaction, so a change on the producer side does not force the consumer to redeploy.
Q75 How we can create the platform users in OutSystems
In O11 you typically go through the Users application or Service Center, or programmatically through the User_Create action if you are provisioning users from another system. In ODC, user creation happens through ODC Portal's user management screens, or through the User and Access Management REST APIs if you want to automate provisioning.
Q76 How to implement SSO in OutSystems
You configure integration with your organization's identity provider, SAML, OAuth or OpenID Connect, at the platform level, Service Center in O11 or ODC Portal in ODC. Once configured, users get redirected to authenticate against that external provider instead of using OutSystems' own login screen, and the platform trusts the identity token that comes back.
Q77 Can I bypass the OutSystems built in user entity and use my own entity
Technically yes, you can disable the built in Users mechanism and implement your own authentication and session handling. But I would only do this if there is a strong existing constraint forcing it, like a legacy identity system you absolutely cannot migrate away from, because you lose a lot of the platform's built in convenience around roles, sessions and user management by going this route.
Q78 Draw and tell me the architecture for a support ticketing application
This one really deserves an actual diagram rather than a written answer, but the shape of it would be, Foundation holding shared utilities and any external integrations like email or a CRM connector, Core holding the actual ticket business logic, creating tickets, assigning them, tracking status changes, and End-User split into two separate experiences, one screen set for support agents managing the queue and one for customers submitting and tracking their own tickets, with roles distinguishing who can see what.
Q79 Where to put Roles in OS 11 app
Roles are typically defined at the End-User layer since that is where access control to screens actually matters, and they get assigned to specific users through the Users application. Inside the app, you either restrict a screen directly to specific roles or use a Check
Q80 What type of component we can have in library module
Libraries expose reusable logic and data shapes, not UI:
- • Public server actions
- • Entities, exposed as read only
- • Structures
- • Static entities
Q81 What is the solution in OS11
A Solution in LifeTime is a way to group a set of related modules together so you can package, version and deploy them as one coordinated release unit, instead of tracking and promoting each module individually.
Q82 How can we deploy just one module
You can publish just that single module from Service Studio, or deploy it individually through LifeTime. Only that module and whatever directly depends on it get affected, LifeTime will flag consumers if the change impacts them, but you are not forced to redeploy the entire application tree just because one module changed.
ODC
Where ODC departs from O11, and how agentic apps and RAG fit into the picture.
Q83 What is the difference between ODC and OutSystems
OutSystems 11 is the mature, established platform, it runs on dot net with SQL Server as the database, and can be deployed on premises or in the cloud, structured around the Foundation, Core, End-User module layering. ODC, OutSystems Developer Cloud, is the newer cloud native platform, it runs containerized on Kubernetes with AWS Aurora PostgreSQL as the database, fully managed as SaaS, and it uses an app and library model rather than the traditional layered module structure, with user management unified into a single portal instead of separate interfaces for IT users and end users.
Q84 What is Cloud native architecture
It means the application is built as a set of independently deployable, containerized components rather than one monolith running on a fixed server cluster, and it is orchestrated, typically with Kubernetes, so it can scale horizontally on demand and recover automatically if a container fails, instead of you managing that infrastructure by hand.
Q85 What is Library application in OutSytmes ODC
A Library is a reusable, stateless app type in ODC that exposes public elements, server actions, entities, structures, for other apps or other libraries to consume. It is not deployed to a stage by itself, it gets carried along whenever an app that consumes it is deployed.
Q86 How can we define global server actions in OutSystems ODC
You build the server action inside a Library and mark it public, then any app that needs that shared logic adds the library as a dependency and consumes the action from there. Apps themselves in ODC cannot expose public server actions directly, only Libraries can, so this is really the only path to sharing logic globally.
Q87 Why we have agentic app in Outsystems why can't we just consume the LLM model API
You technically could just call an LLM's REST API directly like any other integration, but an agentic app gives you a governed structure around that call instead of a raw unmanaged one. It handles grounding data preparation, assembling the prompt and conversation history, letting the model call your own actions as tools, and it plugs into ODC's evaluation and tracing tooling so you can actually test and monitor how the agent behaves over time, rather than that all being invisible inside a plain API call.
Q88 What is Grounding data in Agentic APP in ODC
It is the business specific context you feed into the AI model alongside the user's question, sourced from your app's entities, an AI Search service, an MCP server, or even a plain REST API. You assemble it through a GetGroundingData action, and without it the model is answering generically with no knowledge of your actual data, with it the model can answer with real, current facts about your business.
Q89 How we manage timeout of Agneitc app in ODC
LLM calls can genuinely take longer than a typical server request, so ODC has specific documented handling for dealing with timeouts on AI agent calls, essentially designed around the fact that these calls are naturally slower and need different timeout expectations than a normal REST integration.
Q90 What is RAG
Retrieval Augmented Generation. Instead of relying purely on what the model learned during training, you retrieve relevant information from your own knowledge source at the moment of the question and inject it into the prompt, so the model's answer is grounded in real, current data specific to your business rather than a generic or possibly outdated answer from its training.
Q91 What are the components of RAG
Four moving pieces:
- • A knowledge source, usually a document store or an AI Search index
- • A retriever, the mechanism that finds the most relevant chunks for the current question
- • The LLM itself, which generates the actual response
- • A prompt assembly step, combining retrieved context with the user's original question
Q92 How would we consume an API which is authenticated by basic authentication in ODC
You configure the username and password for Basic Authentication directly in ODC Portal against that consumed REST API, per stage, so Development, Test and Production can each have their own credentials. Once that is set, the generated methods behave like any other server action, you do not have to manually build the auth header yourself.
Q93 What is event in ODC
It is a way for apps to communicate asynchronously without a hard dependency between them. A producer app defines an event and triggers it when something relevant happens, and any consumer app that cares can handle it through its own server action, without the producer needing to know who, if anyone, is listening.
Q94 Can we define multiple models in one Agentic APP in ODC
Yes, you can add multiple AI model connections to an app and reference different models in different agents or actions within that same app, they do not have to all use the same model.
Q95 Why ODC does not have public server actions
Apps cannot expose public server actions in ODC, only Libraries can. This is a deliberate architectural choice, it forces you to intentionally pull shared logic into a Library instead of accidentally letting apps become tangled dependencies of each other, keeping each app more isolated and independently deployable.
Q96 How would you design the login and auth flow for multiple apps
Lean on ODC's unified organization level identity and user management so all your apps share the same user base rather than each app managing its own. If you need tighter control or an external identity system, designate a single gateway, either an external identity provider or one app, that handles authentication and shares the session or token with the other apps, rather than each app implementing its own login independently.
Q97 Can ODC App have the circular dependancy
No. ODC actively detects cyclic dependencies between libraries and will not let you publish if one exists. The fix is the same idea as in O11, pull the shared piece both sides depend on into a lower, common library so the cycle is broken structurally rather than just avoided by convention.
Q98 What is the difference between Library app and Mobile Library app in ODC, why we have two
A regular Library is for general purpose and web reuse, server actions, entities, structures. A Mobile Library is a separate app type built for native mobile plugin development, giving direct JavaScript based access to native device capabilities through the Capacitor stack, and it can only be consumed by mobile apps. They exist as two separate types because mobile plugin development has different needs, native APIs, platform specific configuration, that do not fit naturally into a general purpose web oriented library.
Q99 OS11 follows 3 layer architect, What architecture ODC follows
ODC does not enforce the Foundation, Core, End-User structure the way O11 does. Instead it is organized around apps, libraries and workflows connected through strong and weak dependencies. Architects still apply similar layering discipline conceptually, keeping generic reusable logic in libraries below business specific apps, but it is not a platform enforced structure the way the three layer model is in O11.
Q100 How can we connect the different LLM model on product for the same AI Agent
You add the model connections you need under AI Models and Search Services inside ODC, then reference the specific model you want inside each agent or action within the app, so different parts of the same app can call different models if that is what the use case calls for.
Q101 How we deploy Library app in ODC
A Library is not deployed to a stage on its own, it gets published and versioned instead. An app then consumes a specific version of that library, and when the app gets deployed, the library it depends on gets carried along with it automatically.
Q102 Where to put Roles in ODC apps
Roles are defined per app inside ODC Studio as end user roles, and then managed centrally, who belongs to which role, what groups exist, through the ODC Portal's user and access management screens.