Features
All Features Report Designer Dashboards Self-Service BI Scheduling & Exports Advanced Filtering AI Assistant & Live Preview Data Visualization
Use Cases
Accounting & Finance HR & People Analytics SaaS Platforms Enterprise BI All Use Cases
Industries
All Industries Fintech Healthcare Banking & Finance Education Ecommerce & Retail Travel & Hospitality Real Estate
Migrate & Compare
Compare Alternatives From Izenda From SSRS From ExagoBI Migration Help
Company
About Pricing FAQ How It Works Roadmap Community Case Studies Contact Us Schedule a Demo
Sign In Schedule Demo Free Trial
Developer Guide

Metabase Alternative for .NET Developers: Embedded Reporting Without the Iframe Tax (2026)

Metabase is one of the most popular open-source BI tools on the planet, and for good reason — it’s free to self-host, it connects to SQL Server and PostgreSQL with zero configuration, and its question-and-dashboard UI is genuinely approachable for non-technical users. But for .NET ISVs and SaaS teams building embedded reporting into their own applications, Metabase introduces a specific class of structural problems that do not go away as you scale. Iframe-only embedding, broken multi-tenant database routing, white-label features locked behind a $500+/month Pro plan, and a self-hosting burden that compounds month over month are the four reasons .NET teams consistently outgrow Metabase. This guide explains each problem in depth, covers what a purpose-built .NET alternative looks like, and shows you a practical migration path.

April 2026 16 min read Metabase, Embedded Analytics, .NET Reporting, ASP.NET Core, Multi-Tenant BI

What Is Metabase?

Metabase is an open-source business intelligence tool founded in 2014 and headquartered in San Francisco. Available as a free Community Edition (self-hosted) and a paid Pro/Enterprise offering (cloud or self-hosted), Metabase is best known for its approachable, question-based interface that allows non-technical users to explore data and build dashboards without writing SQL. Its connectors span dozens of databases including SQL Server, PostgreSQL, MySQL, Snowflake, and BigQuery, making it easy to point at an existing data source and start asking questions immediately.

Metabase operates across two deployment patterns. For internal analytics — BI for employees, ops dashboards, executive reporting — Metabase is often an excellent fit. The Community Edition in particular offers remarkable value: a capable, self-hosted BI tool at zero licensing cost. For embedded analytics — surfacing white-labeled, customer-facing reporting inside a SaaS or ISV application — Metabase’s architecture begins to show structural constraints that grow more painful as the application scales.

It is that second use case — embedded analytics for .NET SaaS applications — where this guide is focused. If you are building internal tooling, Metabase may be exactly right for you. If you are trying to embed reporting into an application that your customers use, read on.

Why .NET Developers Start With Metabase

The reasons .NET developers gravitate toward Metabase at the start of a reporting project are straightforward and entirely rational:

1. Zero Licensing Cost for the Community Edition

Metabase Community Edition is free to self-host under an open-source license. For a team that needs to ship a reporting feature quickly without a procurement process, Metabase is the fastest way to get something in front of customers. There is no contract, no sales call, and no credit card required.

2. Native SQL Server and PostgreSQL Connectors

Most .NET applications use SQL Server or PostgreSQL as their primary database. Metabase connects to both databases with straightforward configuration: a hostname, port, credentials, and database name. For teams whose data already lives in a familiar relational database, there is no ETL pipeline or data warehouse to build before users can see their first report.

3. Non-Technical User Accessibility

Metabase’s question-and-filter interface allows users with no SQL knowledge to explore data, apply date filters, group by categories, and build simple dashboards. For SaaS teams trying to give their customers self-service analytics without a training program, this is genuinely compelling.

4. An Active Community and Broad Third-Party Coverage

Metabase has one of the largest communities of any open-source BI tool, with active forums, extensive documentation, and thousands of Stack Overflow answers. .NET developers who hit a problem are likely to find a documented solution. This reduces the perceived risk of adoption compared to less widely used tools.

The pattern: Metabase is a rational starting point. The problems surface after teams try to embed it into a production .NET application serving real customers — particularly when multi-tenancy, white-labeling, or SDK-based integration are requirements.

Why .NET SaaS Teams Outgrow Metabase

