The challenge when building Virtual Users in Nimbus isn't just about building intelligent agents — it's about building the right kind of intelligence. In the pursuit of efficient, scalable and secure customer service experiences, simplicity and focus often outperform complexity.
This article collects best practices for creating Virtual Users in Nimbus, guided by three key principles: simplicity, modularity and workflow-based design. Rather than developing large, all-knowing bots, we advocate for small, purpose-built agents that handle clearly defined tasks. This "separation of concerns" makes systems more maintainable, reduces the surface area for security risks and improves performance.
By thinking in terms of workflows, starting from user intent, and prioritizing interactions based on urgency and context, Virtual Users can more accurately triage requests, automate low-value interactions, and escalate high-value ones to the right human agents. These agents should act as advisors, not decision-makers — providing data, context and next steps without replacing human judgment.
Glossary
| Term | Definition |
|---|---|
| Virtual User | AI-powered assistant that interacts directly with customers — greets the caller, captures context parameters, and hands the conversation result back to a Nimbus Workflow. |
| Bot vs. Agent Type | A Bot in Nimbus describes where the AI runs — Nimbus AI Service (Luware-hosted) or Custom AI Service (bring-your-own). The Agent Type selects the underlying technology — Azure OpenAI or M365 Copilot Direct Line 3.0. Together they decide which Profile options become available on the Virtual User. |
| Profile | Selected on the Virtual User. Decides how the bot behaves in the conversation — Intent Analyzer, AI Workflow or Open Profile. Hidden for Copilot bots (the conversation is fully driven by the Copilot Studio Agent). |
| Tools | Web Requests and MCP Servers attached to the Virtual User. Available on AI Workflow and Open Profile. |
| Outcomes & Tools Instructions | Per-Virtual-User playbook that tells the model how to drive the conversation toward its outcomes and when Tools are involved. |
| Generative AI | Systems that create new content (text, audio) by learning from existing data. |
Benefits & Challenges
Using Bots as Virtual Users in your workflows brings clear benefits, but also challenges.
| Benefits | Challenges |
|
|
Choosing your AI
Where a human would apply judgment, pattern recognition or creativity, you have to decide which kind of AI to throw at the problem. Not all AI is the same — and the right choice depends on the task.
| Aspect | 👓 Non-Generative AI | ✍ Generative AI | 🧠 Orchestration |
|---|---|---|---|
| Core Function |
Classify, recognize, recommend Structured tasks like classification, routing or scoring using predefined logic or trained models. |
Create, personalize, react flexibly Creates new content — summaries, responses, translations — using large language models. |
Delegate, coordinate, contextualize Orchestrates tools, agents and AI models to decide what to do and in what order. |
| Behavior | Deterministic rules or trained models return specific outputs. | Human-like responses based on context and user input. | Decides which AI component to invoke, when and how. |
| Nimbus mapping | Intent Analyzer profile. | AI Workflow profile (with optional Tools) and Open Profile. | Copilot Studio agents (Direct Line 3.0), and Generative orchestration in Copilot Studio when enabled. |
| Strengths | Precision, reliability, speed | Creativity, adaptability, personalization | Flexibility, scalability, coordination |
| Limitations | Limited to predefined tasks. Cannot go off-script. | Can produce incorrect responses. May hallucinate. | Adds latency. Complexity can slow performance and complicate monitoring. |
✅ How to approach the choice
☝ GenAI (with or without Orchestration) can cause noticeable delays — customers experience them as pauses or silence during the interaction. Test the experience end-to-end before committing.
In Nimbus, we want to use controlled generative AI — combining deterministic with non-deterministic logic.
- Prefer Intent Analyzer for any task that is "really just routing".
- For AI Workflow / Open Profile, keep Tools narrow and the Outcomes & Tools Instructions short and explicit.
- For Copilot Studio, enable generative AI only in single Topics rather than globally — this acts as a control mechanism.
- Add additional topics for human hand-over when an approval is needed.
- Test thoroughly before going to production — customers can get equally creative.
Privacy, Security & Cost
Conversations
Conversation Privacy
☝ Keep in mind: the conversation between a customer and a Virtual User can contain private or sensitive data.
Output from Bots can be mapped to Parameters that appear in Sessions List and My Sessions. When Context Handover is enabled, these parameters can travel across multiple Nimbus services. Nimbus deletes session parameter data after the retention period described in our Documents whitepapers; permanent storage is the customer's / administrator's responsibility.
💡 Good to know: Nimbus itself does not store the exchanged conversation messages or parameter data in any log file.
💡 Tools: when the Virtual User calls a Web Request or MCP Server, the request payload and response stay between Nimbus and the external system. Treat those systems with the same data-handling discipline as any other integration.
Permissions
Bot Permissions
☝ Keep in mind: a bot can be coaxed into divulging customer data when asked correctly.
It is tempting to point an AI at a large dataset and let it answer anything. Real-world incidents have shown that even sophisticated bots can be "convinced" to reveal sensitive information. Limit permissions and accessible data as much as possible.
💡 Hint: use the Nimbus Power Automate Connector to fetch data (CRM, repositories, external systems) and provide it as Parameters — correct, scope-limited and up-to-date, with access privileges under Administrator control.
💡 Tools — least-privilege scoping: when you attach a Web Request or MCP Server, give it the narrowest possible scope. Read-only beats read-write; one record at a time beats bulk; bind credentials at the Authentication record (rotatable in one place) rather than embedding them per Virtual User.
Running Costs
Running Costs — Third Parties
☝ Keep in mind: everything a Virtual User does is tied to a cost — a little like with employees. Re-check the pricing of your external AI suppliers regularly.
The Virtual User is meant to drive down operational costs — but the AI itself isn't free. Some points worth thinking through:
- AI vs. plain automation — does this task really need a language model, or can a deterministic flow handle it?
- Generative vs. non-generative AI — classification (intent recognition) is cheaper and more predictable than free-form generation.
- Nimbus AI Service vs. BYO Azure OpenAI — Nimbus AI Services are managed by Luware, with no additional hidden cost per-call, e.g. in your Azure billing (also see Note below).
- Profile selection — Intent Analyzer is the cheapest end-to-end (short, focused prompts). Open Profile with Tools is the most expensive and slowest. Pick the simplest profile that fits.
Disclaimer: Support for Azure Billing & Cognitive Services
☝ The usage of Microsoft Azure AI Services for Speech1 and AI2 will cause additional costs outside your Nimbus subscription, which are exclusively determined by Microsoft.
Please note:
- Nimbus Support does not cover pricing discussions or make recommendations on Microsoft Azure Services. → Please inform yourself via the references below on pricing models.
- Nimbus Support can not provide any technical help, insights or solutions on Azure Cognitive Service related technical problems.
1 Azure Speech Services: https://azure.microsoft.com/en-us/pricing/details/cognitive-services/speech-services/
2 Generative AI Services (Copilot Studio):
Picking your Profile
The single most consequential decision when building a Nimbus Virtual User is the Profile. Each Profile has a sweet spot and a set of guardrails — picking the right one saves you from fighting validation rules later. The configuration scenarios below the matrix show which fields each choice needs.
Comparison
| Defined in Bots | Defined in Virtual Users | |
|
Type Nimbus managed or BYO |
AI Service Underlying LLM |
Virtual User Profile Pre-built configurations to fulfill a certain use case |
| Nimbus AI Services | Azure OpenAI GPT Realtime1 |
|
|
Custom AI Services
|
|
|
| M365 Copilot Direct Line 3.0 |
|
|
Notes
1 Due to Microsoft Azure AI foundry availability in limited regions, data processed by a Nimbus Virtual User “GPT”-Realtime" integration might temporality leave a cluster due to failover scenarios:
- Nimbus Cluster DE01, DE02, CH01, CH02, UK01, EU01, AU01 computation will be primarily performed in Sweden Central region.
- Nimbus Cluster US01 computation will be primarily performed in the US East region.
Configuration Scenarios
Scenario Comparison
A Virtual User is configured on three tabs: General, Behavior and Outcomes & Tools. The Bot and Profile you pick on the General tab decide which fields appear on the other tabs. Pick the scenario that matches your use case, then check the topics below it.
Route the caller
Route the caller: Intent Analyzer
Finds out what the caller wants, asks for missing details, confirms them and ends with the matching outcome. Your Workflow then routes the call. This profile does not use external tools.
| Tab | What to configure |
|---|---|
| General | Bot: any Nimbus AI Service or Custom AI Service Bot. Profile: Intent Analyzer. |
| Behavior | General Instructions: your company, the purpose of the call and what is out of scope. Then Messages, Timeouts (defaults: 180 s session, 45 s inactivity) and Voice & Language. |
| Outcomes | For this profile the tab is called Outcomes. Fill in Outcomes Instructions, then add one outcome per routing target with This outcome triggers an exit enabled. |
💡 The profile already confirms details with the caller and steers off-topic callers back. Don't repeat these rules in your instructions.
Self-Service
Self-Service: AI Workflow
Collects and confirms the details it needs, uses a Web Request or MCP Server to look something up or carry out an action, tells the caller the result and ends with an outcome. If a request can't be done with the tools you added, it ends with the AI Fallback.
| Tab | What to configure |
|---|---|
| General | Bot: any Nimbus AI Service or Custom AI Service Bot. Profile: AI Workflow. |
| Behavior | Same fields as for routing. Timeout defaults: 360 s session, 45 s inactivity. |
| Outcomes & Tools |
|
💡 The profile already repeats collected values for confirmation, checks the spelling of names and emails, and takes long numbers in parts.
Flexible Setup
Flexible Setup: Open Profile
Minimal preset prompting for more flexibility: you write the persona, style and rules yourself. Use it only when Intent Analyzer or AI Workflow can't do the job.
| Tab | What to configure |
|---|---|
| General | Bot: Custom AI Service only. Profile: Open Profile. |
| Behavior | As for AI Workflow, plus Persona: Verbosity and Tone. Describe who the assistant is in the General Instructions rather than in the deprecated Role field. |
| Outcomes & Tools | As for AI Workflow. |
Add the rules the other profiles bring, one sentence each, if you need them:
- Confirm: "Before calling a tool, repeat the collected values and wait for a yes."
- Collect clearly: "Ask for one value at a time. Take long numbers in groups and confirm each group."
- One language: "Speak only in the current language, including short acknowledgments."
- No goodbye: "Never say goodbye or announce a transfer. A closing message plays automatically."
Copilot Studio agent
Copilot Studio agent
Your agent and its logic already live in Copilot Studio. Nimbus only connects the call to it.
| Tab | What to configure |
|---|---|
| General | Bot: a Copilot Direct Line 3.0 Bot. Instead of a Profile, pick a Bot Response Template, which maps the agent's answer to your Workflow. Under Modalities, a Speech Recognizer is required. |
| Behavior | Only Messages. Instructions, voice and language come from Copilot Studio and the Speech Recognizer. |
| Outcomes & Tools | Not used. Exits come from the Copilot topics through the Bot Response Template. |
☝ Speech-to-text adds noticeable delay. Prefer this option when natural conversation isn't the main requirement.
FAQ
What goes where
💡 Keep in mind: Write it once, where it belongs. When the same rule sits in two fields, the two versions can drift apart.
| Field | Put here | Keep out |
|---|---|---|
|
General Instructions (Behavior, up to 10,000 characters) |
Who the company is, what the assistant is for, which services exist, what is out of scope. | Tool names and order, greetings, goodbyes. |
|
Initial / Final Message to Customer (Behavior, up to 500 characters each) |
The exact words spoken at the start and at the end. | Instructions to the model. They are spoken as written. |
|
Outcomes & Tools Instructions (Outcomes & Tools, up to 5,000 characters) |
When to call each tool, in which order, which depends on which, what to do when one fails, and which outcome ends the call. | Company background, persona. |
|
Instructions of an outcome, Web Request or MCP Server (up to 1,024 characters each) |
When to use this one item, in one or two sentences. | The order between tools. |
💡 Parameters can be used as placeholders in the instructions and messages. They are filled in when the session starts.
Messages, timeouts and silence
💡 Keep in mind:
- Messages are spoken word for word, in the language active at that moment. The model doesn't add to them and doesn't remember them as part of the conversation.
- Don't script a greeting or goodbye in the instructions. The caller would hear it twice.
- Keep the Final Message neutral, e.g. "Thank you, one moment please." It plays after the outcome is chosen, so it can't know what happens next in the Workflow.
| Timeout | Default | Range | When reached |
|---|---|---|---|
| Max Session Duration | 180 s (Intent Analyzer) 360 s (other profiles) |
30–1,800 s | A fixed end message plays and the Workflow continues on the Idle Timeout exit. |
| Inactivity Timeout | 45 s | 5–3,600 s |
🤫 When the caller goes quiet, the Virtual User speaks up after 10 seconds and again after a further 10 seconds, e.g. by asking whether the caller is still there. If there is still no reply, the Idle Timeout exit is taken once the Inactivity Timeout has elapsed; both attempts count toward it. The 10-second interval is fixed and cannot be configured. While a tool is still running, the wait doesn't count, so a slow tool never ends the call.
Language and voice
💡 Keep in mind:
- Start language: the Language field sets the language the Virtual User starts in.
- Switching: it changes language only when the caller explicitly asks, e.g. "Can we continue in French?". It never switches because of an accent or a foreign word.
- No own language rules: all profiles handle switching already. Additional rules compete with them. If you want callers to choose, add one line such as "After the greeting, ask whether the caller prefers English or French."
- Voice: stays the same for the whole call. With Azure Voice Live Bots, the voice list depends on the selected Language.
Outcomes and Tools
Your AI gets more effective when you expand the capabilities with external tools. When the bot's job involves calling an external system, the way you describe each tool decides whether the model uses it well, ignores it, or misuses it.
✅ Three-sentence template for the tool instructions:
- What it does — "Looks up an order by order number in the e-commerce backend."
- When to call it — "Call this whenever the caller asks about the status, delivery date, or contents of a specific order."
- What you'll get back — "Returns the order status, expected delivery date and line items, or an empty result if the order number is unknown."
💡 Keep in mind:
- Tools must exist first: only mention tools that are actually added. A rule about a missing tool confuses the model and may lead to failed workflow outcomes.
-
One tool, one job. A
customer_lookupand a separateorder_lookupare far easier for the model to reason about than one omnibuscustomer_or_order_lookup. -
Exact names: the model sees names in lowercase with spaces replaced by
_and special characters removed ("Check Balance!" becomescheck_balance). Use that form in your instructions. - Tool Instructions are what the model sees. Each Web Request and MCP Server added to a Virtual User has its own Instructions field. The model does not see the generic Description of the Web Request or MCP Server configuration item.
- Read-only first. If a tool can both read and write, start read-only and add write capability only once the read path is validated.
- Confirm before destructive actions. Encode "confirm with 'yes' before you make the change" rules in the Outcomes & Tools Instructions for any write-capable tool.
- Parameters: attach up to 10, and only what the next Workflow step needs. Give each Parameter its Virtual User Instructions. A warning icon shows on outcomes where they are missing.
-
Outcome Name: a short verb phrase, e.g.
route_to_billing, up to 64 characters. Names must be unique across outcomes and tools. -
Failure handling lives in the activity, not the prompt. Tool errors take the Failed exit of the Add Virtual User activity — you don't need to write fail-safe branches into every instruction step. Reserve the prompt for graceful behavior (apologize, offer a transfer) once a tool returns an empty result.
- Exit or not: enable This outcome triggers an exit for results that end the call. Leave it off for steps that only collect or return information.
- AI Fallback: always added automatically. It is taken when nothing fits the request, the caller stays off topic, or data collection keeps failing.
☝ IMPORTANT — descriptions can leak. Anything you put into a Web Request name, its Instructions or an MCP Server name is shown to the language model — and the model can be coaxed into repeating it. Don't put secrets, internal URLs or confidential context there.
Chaining Virtual Users
💡 Keep in mind:
- When one Virtual User's exit leads to another later in the Workflow, the second one starts a brand-new conversation.
- Good fit: clearly separate phases (identify the caller, then handle the request), or a non-AI step such as a queue in between.
- Avoid: splitting one task just to keep instructions short. The pause and the lost context usually cost more. One Virtual User with more outcomes often does the job.
- If you chain: save everything later steps need as Parameters, keep later greetings short, and test the whole chain end to end. Each Virtual User needs its own license.
| Carries over | Is lost or restarts |
|---|---|
|
|
Troubleshooting the Failed exit
💡 Keep in mind: When the Add Virtual User Conversation Handling Activity takes the Failed exit, check:
- Data Privacy Tenant Settings : the Virtual User is allowed for the tenant and its data privacy consent is given.
- License Management: the Virtual User has an active license assigned on its General tab.
- Profile and Bot: the Bot supports the profile, e.g. Open Profile needs a Custom AI Service Bot.
-
Exits: every exit outcome of the Virtual User is mapped on the activity.
💡 Calls that end early or lose their connection to the AI service also take the Failed exit.
Examples
💡 The examples below cover the most common task shapes across the Virtual User Profiles and Copilot Studio. For technical details and step-by-step instructions, head to our AI Use Case Category.
Example A: Order Status Bot (AI Workflow + Web Request)
Example A: Order Status Bot — AI Workflow profile with a single Web Request
A Virtual User on the AI Workflow profile, with one Web Request, Order Lookup, added and Web Requests enabled. The model sees it as order_lookup, so the Outcomes & Tools Instructions use that name:
1. Ask the caller for their order number. 2. Call order_lookup with the order number provided. 3. If order_lookup returns a result, read back the order status and the expected delivery date. 4. If order_lookup returns no result or an error, apologize and end with the transfer_to_agent outcome. 5. After confirming the status, ask whether there is anything else. If not, end with the status_given outcome. Never invent an order status. Only state what order_lookup returns. |
- Workflow exits: status_given → Disconnect. transfer_to_agent → Queue. AI Fallback → Queue (the Fallback Parameter carries the AI's summary). Failed → safe fallback (Queue / Voicemail). Idle Timeout → Voicemail.
- Final Message to Customer: "Thank you, one moment please."
🔎 Full step-by-step: Use Case - Integrating Nimbus Virtual Users with External Systems.
Example B: Callback Assistant (Copilot)
Example B: Automated Callback Assistant
An Agent called "Callback Assistant" recognizes the customer's intent to request a callback. It can…
- … check if a call has already been scheduled for a phone number and inform the customer about the details.
- … schedule a Nimbus Outbound Call in the future, e.g. by using the Power Automate Connector and Flow Actions.

🔎 Full step-by-step: Use Case - Building a Callback Assistant in Copilot.
Example C: Customer Feedback Agent (Copilot)
Example C: Customer Feedback Agent
An Agent called "Customer Feedback Agent" checks in at the end of a call to ask about service satisfaction. It can…
- … recognize and categorize feedback (sentiment, topic, suggestions) and …
- … send the feedback to the survey backend system.
The Copilot does not need general AI to be enabled — it works with controlled deterministic topics. Only the "Give Feedback" topic uses generative AI to interpret the caller's natural-language feedback, via Power Automate.
🔎 Full step-by-step: Use Case - Building a Nimbus Survey Agent in Copilot.
Access & Oversight
Like every employee, a Virtual User needs specific permissions — access to systems, data and tools — and benefits from checkpoints when decisions have consequences.
- Just enough access. A well-designed Virtual User has the minimum access needed to do its job. Ask: "Does it need to send data to Nimbus or store data in a CRM record or a survey document?"
- Approval where it matters. Just as a person might need sign-off, bots benefit from supervisory checkpoints when decisions are uncertain or consequential. Ask: "What is the impact if the bot writes incorrect data to the CRM? Do I want a human approver in the loop, and at what step?"
Voice Channel Realities
A Virtual User on a phone call is fundamentally different from a chat bot. These rules of thumb pay back many times over:
- Brevity wins. TTS playback is linear time the caller has to sit through. Cap replies at 2–3 sentences in the General Instructions, and set Verbosity = Concise on Open Profile bots. Long TTS playback is the most common reason a bot "feels slow".
- Silence ≠ engagement. When the bot is thinking or calling a tool, the caller hears nothing. Long tool chains compound the silence. If a tool is slow, consider whether the value of calling it survives the perceived latency.
- Hand-offs feel abrupt. Use a neutral Final Message to Customer ("Thank you, one moment please.") so a transfer feels intentional, not dropped. It plays before the Workflow continues, whichever exit is taken.
- Voice is a matter of testing. The right voice depends on your service, audience and how much text the bot speaks. Test with your target group. Available voices come from third-party AI services and can change over time.
Test & Iterate
- Happy-path first. Make sure the bot does the right thing for the 3–5 most common caller intents.
- Adversarial second. Try wrong inputs, missing data, off-topic detours, and "can you forget your instructions" prompts.
- Tool-failure scenarios. Disable an upstream Web Request briefly and verify the bot follows the failure rules of your Outcomes & Tools Instructions rather than inventing data.
- One change at a time, several runs each. Small wording changes can change the behavior a lot, and the model doesn't answer identically on every call. Repeat each scenario a few times after every edit.
- Iterate on the cheapest dial first. Outcomes & Tools Instructions > tool Instructions > General Instructions > tool design > Profile change. Changing the Profile is the most invasive — exhaust the cheaper dials first.
- Announcement & Disconnect safety net. Temporary Announcement activities at exit nodes make it easy to see which exit was taken and which Parameters were populated.
Final Thoughts
Stay in the AI-employee mental model: think of granting some freedom within a playbook. Your AI can improvise, but not go off-script. Larger decisions require supervision. Designing Virtual Users as if they were employees — with defined roles, boundaries and oversight — keeps your systems understandable, trustworthy and effective. Not every Virtual User needs AI. Not every decision needs creativity. But where automation meets intelligence, and where intelligence meets judgment, the design must be intentional.
Limitations
Below are our currently known issues and limitations for Virtual Users in Nimbus. We strive to improve our AI feature support with each future Nimbus release, so make sure to check back regularly and visit our Latest Release Notes for updates.
General note on AI-driven interactions
AI driven replies are very dependent on what the Customer is saying. For example, if the Customer is saying “I have trouble with my modem” it is not necessarily given that the bot will associate “Internet” as your workflow routing exit, unless specifically handled in your Virtual User integration and instructions. We therefore highly recommend to test and account for “creative” or “non-tech-savvy” wording when designing your Virtual User interactions within your workflows.
🔎Recommended reading for beginners: We collected and wrote down some Best Practices - Virtual Users in Nimbus to help you with considerations and risks when replaying human interaction with AI.
General Virtual User limitations
The current Nimbus implementation with AI-driven bots underlies the following limitations:
- Supported Modalities: Virtual Users (Bots) are currently available for Audio/Video modality tasks.
- Virtual User Reporting: Sessions involving Virtual Users are not reflected as dedicated User Session. Virtual User session reporting is planned for a later point this year.
Microsoft Copilot Limitations
- Expect processing delays: Processing AI answers takes a few seconds for voice-to-text-transcription, followed by AI processing and then the same transcription back into a voiced response. Luware is trying to minimize the delay on Nimbus call infrastructure, but the dependency on external APIs will always incur this delay. The Customer will hear silence during this processing and no audio feedback / silence detection.
-
Ensure you have no ambiguity in your topics. For instance, the word “
Service” may be too generic if you want to transfer to different services. Rather usehealthcare|medical|emergencyas identifiers or use more complex Regular Expressions to identify replies.
Nimbus AI Services Limitations
| Bot Configuration Profile | 🔎 Design Notes (not limitations) |
|---|---|
| AI Workflow |
|
| Open Profile |
Virtual User Configuration Assistant (Companion) Limitations
- Nimbus AI Services only: The configuration assistant can only create and update bots and Virtual Users for Nimbus AI Services. Bots of type Custom AI Services must be configured manually.
- Tools: Tools for the AI Workflow profile are limited to Web Requests. MCP tools aren't supported yet. The Web Requests must already exist. If they don't, Companion offers to save your progress so you can create them manually.
- Permissions: If you don't have the permissions to create or update Virtual Users, the organization unit drop-down menu in the form is empty. No further message explains this.
- Language: Companion doesn't ask for a language. New Virtual Users are created with English as the default language.