Our Asset and Asset Loan tables lived in the default solution, so there was no clean way to ship them to another environment. The service desk wanted them packaged, versioned and ready for a test environment before anyone built more on top.
This Dataverse tutorial picks up where table-building lessons stop. A solution is the container that carries your tables, apps and flows from one environment to the next.
In this tutorial, we’ll build a dataverse solution from scratch: create a publisher with our own prefix, create the solution, add two existing tables, add a new column, and export it as managed.
We’ll also cover managed vs unmanaged, how import works, solution layers, upgrades vs patches, and pipelines.
Here’s what we’re building: a managed export of SPGuides Asset Tracker, version 1.0.0.1.

Before You Start
You need maker access to a Dataverse environment. I built this in our Power Platform developer environment. If tables, rows and environments are new to you, read what Microsoft Dataverse is first.
The solution packages two tables we built earlier, plus one new column. You can create a table in Microsoft Dataverse the same way if you want to follow along with your own.
| Component | Schema name | Notes |
|---|---|---|
| Asset (table) | cr85a_asset | Created outside any solution, so it has the default cr85a_ prefix |
| Asset Loan (table) | cr85a_assetloan | Same default prefix |
| Vendor (new column on Asset) | spg_vendor | Created inside the solution, so it gets our spg_ prefix |
Sample Asset rows: ASSET-1000 Dell Latitude 7450 (Laptop, Megan Bowen), ASSET-1002 Dell UltraSharp U2724D (Monitor, Alex Wilber) and ASSET-1003 iPhone 16 (Phone, Adele Vance).
Open make.powerapps.com and select Solutions. The page has Unmanaged, Managed and All tabs, plus a card showing the current preferred solution.

Step 1: Create a Publisher with Your Own Prefix
A publisher says who built the solution. Its prefix goes in front of every table and column you create, so names from different teams don’t collide. The default publisher gets a random prefix like cr85a, which tells nobody anything.
- On the Solutions page, select New solution.
- Under Publisher, select + New publisher.
- Type the Display name SPGuides. The Name fills in as SPGuides.
- Add a Description, such as Publisher for SPGuides tutorial solutions.
- Set the Prefix to spg. The Choice value prefix changes from 10000 to a number generated from it; ours became 92314.
- Select Save.

Pick the prefix carefully. Learn says to settle it before you create anything, because existing schema names never change.
Checkpoint: the Publisher box shows SPGuides (SPGuides).
Step 2: Create the Solution
Now we create the empty container that uses that publisher.
- In the New solution panel, type the Display name SPGuides Asset Tracker. The Name fills in as SPGuidesAssetTracker.
- Keep Publisher set to SPGuides (SPGuides).
- Leave Version at 1.0.0.0.
- Optionally check Set as your preferred solution.
- Select Create.

The Name can’t change after you save, and Learn warns against using _upgrade in it. A preferred solution in Power Platform catches new items you create outside the solution, so they don’t land in the default one.
Checkpoint: the solution opens with All (0) objects.
Step 3: Add the Existing Tables
Our two tables already exist, so we bring them in instead of rebuilding them.
- Select Add existing on the command bar, then Table.
- Search for Asset. Check Asset and Asset Loan, then select Next.
- On Selected tables, keep Include all objects checked for both tables.
- Select Add.


Include all objects matters here. Learn says a table that has never been imported into the target environment needs it; otherwise the import fails with a missing dependency.

For a standard table like Account, you’d choose Edit objects and add only the columns or forms you changed. That’s called segmenting. Asset Loan also uses an autonumber primary column in Dataverse, which travels with the table.

Checkpoint: the solution shows All (2), with Asset and Asset Loan as type Table.
Step 4: Add a New Column Inside the Solution
Here’s where the publisher pays off. Anything you create from inside the solution gets its prefix.
- In the solution, open Tables > Asset > Columns.
- Select + New column and type the Display name Vendor.
- Expand Advanced options and look at Schema name: the prefix is spg_.
- Keep Maximum character count at 100 and select Save.

The older columns keep cr85a_, because they were created with the default publisher. You can’t rename schema names later, which is why the publisher comes first.
Checkpoint: the new column’s schema name is spg_vendor.
Step 5: Publish and Export as Managed
Export packages the published state of everything in the solution into a .zip file.
- Go back to Solutions, select the SPGuides Asset Tracker row, and select Export solution.
- In Before you export, select Publish under Publish all changes, then Next.
- In Export this solution, accept the proposed Version number 1.0.0.1.
- Under Export as, choose Managed (recommended).
- Optionally check Run solution checker on export, then select Export.
Our Publish click failed once with “Publishing all customizations failed. An unexpected error occurred.” Next still worked; it checked solution dependencies and moved on. Learn notes that only published components are exported from an unmanaged solution, so retry Publish if you changed forms or views.

Managed is for a test or production environment. Unmanaged is for another development environment or source control. The version goes into the file name, so bump it on every export.

