# Quickstart
> Get your first Holistics dashboard embedded in ~10 minutes
In this guide, you'll embed a live Holistics dashboard into your web app using **Single Dashboard** embedding (the fastest way to get started). Not sure which approach fits your use case? See [Two approaches to embedding](/embedded#two-approaches-to-embedding).
## Prerequisites
Before you begin, make sure you have:
- A Holistics account with at least one dashboard built
- A web app to embed into (any stack: Rails, Express, Django, etc.)
## Enable Embedded Analytics
By default, Embedded Analytics is not enabled. To turn it on, go to **Tools → Embedded Analytics** and enable the features you need:
- **Basic features**: [Single Dashboard embedding](/embedded/single-dashboard/) for quick, targeted dashboard integration
- **Advanced features**: [Embed Portal](/embedded/embed-portal/) for full self-service analytics capabilities
Each feature can be set to **Off**, **Trial**, or **On**. Enable [Trial mode](/embedded/embed-workers#embed-preview-mode) to try things out without worrying about cost changes. You can also configure the number of [embed workers](/embedded/embed-workers) to handle your embedded content load.
## Embed a single dashboard
The whole flow boils down to three steps: get your credentials from the Holistics UI, generate a signed token on your backend, and drop an iframe into your frontend.
### Step 1: Generate an embed link
1. Open the dashboard you want to embed
2. Go to **Settings → Dashboard Preferences → Embedded Analytics**
3. Click **Generate Embed Link**
You'll get two values:
- **Embed Code**: identifies which dashboard to show
- **Secret Key**: used to sign the embed token (keep this safe on your backend!)
### Step 2: Generate a token (backend)
On your server, build a JWT payload with basic settings and sign it with your secret key. Here's a minimal example: no permissions or filters, just enough to get the dashboard on screen.
```javascript
const jwt = require('jsonwebtoken');
const embedCode = '275XXXXXXXXX'; // from Step 1
const secretKey = '382fXXXXXXXX'; // from Step 1
const payload = {
settings: {
enable_export_data: false,
},
permissions: {
row_based: [],
},
filters: {},
exp: Math.floor(Date.now() / 1000) + 24 * 60 * 60, // expires in 24 hours
};
const token = jwt.sign(payload, secretKey, { algorithm: 'HS256' });
```
```python
embed_code = '275XXXXXXXXX' # from Step 1
secret_key = '382fXXXXXXXX' # from Step 1
payload = {
'settings': {
'enable_export_data': False,
},
'permissions': {
'row_based': [],
},
'filters': {},
'exp': int(time.time()) + 24 * 60 * 60, # expires in 24 hours
}
token = jwt.encode(payload, secret_key, algorithm='HS256')
```
```ruby
require 'jwt'
embed_code = '275XXXXXXXXX' # from Step 1
secret_key = '382fXXXXXXXX' # from Step 1
payload = {
settings: {
enable_export_data: false,
},
permissions: {
row_based: [],
},
filters: {},
exp: Time.now.to_i + 24 * 60 * 60, # expires in 24 hours
}
token = JWT.encode(payload, secret_key, 'HS256')
```
### Step 3: Add the iframe (frontend)
Drop this iframe into your HTML, substituting in the `embed_code`, `token`, and region domain from your backend:
```html
```
Replace `{region_domain}` with `secure`, `us`, or `eu`. If you use a custom domain, replace the full `{region_domain}.holistics.io` host with your custom domain.
That's it! You should see your dashboard rendered inside your app.
Once it's working, you can fine-tune things like permissions, filters, and appearance:
- [Basic Settings](/embedded/single-dashboard/basic-settings): control export, timezone, header visibility, and filter defaults
- [Permission Settings](/embedded/single-dashboard/permission-settings): restrict data access per user with row-level permissions
- [Drill-Through](/embedded/single-dashboard/drill-through-embed): let users click into related dashboards
## Ready for more? Try Embed Portal
Single Dashboard embedding is great for targeted, read-only views. But when you need **multi-dashboard navigation**, **self-service exploration**, or **multi-tenant workspaces**, Embed Portal gives your users a full analytics experience inside your app.
Here's what the setup looks like at a high level:
### Step 1: Enable Git flow
Embed Portal uses an as-code workflow, so you'll need Git integration enabled. Follow the [Version Control with Git](/docs/git-version-control) guide to set that up.
### Step 2: Define your portal
Create a `.embed.aml` file in your Development tab that lists the dashboards and datasets you want to expose:
```aml title="my_portal.embed.aml"
EmbedPortal my_portal {
objects: [
sales_overview, // dashboard
revenue_trends, // dashboard
sales_data, // dataset for self-service exploration
]
}
```
### Step 3: Generate credentials and embed
The backend/frontend pattern is similar. Generate a JWT token and load it in an iframe. The key difference is that the payload references your portal object instead of a single dashboard.
For the full walkthrough (including preview, publishing, and credential generation), head to the **[Embed Portal](/embedded/embed-portal/#getting-started)** guide.
## Next steps
- [Single Dashboard Settings](/embedded/single-dashboard/basic-settings): customize dashboard behavior and appearance
- [Embed Portal Deep Dive](/embedded/embed-portal/): full guide for multi-dashboard self-service embedding
- [Security](/embedded/security): understand token expiry, data isolation, and best practices
- [FAQs](/embedded/faqs): common questions and troubleshooting tips