ChartPNG

n8n workflow templates for ChartPNG

Four workflows that turn data into a chart image. Each one sends a Chart.js config to ChartPNG and uses only n8n's own nodes plus the app you post to. Nothing to install.

Node names and settings checked against the n8n docs on 2 November 2026, including the Publish button of n8n 2.x. The weekly KPI report was run on n8n Cloud and posted to Slack on 2 November 2026.

Bar chart titled Signups last week, one bar for each day of the week
The chart the weekly template draws with its sample numbers.

Import a template

  1. Download a template below, or copy its import link.
  2. In n8n, create a new workflow.
  3. On the canvas header, open the Workflow menu (the three dots).
  4. Choose Import from File and pick the JSON file. Or choose Import from URL and paste the import link.
  5. Open each node that shows a warning and pick your own credential. The files hold placeholders, no secrets.
  6. Replace the sample data with yours and run Execute workflow.

You can also copy the nodes and paste them into the editor. Before you share a workflow you exported, remove its credential details.

The free plan, and an optional key

The templates call https://chartpng.dev/chart with no key. That is the free plan: all chart types, a small watermark, up to 4 megapixels per image.

To remove the watermark, use a Pro key. Put it in an n8n credential, not in a header field. Exported workflows leave credentials out, but they keep any value typed into a header field.

  1. Open the HTTP Request node in the weekly Slack template.
  2. Set Authentication to Generic Credential Type.
  3. Set Generic Auth Type to Header Auth.
  4. Create a credential. Set Name to Authorization and Value to Bearer, a space, then your key.

A few rules:

The four templates

Weekly chart to Slack

Schedule Trigger, Code, HTTP Request, Slack

Every Monday at 9 it builds a bar chart, renders it with a POST to ChartPNG and uploads the PNG to a Slack channel.

  1. Open the Code node called Build chart. Replace the sample numbers with your own data.
  2. Open Upload to Slack. Pick your Slack credential and set the channel.
  3. Run the workflow once with Execute workflow. The chart should land in the channel.
  4. Click Publish (top right) so the schedule runs. On n8n 1.x, switch the workflow to Active instead.

Weekly KPI report to Slack

Schedule Trigger, Code, Code, Slack

Every Monday at 9 it builds two chart URLs with the report presets, a KPI with a sparkline and this week against last week, and posts one Slack message with both images.

  1. Open the Code node called Sample data. Replace the numbers with your own.
  2. Open Post to Slack. Pick your Slack credential and set the channel.
  3. Run the workflow once with Execute workflow. The message should land in the channel.
  4. Click Publish (top right) so the schedule runs. On n8n 1.x, switch the workflow to Active instead.

Slack loads each image from its URL, so the images keep the watermark. A Slack image URL can be at most 3000 characters; the Code node stops with a message if a chart is longer. The presets are explained in the guides below.

Daily chart in an email

Schedule Trigger, Code, Send Email

Every day at 8 it builds a line chart and sends an HTML email whose body shows the chart as an image URL.

  1. Open Build chart and replace the sample numbers with your own data.
  2. Open Send email. Pick your SMTP credential and set From, To and Subject.
  3. Run the workflow once and check the email in Gmail or Outlook.
  4. Click Publish (top right) so the schedule runs. On n8n 1.x, switch the workflow to Active instead.

Google Sheets rows to a chart URL

Manual Trigger, Google Sheets, Code, HTTP Request, Google Sheets

It reads the rows of a Data tab, builds one bar chart from them and writes the image URL into a Chart tab.

  1. In your spreadsheet, make a tab called Data with the headers label and value. Make a second tab called Chart with the headers id and chart_url.
  2. Open both Google Sheets nodes. Pick your Google Sheets credential and your spreadsheet.
  3. Run the workflow. The Chart tab gets one row, with id latest and the image URL.
  4. To refresh the chart on a schedule, replace the Manual Trigger with a Schedule Trigger.

Report presets for Slack and email

The KPI template uses two presets, set under options.plugins.chartpng.preset. Each has a guide with its config, a GET URL and a curl example:

What the HTTP Request node sends

The weekly template posts JSON to https://chartpng.dev/chart. The fields are the same ones a GET takes:c is the Chart.js config, w and h are the size in pixels, dpris 1 or 2 and bkg is the background.

{
  "c": { "type": "bar", "data": { "labels": ["Mon", "Tue"], "datasets": [{ "data": [12, 19] }] } },
  "w": 800,
  "h": 450,
  "dpr": 2,
  "bkg": "white"
}

The node settings that matter: Method POST, Body Content Type JSON,Specify Body Using JSON, and under Options, Response withResponse Format File. The PNG lands in the field named byPut Output in Field, data by default. The Slack node reads that same field.

A bad config returns a 400 with a JSON message that says what is wrong. The config can be up to 16 KB.

Why the HTTP Request node, not the QuickChart node

n8n has a QuickChart node. It sends the chart to quickchart.io, and that address is fixed in the node. There is no field for another host, so it cannot call ChartPNG.

The HTTP Request node can call any address. It also is not limited to the chart types the QuickChart node lists (bar, doughnut, line, pie and polar): you send the whole Chart.js config. The c format matches QuickChart's, so moving a config over is a copy and paste.

Limits