ChartHop by ChartHop
Dashboards
Dashboards: How to Build & Customize
charthop dashboards how to build & customize what you can add to a dashboard block type what it does chart visualizes data (bar, line, pie, etc ) text block displays dynamic text, ai summaries, or personalized messages header organizes sections with a title key concepts & definitions jobfilter — the combination of filters a user has selected on the dashboard (e g , filtered to engineering, or new york) always include this in your formula so your chart responds to those selections intervalstart / intervaluntil — when a chart displays data over time (e g , month by month), each bar or data point represents one interval intervalstart is the first day of that period, and intervaluntil is the first day of the next period these are dynamic variables automatically set by the reporting engine for each period — you don't type dates manually here example for the january bar on a chart, intervalstart = '2026 01 01' and intervaluntil = '2026 02 01' for february, they shift automatically to '2026 02 01' and '2026 03 01' target — the person a form response is about (e g , the employee being reviewed) submit — the person who submitted the form response (e g , the manager filling out a review) groupby{} — groups results by a field (like department or location), automatically updating as your org changes no manual edits needed when teams are added or renamed value — the actual response value from a form (a score, rating, or text answer) chart types when adding a chart to your dashboard, you can choose how the data is displayed the formula you write determines what data shows up — the chart type determines how it looks chart type best used for bar chart comparing values across groups (e g , headcount by department) line chart showing trends over time (e g , headcount growth month over month) pie / donut chart showing proportional breakdown (e g , workforce by employment type) single value displaying one number prominently (e g , total headcount, turnover rate) table showing detailed, multi column data side by side time series charts any chart can be displayed as a time series — meaning charthop will calculate your formula for each time period (monthly, quarterly, etc ) and plot them together this is what powers "over time" reports like headcount growth, monthly new hires, or rolling turnover rate to make a chart work correctly as a time series, use intervalstart and intervaluntil in your change or form response functions the engine automatically calculates the right dates for each period example a bar chart using findhires(intervalstart, intervaluntil) count() will show a separate bar for each month, each reflecting only the hires from that month how chart formulas work every chart formula follows the same pattern db job find(jobfilter) \[optional groupby{field}] \[calculation] part what it does db job look in the jobs table find(jobfilter) respect the dashboard's active filters groupby{field} (optional) break results into groups sum{} / count() / mean{} calculate the number common chart formulas goal formula total headcount db job find(jobfilter) sum{headcount} number of employees db job find(jobfilter) count() average base salary db job find(jobfilter) mean{basecomp annualized} headcount by department db job find(jobfilter) groupby{department} sum{headcount} headcount by location db job find(jobfilter) groupby{location} sum{headcount} avg salary by level db job find(jobfilter) groupby{level} mean{basecomp annualized} headcount by dept & gender db job find(jobfilter) groupby{department, gender} sum{headcount} tracking hires, departures & promotions use these functions to report on workforce changes use intervalstart and intervaluntil as the date parameters in dashboard charts — the engine automatically substitutes the correct dates (e g , '2026 01 01', '2026 02 01') for each period goal formula new hires findhires(intervalstart, intervaluntil) count() departures finddepartures(intervalstart, intervaluntil) count() promotions findpromotions(intervalstart, intervaluntil) count() hires in engineering findhires(intervalstart, intervaluntil) filter{dept\ engineering} count() hires by department findhires(intervalstart, intervaluntil) groupby{department} count() voluntary departures finddepartures(intervalstart, intervaluntil) filter{depart\ voluntary} count() turnover rate turnoverrate(fromdate, untildate\[, jobfilter]\[, departfilter]) calculated as departures ÷ average(headcount at start, headcount at end) goal formula overall turnover (rolling 12 months) turnoverrate(' 1y+1d', intervaluntil) voluntary turnover only turnoverrate(' 1y+1d', intervaluntil, jobfilter, {depart\ voluntary}) voluntary turnover in engineering turnoverrate(' 1y+1d', intervaluntil, {dept\ engineering}, {depart\ voluntary}) analyzing form & survey responses terminology reminder target = the person the form is about (e g , the employee being reviewed) submit = the person who submitted the form (e g , the reviewing manager) pull responses from any form findanswers('fieldname', fromdate, untildate) the fieldname is the field id linked to the form question in charthop (e g , managerreviewrating) goal formula average rating score findanswers('managerreviewrating', intervalstart, intervaluntil) mean{value} avg rating grouped by reviewee's department findanswers('managerreviewrating', intervalstart, intervaluntil) groupby{target department} mean{value} ratings submitted by engineering, about people in sales findanswers('rating', intervalstart, intervaluntil) filter{submit department\ engineering and target department\ sales} mean{value} pull responses from a specific review or survey findanswersbyassessment('fieldname', 'assessment name') goal formula avg rating from a specific review, grouped by reviewee's dept findanswersbyassessment('downwardrating', '1h performance review') groupby{target department} mean{value} fields available for filtering or grouping field definition value the response value (score, rating, text) target the person the form is about target department department of the person being reviewed submit the person who submitted the form submit department department of the person who submitted date date the response was submitted text blocks dynamic & personalized content wrap any field in {{ }} and it populates with the viewer's own data you are part of the {{department}} department your manager is {{reportsto}} every employee sees their own information — no need to duplicate dashboards by team add an ai summary of any chart {{summarizechart(reportid, 'chart name exactly as it appears')}} the chart name must match exactly, including capitalization quick reference cheat sheet \# headcount snapshotdb job find(jobfilter) sum{headcount} \# headcount by department (auto updates) db job find(jobfilter) groupby{department} sum{headcount} \# new hires this period by department findhires(intervalstart, intervaluntil) groupby{department} count() \# voluntary turnover rate (rolling 12 months) turnoverrate(' 1y+1d', intervaluntil, jobfilter, {depart\ voluntary}) \# average performance rating by reviewee's department findanswers('performancerating', intervalstart, intervaluntil) groupby{target department} mean{value} \# ai summary of a chart {{summarizechart(reportid, 'headcount')}} \# personalized text for the viewer you are in the {{department}} department, reporting to {{reportsto}} tips building a column style table? temporarily disable the reporting engine, create your chart, then re enable it comparing to a prior period? use asof(' 1m', { }) to pull data from a past point in time and subtract from the current value chart not responding to filters? make sure jobfilter is included in your find() call
