MongoDB

MongoDB

×

Papercrane

Papercrane

Dashboards from MongoDB, without writing the pipelines

Connect Atlas or self hosted MongoDB with a connection string. Ask about churn, revenue, or feature adoption, and the agent writes the aggregation pipelines, shows you every stage, and builds a hosted dashboard your team can open.

Read a pipeline it wrote

Connect in about a minute. Free to connect and ask. Paid plans start when you publish a dashboard. See pricing

Point it at a secondary with readPreference=secondary and it never touches your primary.

One sentence in. Ten stages out.

Every chart on a Papercrane dashboard is backed by an aggregation pipeline the agent wrote against your real collections. Open any chart and read it: it is code, and you own it.

Monthly revenue by plan for the last 12 months, net of refunds, excluding trials.

Monthly revenue by plan

Example output
SepOctNovDecJanFebMarAprMayJunJulAug

Starter

Growth

Scale

db.invoices.aggregate([

rolling 12 month window, computed at every refresh

{ $match: {
    status: "paid",
    $expr: { $gte: [
      "$periodStart",
      { $dateTrunc: {
          date: { $dateSubtract: { startDate: "$NOW", unit: "month", amount: 12 } },
          unit: "month"
      } }
    ] }
} },

join subscriptions

{ $lookup: {
    from: "subscriptions",
    localField: "subscriptionId",
    foreignField: "_id",
    as: "subscription"
} },

invoices without one drop out

{ $unwind: "$subscription" },

missing trial flag means paid, so $ne: true not false

{ $match: { "subscription.plan.trial": { $ne: true } } },

explode line items

{ $unwind: "$lineItems" },

refund lines are negative, so the sum nets them; group by month and plan

{ $group: {
    _id: {
      month: { $dateTrunc: { date: "$periodStart", unit: "month" } },
      plan: "$subscription.plan.name"
    },
    revenue: { $sum: "$lineItems.amount" }
} },

order

{ $sort: { "_id.month": 1 } },

cents to dollars for the chart

{ $project: {
    _id: 0,
    month: "$_id.month",
    plan: "$_id.plan",
    revenue: { $divide: ["$revenue", 100] }
} }

])

Schema assumptions, stated first

Before writing this, the agent verified against sampled documents: line item amounts are signed cents, some subscriptions predate the trial flag, and plan lives on the subscription (accounts that switched plans report under their current plan; ask and it will snapshot plan per invoice instead).

You could write these. The point is that you never have to again.

36 dashboards on one app database

36

A sports tech company runs 36 production dashboards on Papercrane against the MongoDB behind their app: churn, revenue, player health, and anomaly flags. The agent wrote the pipelines, and when one breaks the error routes back to the agent instead of their engineers.

Churn

Revenue

Player health

Anomaly flags

Ask what the app already knows

Which weekly active accounts have gone quiet in the last 14 days?

joins accounts and sessions

Monthly revenue by plan, last 12 months, net of refunds

joins invoices and subscriptions

What do users do in their first session, and who comes back after it?

joins users and sessions

Which orders shipped but never got a carrier scan?

joins orders and events

Signups by acquisition source this quarter versus last

Which documents are missing fields the new app version expects?

Answers come back as charts on a live hosted dashboard, with the pipeline attached to every one.

The tools you already tried

Atlas Charts

One collection or view per chart, Atlas accounts to view, Atlas only. Fine for a quick internal chart, out of road the day a question spans collections.

Metabase and friends

SQL era BI meets nested documents: every nested field becomes a column, and real app schemas stall the field picker. Their own issue tracker tells the story.

BI Connector into Tableau or Power BI

Flattens documents into synthetic tables, and MongoDB has scheduled its end of life for September 2026. If your reporting runs through it, you need a destination anyway.

The scripts folder

Hand written aggregations, rerun on request, understood by whoever wrote them. It works until that person is busy, which is always.

Full comparison against Atlas Charts and Knowi is on the MongoDB overview page.

How it works

1. Connect with a connection string

Atlas SRV URI or self hosted URL, with connection string or field based auth. Use a read only database user, and append readPreference=secondary to stay off your primary.

Connection string

mongodb+srv://readonly@…/app?readPreference=secondary

2. The agent explores your collections

It samples documents, learns the shapes, and writes aggregation pipelines across collections. Every query it runs is visible while it works.

3. You get a hosted dashboard that is code

Share it by link, embed it in your product, or publish it to a custom domain. When a pipeline breaks, the error routes back to the agent, which fixes it.

Pipeline failed on $lookup: collection renamed

Sent to agent

- from: "events",
+ from: "scan_events",

No ETL, no warehouse copy. Dashboards query your MongoDB when they refresh, so the database stays the source of truth.

When something else is the right call

If you are on Atlas and want one quick chart from one collection for yourself, Atlas Charts is already in your subscription and closer to hand. If you need sub second analytics inside your app at high concurrency, build that on pre aggregated collections; agent built dashboards are for reporting, not hot paths. And if your MongoDB data already lands in a warehouse you trust, connect the warehouse instead: Papercrane speaks BigQuery and Snowflake too.

Questions developers ask us

App databases rarely answer money questions alone. Teams pair MongoDB with Stripe for billing truth, and with BigQuery or Postgres when part of the estate is relational.

Connect your database, ask the question you keep getting asked, and read the pipeline that answers it.

Talk to us

Free to connect and ask. Works with Atlas, self hosted, and any connection string.