Teams that deploy Metabase in a production embedded analytics context consistently encounter the same four structural problems. These are not configuration issues or bugs that will be fixed in the next release — they are architectural constraints of the Metabase product model as it exists today.

1. Iframe-Only Embedding: No NuGet, No SDK, No Native .NET Integration

Metabase’s embedding model is built entirely around iframes. To embed a Metabase dashboard into your .NET application, you generate a signed JWT token on your server, construct an iframe URL with that token embedded in the query string, and render the iframe inside your application’s page. There is no NuGet package, no Razor component, no ASP.NET middleware — just an iframe.

This approach creates a persistent set of UX limitations that no amount of CSS can fully resolve. Iframes do not inherit the host application’s font stack, CSS variables, or theme system. Interactions between the embedded dashboard and the host application’s navigation, modals, or state management require postMessage hacks that are fragile under cross-origin restrictions. Print layouts and PDF export from iframed content are notoriously unreliable across browsers. And any interactive filtering that must pass data between the host application and the embedded dashboard requires additional iframe messaging that the Metabase API does not make straightforward.

For .NET developers who are used to integrating components as NuGet packages — with first-class IDE tooling, dependency management, and Razor-compatible APIs — the iframe model is a fundamental mismatch.

2. White-Labeling Requires the Pro Plan ($500+/month)

Metabase Community Edition embeds with the Metabase logo, Metabase branding, and Metabase UI chrome visible to your customers. Removing that branding — a baseline requirement for any production ISV deployment where customers should not see a third-party tool in your product — requires the Pro plan. Metabase Pro is priced at approximately $500 per month for up to five users, with costs scaling upward for larger user counts and additional instances.

The practical implication: the free Community Edition is not viable for customer-facing embedded analytics in a commercial application. Once you account for Pro plan costs, the “free open-source” framing becomes misleading for ISV use cases.

3. Multi-Tenant Database Routing Is Not Supported

Most .NET SaaS applications are multi-tenant: each customer’s data is isolated, either in separate databases, separate schemas, or using row-level tenant identifiers. When a customer logs into your application and views their reports, the reporting layer must query only their data — not all customers’ data.

Metabase’s database model does not support dynamic, per-request database routing. A Metabase instance connects to a static list of configured data sources. You can configure multiple database connections, but you cannot instruct Metabase to route a specific user session to a specific database dynamically at query time based on application context.

This is not an edge case — it is the standard architecture for .NET SaaS applications. Teams commonly work around this by spinning up a separate Metabase instance per tenant (an operational nightmare at scale) or by consolidating all tenant data into a single shared database with row-level access controls (which introduces complex data modeling changes and carries data isolation risks). Neither workaround is acceptable for a well-architected SaaS application. See the next section for a deeper treatment of this problem.

4. Self-Hosting Burden Compounds Over Time

The Metabase Community Edition requires you to operate the infrastructure. This includes a Java application server (Metabase is a Clojure/Java application), an application database for Metabase’s own metadata (typically PostgreSQL), regular updates to keep up with security patches, monitoring and alerting, backup and recovery procedures, and capacity planning as usage grows. Metabase recommends a dedicated instance with at least 2 vCPUs and 4 GB RAM for production use.

Published analyses of Metabase self-hosting total cost of ownership consistently estimate 8–20 hours per month of engineering time for maintenance, updates, and incident response across a production Metabase deployment. For a small engineering team whose core competency is .NET application development, maintaining a Java-based BI server is a persistent operational distraction with no competitive advantage.

The Iframe Embedding Problem in Depth

The iframe embedding constraint deserves more than a bullet point, because it affects the entire user experience of embedded reporting in ways that are not obvious until you are deep into implementation.

Theming and Visual Consistency

Your .NET application has a CSS design system — a color palette, typography scale, spacing system, component library. Your customers expect the reporting section of your application to look and feel like the rest of your product. Metabase’s embedded dashboards live in an iframe, which creates a hard boundary between your design system and the Metabase rendering context. Metabase Pro offers limited theme controls (background color, font selection), but these cannot override Metabase’s own component library and layout assumptions. The result is that embedded dashboards consistently look like a foreign object inside your application — a problem that is visible to your customers.

Responsive Layout and Mobile

