Interactive dashboards lose their interactivity in PDF, screenshot, and screen recording. The trade-off, and where private-link hosting fits between handoff and full deployment.
A pricing proposal is read more like a website than a document. Channel options for sending one, and where private-link HTML sits between a PDF attachment and an esignature tool.
Figma is designed for collaboration, so the share link shows comments, version history, and the frames you parked. Channel options for a client-facing preview, and where private-link hosting fits.
miinideck turns a single HTML file into an unguessable link with optional password and expiry. Default-private, never indexed.
The format you pick for an internal review is a category-signaling choice. When the team starts shipping HTML links instead of .pptx attachments, the room reads it before the content opens.
You built the dashboard for one client engagement. The filters work. The numbers update when the client picks a region. The hover tooltips explain the methodology. The interactivity is the analysis — it's what separates the dashboard from a chart in a deck.
Now you have to send it. PDF? Most of the value evaporates. Screen recording? The client watches you ask the dashboard questions, not their own. Spin up a hosted deployment? For a four-week engagement and one viewer, the setup is more work than the dashboard itself.
There's a middle option.
PDF export. Designed for static archive. Charts come through as flat images, filters become non-functional UI screenshots, the methodology tooltip is gone because there's nothing to hover. The client receives a record of what the dashboard showed at the moment of export, not what it can show.
Screenshot / screen capture. Designed for showing one specific state. Useful in a slide or email body to make a single point. Doesn't generalize — the client can't try a different filter from a screenshot.
Screen recording / Loom. Designed for showing how something works, asynchronously. The client watches your cursor; their own questions go unasked. Right shape for a walkthrough at the start of the engagement; lossy for ongoing reference.
Slide embed (a screenshot in a deck). Designed for narrating. The chart is in service of the slide; the dashboard's logic underneath is invisible. Right shape for an executive summary, lossy for the analysis underneath it.
Deployed app (Vercel, Render, Heroku, internal hosting). Designed for a long-running product. Login, database, deployment pipeline, ongoing maintenance. Right shape when the dashboard is a product, overkill when the dashboard is a deliverable.
Self-contained HTML at a private URL. Designed for delivering a finished interactive file. The dashboard runs in the client's browser, all logic intact, no server, no login on their side. Right shape when the analysis is finished and the client needs to ask it their own questions for some bounded window.
Most consulting dashboards aren't products. They're the artifact of a specific analysis — built for one engagement, answering one set of questions, retired when the engagement ends.
The deployment question changes with that framing. A product needs uptime, monitoring, an auth layer, a roadmap. A deliverable needs to render correctly, stay accessible for the review window, and not require the client to create an account on a tool they don't otherwise use.
A self-contained HTML — same dashboard, but with all data bundled in, exported from the same charting library — handles the deliverable case directly. The client gets the live interactivity. You skip the deployment infrastructure.
Most modern charting libraries ship an HTML export path:
fig.write_html("dashboard.html") produces a self-contained file with all JS inlinedWhen the export produces a single .html file with everything inlined — CSS, JavaScript, data — the file is portable. That's the file that ships.
Drop an HTML dashboard, get a private link in under 60 seconds. The anonymous tier handles files up to 3 MB and self-destructs after 7 days — useful for testing the link with one teammate before sending the real one to the client.
Numbers in a consulting dashboard are tied to a snapshot. Q3 data analyzed in October is correct in October; the same dashboard is misleading in February when the client forgets the report date and treats the numbers as current.
A link that expires when the engagement closes — 30 days, 90 days, end of the quarter — prevents the dashboard from outliving its accuracy. The client sees a clean "expired" page after the window; if they ask for an extension, you send a fresh link with updated data.
This is the part PDF gets right, accidentally — the receipt date is implicit in the file metadata. A live link without an expiry inherits a worse property: it looks current as long as it loads.
For a private link with no password and no expiry:
No login, no account creation, no app-permissions prompt, no Drive UI. The dashboard is the page.
For a private link with password (recommended for engagements with confidential data):
Related shape: if the dashboard happens to be a styled HTML report rather than an interactive viz, the channel choice is similar but the trade-offs around interactivity drop away.
Solo plan ($4.99/mo) makes the link permanent and removes the footer — useful when the dashboard's lifespan matches the engagement, not the calendar. Password protection doesn't sit behind the paywall — it's on every account.
If the dashboard pulls live data from an API, talks to a database, or needs to authenticate individual users — it's a product, not a deliverable. The right shape is a deployed app with proper hosting (Vercel, Render, internal infrastructure) and the engineering work that comes with that.
If the dashboard is purely static and the client only needs to glance at it once — a PDF or an email body is enough. The interactivity overhead isn't needed.
The private-link path covers the case in between: the analysis is finished, the dashboard is interactive, one client needs to explore it over a bounded window, and the deployment infrastructure would cost more than the engagement itself.