Live training: next batches coming soon. Join the waitlist:Waitlists open:Developer Training →Developer →Copilot Studio Training →Copilot Studio →

Dataverse Tutorial: Build a Solution with a Publisher, Tables and a Managed Export

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.

Dataverse solution SPGuides Asset Tracker 1.0.0.1 exported successfully banner in Power Apps

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.

ComponentSchema nameNotes
Asset (table)cr85a_assetCreated outside any solution, so it has the default cr85a_ prefix
Asset Loan (table)cr85a_assetloanSame default prefix
Vendor (new column on Asset)spg_vendorCreated 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.

Power Apps Solutions page with Unmanaged, Managed and All tabs and the SPGuides Asset Tracker 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.

  1. On the Solutions page, select New solution.
  2. Under Publisher, select + New publisher.
  3. Type the Display name SPGuides. The Name fills in as SPGuides.
  4. Add a Description, such as Publisher for SPGuides tutorial solutions.
  5. Set the Prefix to spg. The Choice value prefix changes from 10000 to a number generated from it; ours became 92314.
  6. Select Save.
New publisher panel with Prefix spg and Choice value prefix 92314 in Power Apps

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.

  1. In the New solution panel, type the Display name SPGuides Asset Tracker. The Name fills in as SPGuidesAssetTracker.
  2. Keep Publisher set to SPGuides (SPGuides).
  3. Leave Version at 1.0.0.0.
  4. Optionally check Set as your preferred solution.
  5. Select Create.
New solution panel with display name SPGuides Asset Tracker and publisher SPGuides

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.

  1. Select Add existing on the command bar, then Table.
  2. Search for Asset. Check Asset and Asset Loan, then select Next.
  3. On Selected tables, keep Include all objects checked for both tables.
  4. Select Add.
Solution Add existing menu with the Table option highlighted
Add existing tables panel with the Asset and Asset Loan tables selected

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.

Selected tables panel with Include all objects checked for Asset and Asset Loan

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.

Dataverse solution objects list showing the Asset and Asset Loan tables

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.

  1. In the solution, open Tables > Asset > Columns.
  2. Select + New column and type the Display name Vendor.
  3. Expand Advanced options and look at Schema name: the prefix is spg_.
  4. Keep Maximum character count at 100 and select Save.
New column Vendor inside the SPGuides Asset Tracker solution with the spg_ schema name prefix

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.

  1. Go back to Solutions, select the SPGuides Asset Tracker row, and select Export solution.
  2. In Before you export, select Publish under Publish all changes, then Next.
  3. In Export this solution, accept the proposed Version number 1.0.0.1.
  4. Under Export as, choose Managed (recommended).
  5. 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.

Before you export panel showing Publishing all customizations failed with An unexpected error occurred

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.

Export this solution panel with version 1.0.0.1 and Managed recommended or Unmanaged options

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.

UnmanagedManaged
Used inDevelopmentTest, UAT and production
Edit components?YesNo, not directly
Can you export it?Yes, as managed or unmanagedNo
State after importDraft, so you must publishPublished
Deleting the solutionRemoves only the containerRemoves 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:

  1. Select Solutions > Import solution.
  2. Choose This device and Browse to the .zip, or choose Pipeline. Select Next.
  3. Review the details. Under Advanced settings, Enable Plugin steps and flows included in the solution is on by default.
  4. Pick connections for any connection references, then enter environment variable values if asked.
  5. 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

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.