Metabase dashboards have their own responsive breakpoints and layout system. When embedded in an iframe, the iframe must be given a fixed height or must use postMessage to communicate its content height to the parent page for dynamic resizing. Metabase provides some JavaScript helpers for iframe resizing, but they are fragile across different browser contexts, particularly in Safari and cross-origin scenarios. Mobile-responsive embedded dashboards are significantly harder to achieve with an iframe model than with a native component model.

Print and PDF Export

Customer-facing reporting almost always requires PDF export or print functionality. Printing iframe content from the host application is blocked by browser security policies in most contexts. Metabase has its own PDF export endpoint, but triggering it from a host application requires the user to navigate into the Metabase UI directly — breaking the embedded experience and exposing Metabase branding to your customers.

Event Handling and Application Integration

Real embedded analytics requires bidirectional communication between the reporting layer and the host application: click events on chart elements that trigger navigation in the host application, filter state that is set by the host application and read by the embedded dashboard, export actions that are coordinated with the host application’s download management. None of these patterns are first-class in the Metabase embedding model. Each requires custom postMessage event handling that must be tested and maintained across every browser and Metabase version update.

Reality check: If your product requirement is “reports that look like part of our application”, Metabase’s iframe model cannot deliver that result. The only complete solution is a reporting layer that renders natively inside your application’s own component tree — which requires an SDK, not an iframe.

The Multi-Tenant Routing Problem

Multi-tenancy is the most technically serious gap between Metabase and the requirements of a .NET SaaS application. It is worth explaining the exact failure mode.

Consider a typical architecture: you have a .NET ASP.NET Core application. Each of your customers has their own data, stored either in a separate SQL Server database (Customer_A_DB, Customer_B_DB) or in a shared database with a TenantId column on every table. When Customer A logs in and views their reports, your application knows their tenant identity from the JWT claim or session context. The reporting layer must use that identity to scope all queries to Customer A’s data only.

In Metabase, database connections are configured at the instance level, not at the request level. There is no API that accepts a request with a tenant token and routes the subsequent query to a specific database connection. The two workarounds that teams commonly attempt are:

Workaround 1: One Metabase Instance Per Tenant

Run a separate Metabase Docker container (or JAR) for each tenant, each connected to that tenant’s specific database. This works for a handful of tenants but becomes operationally unsustainable quickly. At 20 tenants you are running 20 Java application servers. At 100 tenants, the infrastructure cost and operational overhead are prohibitive. Upgrading Metabase requires coordinating upgrades across every instance. There is no shared administration surface — you manage N independent Metabase deployments.

Workaround 2: Row-Level Security in a Shared Database

Consolidate all tenant data into a single database and use Metabase’s sandboxing feature (a Pro-only feature) to filter query results by a tenant attribute. This approach requires your data model to include a tenant discriminator column on every table, which may not match your existing schema. It also means all tenant data is co-located in a single database, which increases the blast radius of any data access bug and may conflict with your compliance requirements (SOC 2, GDPR data residency, contractual data isolation commitments).

Neither workaround addresses the root issue: Metabase was not designed for multi-tenant SaaS embedding. This is a documented, known architectural gap. The correct solution is a reporting layer that accepts a dynamic data connection context on every request — which is what purpose-built embedded reporting tools for .NET provide.

What to Look for in a Metabase Alternative for .NET

When evaluating Metabase alternatives for a .NET SaaS or ISV application, these are the capabilities that resolve the structural gaps described above:

NuGet / SDK-Based Integration

A NuGet package that installs into your ASP.NET Core project and renders report components natively — no iframe, no separate server process. The reporting layer should be part of your application’s component tree, inheriting your routing, authentication, and CSS context.

Per-Request Multi-Tenant Routing

The ability to pass a dynamic connection string or tenant context on every report request, so that each tenant’s session is scoped to their own data source. This must work without spinning up separate instances per tenant.

Full White-Labeling Without a Premium Tier

Complete removal of vendor branding as a baseline capability, not a premium add-on. Your customers should see your product, not a third-party BI tool.

Self-Service Report Building for End Users

An in-application report builder that your customers can use to create their own reports and dashboards without writing SQL — a capability that replaces the Metabase question interface in the embedded context.

