Pull your metrics, mint an image, post it to Slack. Set up a cron job and it runs itself every Monday morning.
You built a dashboard. It has every metric your team needs. But nobody logs in. People check Slack, not your analytics URL.
Manual screenshots look bad and someone has to remember to take them. So the numbers that should drive decisions sit in a tool nobody visits.
Use a KPI template with variables for your key metrics and their deltas. Pull the numbers from your database, mint a URL, post it to Slack via webhook.
Set it up as a cron job. Every Monday at 9am, your team gets a clean dashboard image in their Slack channel. No login required, no context switching.
1// Monday morning cron job: generate KPI snapshot → post to Slack2const imageRes = await fetch("https://api.htmlpix.com/v1/url", {3 method: "POST",4 headers: {5 Authorization: `Bearer ${process.env.HTMLPIX_KEY}`,6 "Content-Type": "application/json",7 },8 body: JSON.stringify({9 templateId: WEEKLY_KPI_TEMPLATE_ID,10 variables: {11 title: "Weekly KPI Report",12 period: "Feb 10 – Feb 16, 2026",13 metric1Label: "MRR", metric1Value: "$48.2K", metric1Delta: "+12.4%",14 metric2Label: "Active Users", metric2Value: "3,847", metric2Delta: "+8.2%",15 metric3Label: "Churn Rate", metric3Value: "1.8%", metric3Delta: "-0.3%",16 metric4Label: "NPS Score", metric4Value: "72", metric4Delta: "+5",17 companyName: "Acme Corp",18 },19 width: 800,20 height: 500,21 }),22});23const { url: imageUrl } = await imageRes.json();2425// Post to Slack26await fetch(process.env.SLACK_WEBHOOK_URL, {27 method: "POST",28 body: JSON.stringify({29 blocks: [{30 type: "image",31 image_url: imageUrl,32 alt_text: "Weekly KPI Report",33 }],34 }),35});export async function GET() {
// Pull metrics from your database
const metrics = await getWeeklyMetrics();
// Mint the KPI image URL
const res = await fetch("https://api.htmlpix.com/v1/url", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.HTMLPIX_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
templateId: process.env.KPI_TEMPLATE_ID,
variables: {
title: "Weekly KPI Report",
period: metrics.period,
metric1Label: "MRR", metric1Value: metrics.mrr, metric1Delta: metrics.mrrDelta,
metric2Label: "Active Users", metric2Value: metrics.dau, metric2Delta: metrics.dauDelta,
metric3Label: "Churn Rate", metric3Value: metrics.churn, metric3Delta: metrics.churnDelta,
metric4Label: "NPS", metric4Value: metrics.nps, metric4Delta: metrics.npsDelta,
companyName: "Acme Corp",
},
width: 800,
height: 500,
}),
});
const { url: imageUrl } = await res.json();
// Post to Slack
await fetch(process.env.SLACK_WEBHOOK_URL!, {
method: "POST",
body: JSON.stringify({
blocks: [{ type: "image", image_url: imageUrl, alt_text: "Weekly KPI" }],
}),
});
return Response.json({ ok: true });
}Someone takes a screenshot of the dashboard every Monday. Crops it, posts it to Slack. Forgets half the time.
A cron job does it automatically. Pull metrics, mint URL, post to Slack. Never misses a week.
Slack, email, Discord, Notion. Post the image URL anywhere. People see the numbers without opening a separate tool.
Set up a cron job once: pull metrics, mint URL, post to Slack. After that, it's hands-off.
Green for up, red for down. The template inverts the logic for metrics like churn where a decrease is good.
Execs don't need to learn your analytics tool. A clean image in Slack tells the story.
A unique social preview for every page on your site. One template, one API call.
Personalized stats, dashboards, and banners rendered as images. Works in every email client.
Badges, year-in-review cards, and certificates your users can post on social media.
One template, a spreadsheet of copy, and you have all your ad variants in minutes.
Just migrated our OG images to @htmlpix. Should have done this months ago.
Show customer quotes on your site as styled cards. No embed scripts, no API keys.
Branded product cards generated from your database. For social, email, and marketplaces.