Checkpoint: an info bar says Currently exporting solution “SPGuides Asset Tracker 1.0.0.1”.
Test the Export
After about 40 to 60 seconds, the bar turned green: Solution “SPGuides Asset Tracker 1.0.0.1” exported successfully, with a Download button. That button saves the managed .zip to your browser’s download folder.
One honest note: we have a single development environment, so we didn’t download or import this package. You also can’t import a managed solution into the environment that holds its unmanaged original. The import steps below come straight from Microsoft Learn.
Managed vs Unmanaged Solutions
The rule I follow is simple: develop unmanaged, deploy managed. If you’re still choosing a data platform, solutions are one big reason in our Dataverse vs SharePoint list comparison.
| Unmanaged | Managed | |
|---|---|---|
| Used in | Development | Test, UAT and production |
| Edit components? | Yes | No, not directly |
| Can you export it? | Yes, as managed or unmanaged | No |
| State after import | Draft, so you must publish | Published |
| Deleting the solution | Removes only the container | Removes components and data in its custom tables and columns |
How to Import the Solution into Another Environment
In the target environment, the import goes like this:
- Select Solutions > Import solution.
- Choose This device and Browse to the .zip, or choose Pipeline. Select Next.
- Review the details. Under Advanced settings, Enable Plugin steps and flows included in the solution is on by default.
- Pick connections for any connection references, then enter environment variable values if asked.
- Fix any missing dependencies that are listed, then select Import.
Connections don’t travel in the package. Plan to change a connection reference in Power Automate after import. Values that differ per environment belong in environment variables in Power Platform.
You need the create privilege for each component. System Customizer has it for most components, but not for Plug-In Assembly. If the import fails, select Download Log File for details.
Solution Layers, Upgrades and Patches
Dataverse stacks solutions in layers. All unmanaged changes share one unmanaged layer on top. Managed solutions sit below it, newest above older, with the system layer at the base. For most components, the top layer wins; model-driven apps, forms and site maps merge instead.
To ship version 1.0.0.2, export again with a higher version and import it. You’ll see three options:
- Upgrade (default): replaces the old version, rolls up patches, and deletes components you removed.
- Stage for Upgrade: installs the new version beside the old one so you can migrate data, then you apply the upgrade.
- Update: replaces the solution but keeps removed components. It’s usually the fastest.
What about patches? The old version of this post suggested them for small fixes. Microsoft Learn now says using patches isn’t recommended, so I ship a new version with Upgrade instead.
Skip Manual Export with Pipelines
Notice the Want to make this faster? card in Before you export. That’s pipelines in Power Platform: an admin links a development environment to targets, and you deploy the solution with a few clicks.
Pipelines check dependencies, connections and environment variables before deploying. Target environments must be managed environments, which need premium licenses. Pipelines deploy managed solutions only, use Upgrade, and never carry table data.
Make It Production-Ready
- Create one custom publisher for your team and reuse it; ownership can’t move across publishers.
- Build new tables, apps and flows from inside the solution, or set it as the preferred solution.
- Keep the unmanaged solution in source control and export managed builds from it.
- Bump the version on every export so you can tell builds apart.
- Remember the 95 MB solution size limit, and that rows don’t move with the solution.
Troubleshooting
“Publishing all customizations failed. An unexpected error occurred.” We hit this once. Select Next to continue, and publish again later if your changes include forms or views.
Missing dependency on import. A component in the package needs something the target doesn’t have. Add it with Include all objects, or install the base solution first.
Export is grayed out. You selected a managed solution or the Default Solution. Only unmanaged solutions export.
Data didn’t come across. Solutions carry structure, not rows. Load rows separately, for example with a Dataverse dataflow.
Where to Take It Next
- Move a list into the solution’s tables with a Dataverse table from a SharePoint list.
- Package an agent the same way with a solution in Copilot Studio.
- Set up a pipeline with a test environment, then deploy version 1.0.0.2 with one click.
More Dataverse and app builds live on our Power Apps tutorials hub.
Once your tables live in a solution, these posts help you finish the app:
Frequently Asked Questions
What is a solution in Dataverse?
A solution is a package of customizations, such as tables, columns, apps and flows, that you can export from one environment and import into another. Every solution has a publisher whose prefix goes on the components you create.
Should I export a Dataverse solution as managed or unmanaged?
Export managed for test and production, and unmanaged for another development environment or source control. Microsoft explains both types in Solution concepts.
How do I import a solution in Power Apps?
In the target environment select Solutions > Import solution, browse to the .zip, select Next, set connections and environment variables, then select Import. Steps are in Import solutions in Power Platform.
Why does my new column have a cr prefix instead of my own?
It was created outside your solution, so it used the default publisher’s random prefix. Create columns from inside a solution with your publisher. Schema names can’t be renamed later.
Does a Dataverse solution include table data?
No. Solutions carry table definitions, apps and flows, not rows. Move data with a dataflow, an import, or a flow after the solution is in place.

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.