Native Export and Scheduling

PDF, Excel, and CSV export that works within your application’s security model, plus report scheduling so customers can receive reports on a defined cadence without logging in.

Row-Level Security That Your App Controls

Data-level security enforced by your application logic — not a configuration in a third-party BI tool. Row-level access rules that follow your existing authorization model, applied transparently to every report query.

Dotnet Report: Purpose-Built Embedded Reporting for .NET

Dotnet Report is an embedded reporting and self-service BI platform built specifically for .NET applications. It ships as a NuGet package that installs into your ASP.NET Core application and renders the full reporting UI — report builder, dashboards, charts, tables, filters — natively inside your application with no iframes, no separate server, and no Java runtime.

The architecture is designed around the multi-tenant .NET SaaS pattern. Your application passes a connection string (or connection factory) on each request, allowing Dotnet Report to query each tenant’s data source dynamically. Tenant isolation is enforced at the query layer, not at the BI tool configuration layer, which means it works with any data isolation pattern: separate databases, separate schemas, or row-level filtering.

How the Integration Works

Integration follows the standard .NET library pattern. You install the NuGet package, call services.AddDotnetReport() in your DI configuration, add the Dotnet Report middleware to your pipeline, and drop the report builder component into any Razor view or layout. Authentication uses your application’s existing identity model — there is no separate Metabase user management system to maintain alongside your own.

The report builder presents end users with a drag-and-drop interface for selecting tables and columns, applying filters, configuring groupings, and choosing chart types — all without SQL knowledge. Administrators can control which tables and columns are visible to which users, applying the same role-based access rules that govern the rest of your application.

Self-Service Dashboards

Users can assemble dashboards from saved reports, configure layout and sizing, add date range pickers and parameter filters, and share dashboards with other users in their tenant. All dashboard state is stored in your application’s own database, with no external Metabase metadata store to back up and manage separately.

Export, Scheduling, and Alerting

PDF, Excel, and CSV export are available natively from the report viewer, triggered from within your application’s page context rather than from a separate Metabase URL. Report scheduling allows users to configure recurring delivery of reports to email recipients on a cron-style schedule. Alert thresholds can trigger notifications when metric values cross defined boundaries.

Metabase vs. Dotnet Report: Feature Comparison

Feature Metabase Community Metabase Pro Dotnet Report
Embedding model Iframe only Iframe only Native NuGet SDK, no iframe
ASP.NET Core integration None (iframe URL only) None (iframe URL only) services.AddDotnetReport(), Razor components
Multi-tenant dynamic routing Not supported Partial (sandboxing, single DB only) Per-request connection context
White-labeling Metabase branding visible Limited (Pro required, $500+/mo) Full white-label, included
Self-service report builder Question builder (SQL Server, PostgreSQL) Question builder (expanded) Drag-and-drop report builder, in-app
Row-level security Not supported Sandboxing (Pro only) Application-controlled, any isolation model
PDF / Excel export PDF via Metabase UI only PDF via Metabase UI only Native in-app export, PDF + Excel + CSV
Report scheduling Pro only Included Included, user-configurable
Runtime Java / Clojure server Java / Clojure server .NET native, no Java dependency
Infrastructure to maintain Metabase server + app DB Metabase server + app DB None (embedded in your app)
Licensing model Free (Community) $500+/month (Pro) Flat-rate, unlimited tenants

How to Migrate from Metabase (Step by Step)

Migrating from Metabase to Dotnet Report is a structured process. Because Metabase stores all report definitions, dashboards, and configurations in its own metadata database (and not in your application’s database), migration involves re-creating report definitions in the new system rather than importing binary Metabase artifacts. For most teams, this is an opportunity to audit and consolidate the report catalog — in practice, Metabase installations accumulate many saved questions and dashboards that are no longer actively used.

Step 1: Audit Your Active Metabase Report Catalog

Pull the list of saved questions and dashboards from your Metabase instance via the Metabase API (GET /api/card and GET /api/dashboard). Tag each report with its last-viewed date and the number of users who have accessed it in the past 90 days. In most installations, 20–40% of reports are unused and do not need to be migrated.

Step 2: Map Metabase Questions to Dotnet Report Report Definitions

