Embedded analytics · Early access

Intelligent dashboards inside your product, without building them.

Parity builds the dashboard from your data, shows each of your customers only their own numbers, and answers their questions in plain words. You add one snippet and sign a token.

  • Each customer sees only their rows
  • Signed, short-lived tokens
  • Every number from their data
Why embed

Your customers want answers, not another export.

Every software product ends up needing analytics: what happened, for this customer, and why. Building it well is a product of its own.

Building it yourself

  • A query layer, charts and exports to build, host and keep fast
  • Permissions for every customer, in every query, forever
  • An AI feature that can make numbers up in front of your customers
  • Weeks of engineering each time a customer asks for a new view

With Parity

  • Built from your data in minutes, and changed by asking in plain words
  • Each customer's rows only, decided before anything is worked out
  • Answers worked out with queries on that customer's data
  • One iframe and a signed token in your product
How it works

From your data to your customers in three steps.

  1. 1

    Connect your data

    Upload an export, connect a Google Sheet your systems keep up to date, or a tool like Stripe or HubSpot. Parity builds the dashboard and checks every number against the data.

  2. 2

    Choose who sees what

    Pick the column that says which customer a row belongs to. Parity shows you, customer by customer, exactly what each one will see.

  3. 3

    Paste one snippet

    Your server signs a short token naming the customer. Put it in the iframe, and embed.js sizes the frame to the dashboard.

On your server (Node.js)
// npm install jsonwebtoken
import jwt from "jsonwebtoken";

// On your server: a ten-minute token for the person signed in.
const token = jwt.sign(
  { embed: "YOUR_EMBED_ID", tenant: customer.account_id, user: user.id },
  process.env.PARITY_EMBED_SECRET,
  { algorithm: "HS256", expiresIn: "10m" },
);
On your page
<iframe
  src="https://parityai.pro/embed/YOUR_EMBED_ID#token=TOKEN_FROM_YOUR_SERVER"
  data-parity-embed
  title="Dashboard"
  style="width:100%;height:600px;border:0"
  referrerpolicy="strict-origin-when-cross-origin"
></iframe>
<script src="https://parityai.pro/embed.js" async></script>
One design, every customer

Each customer sees their own numbers. Only theirs.

Build the dashboard once. Parity runs its queries again for each customer, on that customer's rows. Here is the same dashboard, signed in as three clinics of a booking app.

The same embedded dashboard, as three clinics see it (October 2025 to September 2026)
ClinicBookingsRevenueBooked onlineBookings in September
Elm Street Physio1,147$78.2K57%128
Northside Sports Clinic708$48.3K88%89
Riverside Dental393$55.8K54%31
  • Narrowed first

    Every table is cut down to the customer in the token before anything is worked out, so no count, total or top value includes anyone else's rows.

  • Refused, not leaked

    A table without the customer column stops the page from showing, rather than showing it whole.

  • Written for everyone, left out

    The headline, summary and insights were written about all your data, so they're left off. Your customers ask instead.

Ask

Your customers ask. Parity answers from their data.

Above the dashboard, a customer can ask anything about their numbers. Parity works the answer out with queries on that customer's rows, the same way it built the dashboard.

  • Their rows only, in the columns the dashboard uses: the same narrowing as the dashboard, before the question is read.
  • Limited to 30 questions per person an hour, and 300 for each dashboard.
  • Paid from your plan's credits, and off with one switch.

The same question, asked by three clinics

How many bookings did we have last month, and how does that compare with the month before?

  • Elm Street Physioacct_1001

    In September 2026, you had 128 total bookings (120 completed, 4 cancellations, and 4 no-shows). That is an increase of 23 bookings (up 21.9%) compared to August 2026, which had 105 bookings (97 completed). Completed appointments alone grew by 23.7% month-over-month.

  • Northside Sports Clinicacct_1003

    In September 2026 (the most recent month recorded), there were 89 total bookings, up from 73 in August 2026—an increase of 16 bookings, or 21.9%. Completed appointments rose by 30.2% from 63 to 82, while cancellations fell from 9 to 4.

  • Riverside Dentalacct_1006

    In September 2026, you had 31 total bookings (27 completed, 2 cancellations, and 2 no-shows), generating $4,051 in revenue. In the month before (August 2026), there were 37 total bookings (33 completed) with $4,775 in revenue. That represents a decrease of 6 bookings (-16.2%) month-over-month.

