I still remember the first time a client asked me to “just move the app to production real quick.” I had built everything directly inside the default environment, with no solution at all. Moving it turned into a two-day mess of missing tables and broken relationships.
That mistake taught me why a Dataverse solution exists in the first place.
A solution is the container that holds your tables, apps, flows, and other components together. It’s how you move your work from a development environment to test, and then to production, without losing anything along the way.
In this tutorial, I’ll walk you through what a Dataverse solution is, why you need one, how to create a solution with a proper publisher, how to add components to it, and how to export and import it between environments the right way.
The sample setup we’ll use throughout this guide
To keep things practical, I’ll use a real example: an IT Helpdesk app built on Microsoft Dataverse. This is the kind of small business app I build for clients all the time, and it’s a perfect fit for showing how solutions work.
Our app is built on a Dataverse table called Tickets, with these columns:
| Column Name | Data Type |
|---|---|
| Title (Ticket Subject) | Single line of text |
| Status | Choice |
| Priority | Choice |
| RaisedBy | Lookup (to Contact table) |
| DueDate | Date only |
| Category | Choice |
| Description | Multiple lines of text |
Here’s what the sample data in our Tickets table looks like:
| Title | Status | Priority | RaisedBy | DueDate | Category |
|---|---|---|---|---|---|
| VPN not connecting | Open | High | John Miller | 09/16/2026 | Network |
| Outlook keeps crashing | In Progress | Medium | Sarah Lee | 09/18/2026 | Software |
| New laptop request | Open | Low | David Chen | 09/25/2026 | Hardware |
| Password reset needed | Resolved | High | Priya Nair | 09/12/2026 | Access |
| Printer offline | Open | Medium | Mark Adams | 09/17/2026 | Hardware |
| Shared drive access | In Progress | Low | Lisa Wong | 09/20/2026 | Access |
I’ll refer back to this Tickets table and its sample rows throughout this article. Every screen, every component, and every solution I describe below is built around this same IT Helpdesk app, so nothing feels abstract.
If you haven’t worked with Dataverse tables before, it helps to first read what is Microsoft Dataverse and how to create a table in Dataverse before jumping into solutions.
What is a Dataverse solution?
A Dataverse solution is a container that packages your customizations — tables, columns, forms, views, canvas apps, model-driven apps, and Power Automate flows — into one transportable unit.
Think of it like a box you pack before moving houses. Instead of carrying your table, your app, and your flow separately from one environment to another, you put them all in one box (the solution) and move the whole box at once.
Every customization you make in Dataverse lives inside a solution, whether you create one on purpose or not. If you don’t pick a solution, Microsoft dumps your work into the default solution, which is a shared, messy container you should never rely on for real projects.
Pro Tip: I’ve lost count of how many client environments I’ve inherited where everything was built in the default solution. Untangling components from the default solution later is painful and sometimes impossible. Create a custom solution before you build anything — even a single table.
Why you need a custom solution (not the default one)
The default solution contains every component in your environment, including things you didn’t build yourself. That makes it useless for moving just your app to another environment.
A custom solution only contains what you explicitly add to it. This gives you a clean, predictable package that you control completely.
This matters most when you’re doing application lifecycle management (ALM) — the process of moving your work from development, to test, to production in a structured way.
If you’re still deciding between SharePoint and Dataverse as your data source, I’d recommend reading Power Apps Dataverse vs SharePoint list first. Solutions are one of the biggest reasons teams choose Dataverse over SharePoint for serious business apps.
Managed vs unmanaged solutions: what’s the difference?
This is the concept that trips up almost every beginner, so let’s slow down here.
Unmanaged solutions are open for editing. You can freely add, change, or remove components inside them. You build and develop inside unmanaged solutions.
Managed solutions are locked packages meant for deployment. Once you import a managed solution into an environment, users can’t directly edit its components there.
Here’s the rule I follow on every single project: develop unmanaged, deploy managed.
You build your Tickets table, your forms, and your canvas app inside an unmanaged solution in your development environment. When you’re ready to move it to test or production, you export that solution as managed, then import the managed version into the target environment.
Pro Tip: In my experience, teams that skip this pattern and import unmanaged solutions straight into production almost always regret it. Someone eventually opens the solution in production and tweaks a column directly, and now your dev and production environments no longer match.
Why managed solutions protect production
When you import a managed solution, its components become locked in that environment. People can still use the Tickets app and submit tickets normally.
But they can’t change the Status choice values, rename columns, or edit the form layout directly in production. That protection prevents accidental changes that could break the app for everyone.
Deleting a managed solution also removes all its components from that environment, which can mean data loss. Deleting an unmanaged solution only removes the container — the tables and data stay behind. Keep this difference in mind before you delete anything.
Step 1: Create a custom publisher
Before you create your first solution, you need a publisher. A publisher represents who built the solution and adds a prefix to every component you create.
Here’s how I set one up for the IT Helpdesk project:
- Go to make.powerapps.com and select your environment.
- Click Solutions in the left navigation.
- Click New solution, then select New publisher from the Publisher dropdown.
- Enter a Display name (for example, “Contoso IT Team”).
- Enter a Name (no spaces, for example, “ContosoIT”).
- Set a Prefix — a short code like “cit” that gets added before every table and column you create (for example,
cit_tickets,cit_priority). - Click Save and Close.
That prefix matters more than it looks. Every custom table, column, and choice you build gets this prefix automatically, so cit_tickets immediately tells anyone on the team that this table came from your Contoso IT publisher, not from another team’s solution.
Pro Tip: Never use the default publisher for real projects. I once worked on an environment where three different teams had all used the default publisher, and their table prefixes were indistinguishable. Picking apart ownership took hours we didn’t have.
Step 2: Create the solution
With the publisher ready, creating the actual solution takes less than a minute.
- Still in Solutions, click New solution.
- Enter a Display name, like “IT Helpdesk Solution.”
- Choose the publisher you just created from the dropdown.
- Set a Version number, such as 1.0.0.0.
- Click Create.
Your solution now exists as an empty container, ready for components. Version numbers matter for tracking changes over time, so I always bump the version before every export I plan to move somewhere.
Step 3: Add components to your solution
Now it’s time to add the actual pieces of your IT Helpdesk app to the solution.
Inside your new solution, click Add existing, then choose the type of component you want to add:
- Table — Select your Tickets table (or use create table from SharePoint list if you’re migrating from SharePoint).
- Canvas app — Select the IT Helpdesk canvas app you built on top of the Tickets table.
- Cloud flow — Select any Power Automate flow that emails a technician when a new ticket is raised.
- Choice — Include any global choices you created, like Status or Priority, if they aren’t already part of the table.
When you add the Tickets table, Dataverse asks if you want to include all subcomponents, like forms, views, and business rules. I usually add only what I’m actively customizing to keep the solution clean, following the “segmenting” principle — smaller, focused solutions are easier to manage than one giant solution with everything in it.
If your Tickets table needs a calculated field, this is a good point to also learn about the Dataverse formula column, which you can add straight into the same solution.
Building the canvas app inside the solution
Once your Tickets table is in the solution, you can build your canvas app directly from within it.
- Inside the solution, click New > App > Canvas app.
- Choose Tablet format, then connect it to your Tickets table.
- Add a Gallery control that shows all open tickets, sorted by DueDate.
- Add a Form control set to New form mode for submitting new tickets.
The Gallery pulls records straight from our sample Tickets data. Set the gallery’s Items property to a filter like this:
Filter(Tickets, Status.Value = "Open")
Using our sample rows, this formula returns “VPN not connecting,” “New laptop request,” and “Printer offline” — every row where Status equals Open. The “Password reset needed” ticket, marked Resolved, correctly drops out of the view.
If you want a search box on top of that gallery, check out filter Power Apps gallery search box for the exact formula pattern.
To save a new ticket from the form back to Dataverse, use:
SubmitForm(NewTicketForm)
This one line submits whatever the user filled into the form and creates a new row in the Tickets table, following the same column structure as our sample data. If you’d rather write directly to specific fields without a form control, look at Patch Dataverse number field in Power Apps for a Patch-based approach instead.
Pro Tip: Always build your canvas app from inside the solution, not from the general Power Apps home page. Apps built outside a solution get dropped into the default solution automatically, and you’ll have to manually move them back in later.
Step 4: Publish your customizations
After adding or editing components, always click Publish all customizations before you test or export.
Dataverse holds your changes in a draft state until you publish them. Skipping this step is one of the most common reasons a canvas app doesn’t reflect a column you just added to the Tickets table.
I make this a habit: build a component, publish, test, then move to the next component. It catches errors early instead of letting five unpublished changes pile up.
Step 5: Export the solution
Once your IT Helpdesk solution is built and tested in your development environment, it’s time to export it.
- Open Solutions, and select your IT Helpdesk solution.
- Click Export solution.
- Choose whether to export it as Managed or Unmanaged.
- Click Export, and Dataverse downloads a
.zipfile to your computer.
For moving to test or production, always choose Managed. Keep your working copy unmanaged in development, and only export a managed copy when you’re ready to deploy.
Pro Tip: I always bump the solution’s version number before exporting. A version history like 1.0.0.1, 1.0.0.2, and 1.0.0.3 tells me and my team exactly what shipped and when, which saves a lot of guesswork during troubleshooting later.
Step 6: Import the solution into another environment
With your managed .zip file ready, importing it into your test or production environment is straightforward.
- Go to make.powerapps.com and switch to the target environment.
- Click Solutions, then Import solution.
- Browse to your exported
.zipfile and select it. - Review any connection references or environment variables Dataverse asks you to configure.
- Click Import.
Dataverse validates the package, checks for missing dependencies, and installs the Tickets table, the canvas app, and the flow together, exactly as they existed in development.
If your solution includes a flow that connects to an external system, you’ll be asked to set up connections again in the new environment, since credentials don’t travel inside the solution package.
Solution layering: how Dataverse handles multiple solutions
Once you start deploying managed solutions regularly, it helps to understand solution layering.
Dataverse organizes solutions into two layers: the unmanaged layer, where all unmanaged solutions and customizations live, and the managed layer, where managed solutions and the core system solution live.
When you install a second managed solution that touches the same component as an earlier one, the newer managed solution sits on top and controls the current behavior. If you later uninstall it, the layer underneath takes over again.
This layering is exactly why Microsoft recommends keeping your solution structure simple, and why I avoid creating multiple overlapping solutions that touch the same tables. It adds a layer of complexity most small teams don’t need.
Patching a solution instead of re-exporting everything
If you only need to add one new column to the Tickets table, you don’t have to export the entire solution again. You can create a solution patch.
A patch is a smaller solution tied to your main solution’s version, containing only the new or changed components. It gets deployed on top of the original, keeping your deployment history clean and your packages small.
I use patches constantly for small tweaks like adding a new Choice value or fixing a form layout, saving the full solution re-export for bigger releases with several new components.
Things to keep in mind with Dataverse solutions
- Always use a custom publisher. Never build on the default publisher or default solution — it makes ownership and prefixes impossible to track later.
- Segment your solutions. Only add the components you’re actively changing. Including everything “just in case” creates bloated, hard-to-manage solutions.
- Watch for missing dependencies on import. If your solution references a table or choice that doesn’t exist in the target environment, the import will fail until you fix the dependency chain.
- Reconfigure connection references after import. Flows and connectors don’t carry credentials across environments, so budget time to reset these after every deployment.
- Don’t edit managed solutions directly in production. If you need a change, make it in development, then re-export and re-import — resist the temptation to “quickly” unlock and edit it live.
- Version your solutions consistently. A clear version number scheme makes rollback and troubleshooting far easier when something breaks after a deployment.

