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). |
| Extension Tools | Web Requests and MCP Servers attached to the Virtual User. Available on AI Workflow and Open Profile. |
| Flow Description | Per-Virtual-User playbook that tells the model how to drive the conversation when Extension Tools are involved. |
| Generative AI | Systems that create new content (text, audio) by learning from existing data — e.g. GPT, Copilot Studio. |
| Non-Generative AI | Systems that analyse and classify existing data without generating new content — e.g. intent recognition. |
Benefits & Challenges
Using Bots as Virtual Users in your workflows brings clear benefits, but also challenges.
| Benefits | Challenges |
|
|
Privacy, Security & Cost
Data Privacy — Conversations
☝ 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 logfile.
💡 Extension 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.
Data Security — 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.
💡 Extension 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 — Third Parties
INC Azure Billing Cognitive Services
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):
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 Service is Luware-managed, no per-call AI cost to Azure on top.
- Profile selection — Intent Analyzer is the cheapest end-to-end (short, focused prompts). Open Profile with Extension Tools is the most expensive and slowest. Pick the smallest tool that fits.
💡 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.
Pick 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.
INC Language Model Comparison Matrix
| Defined in Bots | Defined in Virtual Users | |
|
Type Nimbus managed or BYO |
Agent Type Underlying LLM |
Virtual User Profile Pre-built configurations to fulfill a certain use case |
| Nimbus AI Service | Azure OpenAI1 |
|
|
Custom AI Service
|
|
|
| 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 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.
✅ Quick decision
- Just routing? → Intent Analyzer.
- Needs to call an API or knowledge tool? → AI Workflow.
- Already living in Copilot Studio? Copilot (Direct Line 3.0) ☝️Has longer voice to text processing delays. Only pick when natural language conversation isn't a requirement.
- None of the above fit? Open Profile — expect more design and testing work.
Design Principles
When building Bots as the "engine" behind your Virtual User, treat them as employees, not as pieces of software. Each bot should have:
- A clear role.
- A clear set of task responsibilities and the skills required to fulfil them.
- A defined level of autonomy with limited permissions on a "need to know" basis — just like a person on a team.
This simple mental model keeps your bot design maintainable, controllable and purpose-driven.
💡 Naming & Maintenance: name your Nimbus Bots and Virtual Users consistently with the underlying agent (Copilot Studio agent, Azure OpenAI deployment, MCP Server) they wrap. Otherwise it gets hard to tell which external thing a Nimbus configuration is actually pointing at.
Start with the Role
Before configuring anything, ask: What job will this Virtual User do?
- Is it answering questions? What kind, and how broad is the topic?
- Does it need specific data? List the data points needed and where they live.
- Can you anticipate the caller's wording? What synonyms might come up for the same intent?
- Tickets? Create, look up, update?
- Escalation or transfer? When and to whom?
Shape the Persona
Virtual User offers several fields that together shape who the bot is and how it speaks. The accordions below expand each with a concrete example.
System Instructions — the "constitution"
Long-form free-text guidance, capped at 10,000 characters. Available on all Profiles. Use it for hard rules the bot must never break — persona, language preferences, "must / must not" behaviours.
Keep it about who the bot is and what it must / must not do, not about which tool to call (the latter belongs in the Flow Description).
Example — front-desk insurance bot:
You are a Front Desk Operator for an insurance company.
Greet the caller by name if $(Customer.Name) is available, otherwise greet politely.
Speak in the caller's language. Keep replies to 2-3 sentences.
Hard rules:
- Never quote a policy number you have not verified through a tool.
- Never confirm a claim status from memory — always look it up.
- If the caller mentions a complaint, offer to transfer to a human agent.
Role / Tone / Verbosity — the "personality dials" (Open Profile only)
Three short labels that colour the bot's style without rewriting the System Instruction. Available on the Open Profile only — the Intent Analyzer and AI Workflow profiles use their own pre-set persona.
- Role — persona label (e.g. Customer service representative, Pharmacy advisor).
- Tone — conversational tone (e.g. Friendly and professional, Concise and factual).
- Verbosity — Concise / Balanced / Detailed. Set Concise as the default for voice channels — long TTS playback time is the single biggest cause of "the bot feels slow".
Example — order support bot:
Role: Order Support Agent
Tone: Friendly and professional, never pushy
Verbosity: Concise
Voice & Language — the “personal preference”
Picking the correct Language and Voice combination for your Virtual User may depend on various factors such as:
- The type of service you provide.
- Your target audience.
- The amount of text (and style) of your conversation topics.
💡This choice comes down to target group testing and feedback and may be very individual. Note that the combination of Virtual User supported voices & language synthesis engines depends on 3rd-party services. The selection is therefore subject to change, and models may reach end-of-life. Luware development aims to provide the widest “common denominator” selection possible for all Nimbus-supported AI services.
Flow Description — the "playbook"
Free-text field on the Virtual User, available on AI Workflow and Open Profile when at least one of Web Requests / MCP Server is on. Tells the model how to drive the conversation when Extension Tools are involved — when to call which tool, the order of execution, and how to fail gracefully.
If the bot picks the wrong tool, calls it at the wrong moment, or misuses its output, sharpen the Flow Description first. It is the cheapest dial to turn.
Example — order status bot:
1. Greet the caller and ask for their order number.
2. Call the OrderLookup Web Request with the order number provided.
3. If OrderLookup returns a result, read back the order status and the expected delivery date.
4. If OrderLookup returns no result or an error, apologise, offer to transfer to a human agent,
and end the conversation.
5. After confirming the status, ask whether there is anything else. If not, say goodbye and close.
Never invent an order status. Only state what OrderLookup returns.
Break Tasks Down
Once the role is defined, map the sequence of tasks the Virtual User needs to perform. A task can usually be broken into repeatable steps, each triggered by an event (caller input, schedule). Real processes are non-linear — conditional branches, exceptions, parallel actions — and the Virtual User should be prepared for those variations while staying within clearly defined bounds.
Examples
💡The examples below cover the most common task shapes across the Agent Profile model 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 OrderLookup bound to it and Web Requests enabled. The Flow Description tells the bot how to use it:
1. Greet the caller and ask for their order number. 2. Call the OrderLookup Web Request with the order number provided. 3. If OrderLookup returns a result, read back the order status and the expected delivery date. 4. If OrderLookup returns no result or an error, apologise, offer to transfer to a human agent, and end the conversation. 5. After confirming the status, ask whether there is anything else. If not, say goodbye and close. Never invent an order status. Only state what OrderLookup returns. |
- Workflow exits: Success → Disconnect. Fallback → Queue (the Fallback Parameter carries the AI's summary). Failed → safe fallback (Queue / Voicemail). Idle Timeout → Voicemail.
- Closing Message: "Thanks for calling — have a great day."
🔎 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…
- … recognise and categorise 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 deterministic AI, achieving the natural-language interpretation via Power Automate.
🔎 Full step-by-step: Use Case - Building a Nimbus Survey Agent in Copilot.
Extension 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 per-binding AI Description
- 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."
-
One tool, one job. A
CustomerLookup+ a separateOrderLookupis far easier for the model to reason about than one omnibusCustomerOrOrderLookup. - Name the tool the way you reference it in the Flow Description. The label the model sees on a Web Request is the Web Request's Name; on an MCP Server it is the MCP server's Name. Reuse the exact same name when telling the bot to call it.
- Web Requests vs MCP Servers — where the description lives: Web Requests use the per-binding AI Description on the Virtual User (overridable per VU). MCP Servers use the server-level Description (shared across every VU that binds the same server). To customize per-VU behaviour for an MCP Server, adjust the Flow Description instead.
- 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 Flow Description for any write-capable tool.
- 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 Flow Description step. Reserve the prompt for graceful behaviour (apologize, offer transfer) once a tool returns an empty result.
☝ IMPORTANT — descriptions can leak. Anything you put into a Web Request name, AI Description, MCP Server name or Description 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.
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 to 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. Three 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 System Instruction, and set Verbosity = Concise on Open Profile bots.
- 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 the Closing Message field to signal a hand-off ("Connecting you now…") so a transfer feels intentional, not dropped.
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 Extension 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. May not 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 pause 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 Extension Tools narrow and the Flow Description short and explicit.
- For Copilot Studio, use single Topics with generative AI rather than enabling generative AI 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.
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 Flow Description's failure rules rather than inventing data.
- Iterate on the cheapest dial first. Flow Description > AI Description on the tool binding > System Instruction > 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 are 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.
INC AI and Virtual User Limitations
General note on AI-driven interactions
AI driven replies are not deterministic and depend highly on what the Customer is saying. For example, if the Customer is saying “I have trouble with my internet” it is not necessarily given that the Bot will associate “Router, Modem” as your workflow routing exit, unless specifically handled in your Virtual User integration. In this specific example, AI instructions should also cover alternative wordings like “Router, Internet”, to be handled in topics accordingly.
🔎Refer to our Best Practices - Virtual Users in Nimbus for some considerations and risks when using Virtual Users instead of Human interaction.
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 - Profile: Intent Analyzer
🔎By design (not a limitation or reportable issue):
- The Nimbus Intent analyzer Bot runs on pre-defined prompts. Any usage outside of the descriptions specified under Use Case - Setting up a Nimbus Virtual User for Intent Analysis is not supported.
-
Fallback handling: If a workflow uses exits with multiple parameters, e.g. to collect
customer nameandinvoice number, and only one parameter can be retrieved, the fallback exit is taken.
Nimbus / Custom AI Services - Profile: AI Workflow
🔎By design (not a limitation or reportable issue):
- Failed condition: If either a Web Request connection or MCP server connection fails, the “Failed” workflow activity exit will be taken immediately. Also applies for any other Nimbus-internal or technical error.
- Fallback condition: Any “Fallback” parameters will be updated with the response generated by the AI when a case cannot be handled.
☝️Current limitations, coming with a later update:
- For this profile there currently are no custom exits in the “Add Virtual User” Conversation Handling Activity. You only have Success, Fallback, Failed, Idle timeout.
- There is currently no support for custom Parameters in “Add Virtual User” Conversation Handling Activity.
Custom AI Services - Profile: Open Profile
☝️Current limitations, coming with a later update:
- The use of Extensions Tools (either Web Request or MCP Server) is currently mandatory in this profile. 💡This will be improved in a future update to allow for no tools to be used.
- For this profile there currently there are no custom exits in the “Add Virtual User” Conversation Handling Activity. You only have Success, Fallback, Failed, Idle timeout.
- There is currently no support for custom Parameters in “Add Virtual User” Conversation Handling Activity.