Real answers from Parity, each worked out from that clinic's rows of the same sample data.

What's included

What a customer-facing dashboard needs.

  • Your brand

    Your palette and logo from Branding settings, five designs, and the “Made with Parity” link off if you like.

  • Your sites only

    List the sites it may appear on. Anywhere else, the page shows nothing.

  • Sized to fit

    embed.js sets the frame's height to the dashboard's, so there's no scrollbar inside your page.

  • Stays up to date

    Dashboards on connected tools can refresh every day, or when their sheet changes.

  • See the use

    Views and questions are counted for each embed, in the report's Embed settings.

  • Checked numbers

    Every number is a query result, checked against your data when the dashboard is built.

For developers

A JWT, an iframe and four events.

Sign the token on your server with the embed's secret (HS256, any JWT library) and put it after #token= in the frame's address. The fragment never reaches a server log or another site.

The token's claims

embedRequiredThe embed's id, from Embed settings.
tenantWith a customer columnThe customer's value of that column, exactly as your data holds it (send ids past 2^53 as strings). Refused when there's no customer column.
userOptionalYour user's id: questions are limited per user.
expRequiredUnix seconds, within 24 hours. Ten minutes is plenty.

Events on the iframe

  • parity:readyThe dashboard has loaded.
  • parity:heightThe page's height changed (embed.js resizes the frame).
  • parity:errorIt can't be shown: detail.code says why.
  • parity:token-expiredSend a new token: embed.js calls window.parityToken(embedId, iframe) if you define it.

Error codes: token_required, token_invalid, token_expired, origin_refused, tenant_required, tenant_refused, owner_left, column_missing, page_not_safe, data_unavailable.

Sign a token (Node.js)
// npm install jsonwebtoken
import jwt from "jsonwebtoken";

// On your server: a ten-minute token for the person signed in.
const token = jwt.sign(
  { embed: "YOUR_EMBED_ID", tenant: customer.account_id, user: user.id },
  process.env.PARITY_EMBED_SECRET,
  { algorithm: "HS256", expiresIn: "10m" },
);
Show it on your page
<iframe
  src="https://parityai.pro/embed/YOUR_EMBED_ID#token=TOKEN_FROM_YOUR_SERVER"
  data-parity-embed
  title="Dashboard"
  style="width:100%;height:600px;border:0"
  referrerpolicy="strict-origin-when-cross-origin"
></iframe>
<script src="https://parityai.pro/embed.js" async></script>

Questions

How does Parity keep one customer's data away from another?

Your server signs a token that names the customer, with a secret only you and Parity know. Parity narrows every table to that customer's rows before anything is worked out, then runs the dashboard's own queries on what's left. A table without the customer column is refused rather than shown whole, and text written about all your data is left out of the page. What's left is checked for anything that belongs to one customer, such as a name or an id in a title, and the page isn't shown until it's reworded.

What can our customers ask?

Anything about the numbers in front of them. With a customer column, answers are worked out from that customer's rows, in the tables and columns the dashboard uses, so other columns, such as notes or emails, stay out of reach. When everyone sees the same dashboard, answers come from its own numbers only.

What data can it read?

CSV and Excel files, Google Sheets, Google Drive and Excel on OneDrive, and connected tools such as Stripe, Shopify, HubSpot and QuickBooks. Most software companies start with a scheduled export or a Google Sheet their systems keep up to date. Direct database connections, such as Postgres, BigQuery or Snowflake, aren't available yet.

Can it look like the rest of our product?

Yes. New dashboards are built with your palette and logo from Branding settings, and come in five designs, from classic to dark. You can turn off the small "Made with Parity" link, so your customers only see your product.

What does it cost?

Viewing an embedded dashboard doesn't use credits. Each question a customer asks uses credits from your plan, usually a few, and you can turn questions off at any time. Embedding is in early access: for larger volumes, talk to us.

Do you keep what our customers ask?

No. Parity counts views and questions for each embed so you can see how it's used. The questions and answers aren't kept once the answer is sent.

What happens when a token expires?

The page asks your page for a new one, and embed.js calls the function you give it (window.parityToken). The dashboard stays on screen meanwhile, and a question that was waiting is asked again with the new token. Tokens can last up to a day; ten minutes is what we suggest.

Building something specific?Talk to us at hello@parityai.pro