Frequently Asked Questions
What happens if I don’t create a solution in Dataverse?
Your components land in the default solution automatically. This works fine for quick testing, but it makes it nearly impossible to cleanly move only your app and its related components to another environment later.
Can I convert an unmanaged solution to managed?
Yes. When you export a solution, Dataverse gives you the choice between Managed and Unmanaged formats. Exporting as Managed creates a separate, locked package from the same unmanaged source, without changing your original development copy.
What is a connection reference in a Dataverse solution?
A connection reference is a placeholder inside your solution that points to a specific connector, like Outlook or SharePoint, used by a flow or app. It lets the solution travel between environments without hardcoding one person’s login credentials into the package.
Why did my solution import fail with a missing dependency error?
This usually means the solution references a table, choice, or component that doesn’t exist yet in the target environment. Check the error details for the specific component name, then either add it manually first or include it in your solution before re-exporting.
Can multiple people work in the same unmanaged solution at once?
Yes, but I don’t recommend it without care. Two people editing the same table or form at the same time can overwrite each other’s changes, so coordinate who’s working on what, or split the work into separate patches.
How do I roll back a solution after a bad deployment?
If you kept the previous managed solution version, you can reimport it as an upgrade to overwrite the newer version. This is another reason to always keep a copy of every managed solution .zip you’ve deployed, not just the latest one.
If there’s one sequence I want you to remember from this tutorial, it’s this: create a custom publisher first, build your Tickets table and canvas app inside a custom unmanaged solution, publish your changes, then export as managed for anything outside development.
Following that order in that exact sequence saves you from the exact mistake I made on my first project — building loose in the default solution and paying for it later. Build this habit early, and every future deployment will feel a lot less stressful.
You may also like the following tutorials:
- What is Microsoft Dataverse?
- Power Apps Dataverse vs SharePoint List
- Migrate SharePoint Online List to Dataverse
- Dataverse Create Table from SharePoint List
- Preferred Solution in Power Platform

Hey! I’m Bijay Kumar, founder of SPGuides.com and a Microsoft Business Applications MVP (Power Automate, Power Apps). I launched this site in 2020 because I truly enjoy working with SharePoint, Power Platform, and SharePoint Framework (SPFx), and wanted to share that passion through step-by-step tutorials, guides, and training videos. My mission is to help you learn these technologies so you can utilize SharePoint, enhance productivity, and potentially build business solutions along the way.