For each active Metabase question, identify the underlying table(s), selected columns, filter conditions, groupings, and chart type. This information is available in the Metabase question editor and via the API (GET /api/card/:id). Document this mapping in a spreadsheet that becomes your migration checklist.

Step 3: Install Dotnet Report and Configure Data Access

Install the Dotnet Report NuGet package into your ASP.NET Core application. Configure the data source connection, pointing at the same SQL Server or PostgreSQL database that Metabase was querying. Configure the table and column visibility rules to match or improve on the access controls you had in Metabase. Set up the multi-tenant connection routing if your application serves multiple tenants.

Step 4: Rebuild the Report Catalog

Use the Dotnet Report drag-and-drop builder to re-create each report from your migration checklist. For most simple reports (a table with filters and a grouping), this takes 5–10 minutes per report. For complex reports with calculated columns or multi-table joins, budget 20–30 minutes. Consider involving a power user from each tenant to validate that the rebuilt reports match their expectations before cutover.

Step 5: Replace the Metabase Iframe With the Dotnet Report Component

In each place in your application where you currently render a Metabase iframe, replace the iframe markup with the Dotnet Report Razor component or JavaScript embed. This step typically takes one to three days of front-end engineering time depending on how many embedding points exist in your application and how much custom CSS you had applied to the iframe containers.

Step 6: Validate, Run Parallel, and Decommission Metabase

Run both systems in parallel for one or two customer-facing sprints. Direct a subset of users to the Dotnet Report interface and collect feedback. After validating data consistency and user acceptance, cut over all users, then decommission the Metabase server and its supporting infrastructure. The Java application server, the Metabase metadata database, and associated backups can all be retired.

Timeline estimate: Most Metabase migrations to Dotnet Report complete in 3–6 weeks of part-time engineering effort, including report rebuilding, integration, testing, and user validation. The largest variable is report catalog size — teams with fewer than 50 active reports commonly complete migration in under two weeks.

FAQ

Can Dotnet Report connect to the same SQL Server database that Metabase was using?

Yes. Dotnet Report connects to SQL Server, PostgreSQL, MySQL, and other common .NET-ecosystem databases using standard ADO.NET connection strings. If Metabase was connecting to your existing application database, Dotnet Report connects to the same database without any data migration.

Do I need to export my Metabase dashboards before migrating?

Metabase does not support a standard export format for questions and dashboards. Migration involves re-creating report definitions in Dotnet Report using the drag-and-drop builder. Metabase’s API provides full access to the JSON definition of each question, which makes it practical to script the audit phase and reduce re-creation to a structured, checkable process.

How does Dotnet Report handle row-level security for multi-tenant data?

Dotnet Report supports two multi-tenancy patterns: dynamic connection routing (each tenant gets their own connection string, passed by your application on each request) and application-level row filtering (your application injects filter clauses into each query based on the authenticated user’s tenant context). Both patterns integrate with your existing ASP.NET Core authorization model and require no changes to your database schema.

Is there a self-hosted option for Dotnet Report?

Dotnet Report embeds directly into your existing .NET application — it does not require a separate server. The NuGet package adds the reporting layer to your application’s own process. There is a lightweight cloud API for report metadata storage, but your data never leaves your infrastructure: all queries run from your application server against your own databases.

What happens to the Metabase server after migration?

After a successful cutover, the Metabase server and its metadata database can be decommissioned. The Java application server, associated storage, monitoring configuration, and backup jobs are all retired. For teams paying for cloud hosting of the Metabase instance, this represents an immediate infrastructure cost reduction.

Get Started

Ready to Replace Metabase in Your .NET Application?

Dotnet Report installs as a NuGet package in your ASP.NET Core project, connects to your existing SQL Server or PostgreSQL database, and gives your customers a fully white-labeled, self-service reporting interface — with no iframes, no Java server, and no per-user pricing. Setup takes under 30 minutes and the free trial requires no credit card.

Start Free Trial

Full access, no credit card, no time limit on the core feature set.

Start Free Trial
Book a Demo

See Dotnet Report embedded in a live .NET application in 30 minutes.

Schedule Demo
Migration Guide

Read related guides for teams migrating from other BI tools to .NET.

View All Guides