Dashboards and charts
Build charts and dashboards over your entities, with aggregates, buckets and dimensions, for your team to read without querying the API.
Last updated
A dashboard is a page of widgets that shows your data at a glance. Most widgets are charts: a count, a total or an average over one of your entities, grouped by a field or by time. Your team opens the dashboard and reads the numbers, with no queries and no API calls.
| Term | What it means |
|---|---|
| Dashboard | A named page of widgets, laid out on a 12-column grid |
| Widget | One tile on a dashboard: a chart, a list of records, a note, a quick-action button, a media player or a materialised view |
| Chart | A saved chart definition (entity, aggregate, grouping, filters, timeframe). A chart can sit on several dashboards |
| Aggregate | How values are combined: count, sum, average, min or max |
| Bucket | The time grouping on a date axis: hour, day, week, month, quarter or year |
| Dimension | A field you group or split by, such as channel or status, including a field on a related entity |
Note: The look of the dashboard (logo, colours, sidebar) is covered in Customise the Anythink dashboard and Menu configuration. This page is about what goes on the dashboard itself.
How dashboards work#
Every dashboard is one of two kinds.
- The project default. One dashboard per project, managed by administrators. Everyone can see it. Until someone has a dashboard of their own, it's what they land on. A new project starts with a default of quick-action cards and a getting-started card.
- Personal dashboards. Each person can create their own. A personal dashboard is private until its owner shares it.
Each person also has one Home dashboard, the one that opens when they sign in. The first personal dashboard you create becomes your Home automatically. You can point Home at any dashboard you own.
Widgets sit on a 12-column grid with rows 90 pixels tall. Each widget has a position (x, y) and a size (w, h), and you drag and resize them in customise mode.
| Widget type | What it shows |
|---|---|
| Chart | A saved chart: bar, line, area, pie, stat, gauge or funnel |
| List | The latest rows from an entity, with the fields, sort order and row limit you choose (1 to 50 rows, 5 by default) |
| Materialised view | A table that combines columns from several sources |
| Quick action | A button that opens a page in the Anythink dashboard |
| Note | Free text in markdown |
| Media | Video or audio from your files or a web address |
| Getting started | The onboarding card |
Who can see and change what#
| Action | Who can do it |
|---|---|
| See the project default | Everyone with access to dashboards |
| See a personal dashboard | Its owner and administrators. Everyone else, once it's shared |
| Edit the project default | Administrators |
| Edit a personal dashboard | Its owner. Other people only if it's shared as anyone can edit |
| Change sharing, set Home, delete | The owner. Administrators can also delete the project default |
Access is controlled by the anythink_dashboards permission, with the actions read, create, update and delete. Roles that come with a new project include it. For a custom role, tick it on the role: see Roles and permissions. Saving a chart is a separate permission: charts use anythink_entities (read, create, update, delete), so a person who builds charts needs it too.
A chart only counts the records its viewer is allowed to read. Row-level rules still apply, so two people can see different numbers on the same shared chart: see Groups and row-level security.
Create a dashboard and arrange widgets#
In the Anythink dashboard
- Open Dashboard in the sidebar.
- Open the dashboard switcher at the top right and select New dashboard.
- Enter a Name and, if you like, a Description. Turn on the share switch if the whole team should see it. Select the button to create it.
- Select Add widget, choose a type, give it a title and confirm.
- Drag a widget by its body to move it and drag a corner to resize it.
- Select Save. Cancel discards your changes.
To change an existing dashboard, select the pencil (Customize dashboard). In customise mode you can add, edit, remove, move and resize widgets.
With the CLI
Dashboards use the project's REST API, which you can call with anythink fetch. Widget settings go in config_json as a JSON string.
anythink fetch /dashboards --method POST --body '{
"name": "Sales",
"description": "Weekly numbers",
"widgets": [
{"type":"markdown","title":"Read me","config_json":"{\"body\":\"Numbers update live.\"}","sort_order":0}
]
}'
The response includes the dashboard id and the id of each widget. Lay the widgets out by saving layout_json, a list of positions that refers to widget ids:
anythink fetch /dashboards/12 --method PUT --body '{
"layout_json": "[{\"widgetId\":64,\"x\":0,\"y\":0,\"w\":6,\"h\":4},{\"widgetId\":65,\"x\":6,\"y\":0,\"w\":6,\"h\":2}]"
}'
List what you can see with anythink fetch /dashboards and read one with anythink fetch /dashboards/12.
Note: When you send widgets on an update, send the whole list. Widgets you leave out are removed. Include each existing widget's id to keep it in place.
With an AI assistant (MCP)
Your assistant reaches dashboards through the same REST endpoints as the CLI.
List my dashboards and tell me which one is my Home dashboard.
Create a dashboard called Sales with a note widget that says "Numbers update live".
Placing and resizing widgets by hand is easier in the Anythink dashboard.
Build a chart#
A chart is defined by where the data comes from, how it's combined and how it's shown.
Data source
| Source | What it charts |
|---|---|
| Entity | Records in one of your entities. This is the one you'll use most |
| Platform metric | Project activity such as users signed up, workflow runs, files stored, and payments and subscriptions if you use AnythinkPay |
| Quota | Usage against your plan: database storage, file storage, monthly active users, workflow runs and emails sent |
Chart type
| Type | Use it for |
|---|---|
| Bar | Comparing groups, such as orders per channel |
| Line and Area | A value over time |
| Pie | Shares of a whole, split by one field |
| Stat | One number, such as the count of records in the timeframe |
| Gauge | One number against a target |
| Funnel | How many records or people reach each stage |
For a table of records, use a List widget or a materialised view instead of a chart.
Aggregates, buckets and dimensions
- Aggregate. Choose
count,sum,avg,minormax. Anything exceptcountneeds a numeric Y field to work on. - X axis (bucket). For bar, line and area charts, pick the field for the horizontal axis. If it's a date or timestamp, pick a bucket: hour, day, week, month, quarter or year. Weeks start on Monday.
- Group by. For a pie chart, pick the field to split by.
- Stack by. Splits each bar or line into one series per value of a second field, such as one series per channel.
- Related fields. The X axis and Stack by can follow relationships, so you can group orders by the name of the customer they belong to. Chains of up to three relationships are supported.
- Sort and limit. Sort orders the groups by the X axis, ascending or descending. Limit caps how many groups come back (up to 100,000).
- Cumulative. Turns a line into a running total.
Filters, timeframe and comparison
- Filters. Add conditions on the entity's fields. The operators are
eq,ne,gt,gte,lt,lte,contains,in,existsandnot_exists. - Timeframe. Choose All time, Last 24 hours, 7 days, 30 days, 90 days, 365 days or a Custom range with a start and end date. Offset (days) shifts the whole window back, for example to look at the 30 days before the last 30.
- Compare. Turn on Compare to measure the timeframe against the period before it. The chart shows the percentage change. It compares against a window of the same length, or against the number of days you set. Show on chart overlays the earlier period on the line.
- Target. On a gauge, set a target and say whether it's A goal or A limit. For quota charts you can use your plan's quota as the target.
The percentage change is 0 when both periods are zero, and empty when the earlier period is zero but the current one isn't, because there's nothing to measure growth against.
Funnels
A funnel has a list of stages, each with a label and optional filters, shown as a vertical, horizontal or sankey funnel.
- Entity mode counts records in one entity, with each stage's filters added to the ones before it.
- Cohort mode counts distinct people or items across entities. Pick a cohort field that every stage's entity has, such as
user_id. Each stage can use its own entity, a within days window and a minimum count.
In the Anythink dashboard
- On a dashboard, select the pencil, then Add widget and choose Chart.
- Select Design a new chart. To reuse a chart you've already saved, pick it from the list of saved charts instead.
- Under Data source, pick an entity, a platform metric or a quota.
- Choose a chart type, then set the X axis, aggregate and, if needed, the Y field and Stack by.
- Set the timeframe, filters and, if you want it, Compare. The preview updates as you go.
- Give the chart a name, or leave it to be named for you, and save. The widget is added to the dashboard.
- Select Save on the dashboard.
To change a chart later, edit its widget in customise mode.
With the CLI
Charts are saved through the REST API. Chart request bodies use camelCase names, such as chartType and xField. Responses come back in snake_case.
An orders-per-channel pie chart:
anythink fetch /charts --method POST --body '{
"name": "Orders by channel",
"chartType": "pie",
"entityName": "orders",
"xField": "channel",
"yAgg": "count",
"timeframePreset": "30d"
}'
Revenue per day, split by channel, compared with the previous period:
anythink fetch /charts --method POST --body '{
"name": "Revenue per day",
"chartType": "line",
"entityName": "orders",
"xField": "created_at",
"xInterval": "day",
"yAgg": "sum",
"yField": "amount",
"stackBy": "channel",
"timeframePreset": "7d",
"compareEnabled": true
}'
A stat with a filter, and a funnel with three stages:
anythink fetch /charts --method POST --body '{
"name": "Web orders",
"chartType": "stat",
"entityName": "orders",
"timeframePreset": "30d",
"filters": [{"field":"channel","op":"eq","value":"web"}]
}'
anythink fetch /charts --method POST --body '{
"name": "Order funnel",
"chartType": "funnel",
"entityName": "orders",
"timeframePreset": "all",
"funnelStyle": "vertical",
"funnelStages": [
{"label":"All orders"},
{"label":"Paid","filters":[{"field":"status","op":"eq","value":"paid"}]},
{"label":"Web","filters":[{"field":"channel","op":"eq","value":"web"}]}
]
}'
Each response includes the chart id. Put it on a dashboard by adding a chart widget whose config_json is {"chartId": <id>}:
anythink fetch /dashboards --method POST --body '{
"name": "Sales",
"widgets": [
{"type":"chart","title":"Orders by channel","config_json":"{\"chartId\":40}","sort_order":0}
]
}'
List charts with anythink fetch /charts, change one with --method PUT on /charts/<id> and remove one with --method DELETE. anythink fetch /charts/platform-metrics lists the platform metrics you can chart.
With an AI assistant (MCP)
Create a pie chart of the orders entity grouped by channel over the last 30 days.
Make a line chart of the sum of amount per day for the last 7 days, split by channel, and compare it with the previous period.
Create a funnel on orders with three stages: all orders, paid orders and web orders.
Your assistant creates the chart. Adding it to a dashboard as a widget is done in the Anythink dashboard.
Share a dashboard and choose the default#
Sharing is set per dashboard, by its owner. There are three levels.
| Level | Effect |
|---|---|
| Private (only me) | Only you (and administrators) can see it |
| Shared — view only | Everyone in the project can open it from Shared with you in the switcher |
| Shared — anyone can edit | Everyone can open it, and everyone with anythink_dashboards:update can change its widgets |
Sharing makes the dashboard visible. The people viewing it still only see the data their role allows.
The project default is the dashboard people see until they have one of their own. Only administrators can change it, in one of two ways: edit it directly, or build a dashboard of your own and promote it, which copies its name, description, layout and widgets over the default.
In the Anythink dashboard
- Open the dashboard you own. Select the share icon and choose Private, Shared — view only or Shared — anyone can edit.
- To make it your landing page, select the star (Set as home).
- Administrators: in customise mode, open More actions (the three dots) and choose the option to save the dashboard as the default for new users.
With the CLI
anythink fetch /dashboards/12 --method PUT --body '{"is_shared": true, "allow_shared_edit": false}'
anythink fetch /dashboards/12/set-home --method POST
anythink fetch /dashboards/12/promote-to-default --method POST
Only the owner can change sharing or set Home, and only an administrator can promote a dashboard to the project default. anythink fetch /dashboards/me returns the dashboard you'd land on.
With an AI assistant (MCP)
Share my Sales dashboard with the whole project, view only.
Which dashboard is the project default, and what's on it?
Promote my Sales dashboard to the project default.
Read chart data from your own app#
Dashboards and charts are part of the project's REST API, so your own app can fetch the numbers a dashboard shows. Use a signed-in user's token or an API key, as for the rest of the API: see API keys and Call the instant REST API. The key's role needs anythink_dashboards:read.
Post the widget ids you want to /dashboards/{id}/data. Leave the list empty to get every widget:
anythink fetch /dashboards/12/data --method POST --body '{"widget_ids": [64]}'
The response is a map from widget id to that widget's data. A chart widget comes back in one of these shapes:
| Chart | Shape |
|---|---|
| Bar, line, area, pie | { "chart": {…}, "items": [ { "period": "web", "value": 3 } ], "total": 2 }. With Stack by, each item has one key per series |
| Stat, gauge | { "chart": {…}, "value": 6, "target": 10, "unit": "records" } |
| Funnel | { "chart": {…}, "stages": [ { "label": "Paid", "count": 6 } ] } |
| With Compare on | { "primary": {…}, "compare": { "items": […] }, "delta_pct": 12.5, "compare_period_days": 30 } |
The group or date is in period, and the aggregate in value.
Related endpoints:
| Endpoint | Purpose |
|---|---|
GET /dashboards, GET /dashboards/{id}, GET /dashboards/me |
Read dashboards |
POST, PUT and DELETE on /dashboards |
Manage dashboards |
GET /charts, GET /charts/{id} |
Read saved chart definitions |
POST, PUT and DELETE on /charts |
Manage charts |
GET /charts/platform-metrics |
List the platform metrics you can chart |
Your project's API documentation lists these endpoints with the full request and response fields: see REST API reference.
Limits#
- Charts read live data. There's no schedule or export, and results aren't stored. Large entities with a wide timeframe take longer.
- Row cap. A chart returns up to 5,000 groups by default and at most 100,000.
- Chart types. Bar, line, area, pie, stat, gauge and funnel. There's no table chart: use a list widget.
- Pie charts need a group-by field. Platform-metric pies need a breakdown.
- Aggregates need numbers.
sum,avg,minandmaxwork on numeric fields. - Related fields. Up to three relationships deep, and only on entities you can read.
- Funnel stages. A funnel needs at least one stage. Cohort funnels need a cohort field present on every entity they use.
- Compare. Offered on every chart type except funnels.
- One project default and one Home per person. The default can't be shared, because everyone already sees it.
- No per-role default. The project default is the same for everyone. To point roles at different dashboards, give each role its own menu: see Menu configuration.
- List widgets show between 1 and 50 rows.
- Some tasks are dashboard-only. The CLI and your AI assistant can create dashboards and charts, but adding chart widgets to a dashboard by assistant and arranging widgets by hand are done in the Anythink dashboard.
Next steps#
- Menu configuration: choose what each role sees in the sidebar
- Customise the Anythink dashboard: set your logo and colours
- Roles and permissions: grant
anythink_dashboardsto a role - Groups and row-level security: control which records a chart counts
- Model your data: create the entities you chart