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 / column 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 or metric prominently (e g , total headcount, current turnover rate) gauge visualizing a metric against a target or range (e g , turnover rate vs goal) table showing detailed, multi column data side by side crosstab table comparing two dimensions at once (e g , headcount by department and gender) nps chart displaying net promoter score breakdowns from survey data bubble chart exploring individual level people data across up to four dimensions (x axis, y axis, size, and color) โ available in data explorer 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 substitutes the correct 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 data explorer data explorer is an interactive, full screen environment for exploring your people data unlike standard dashboard charts that display aggregate data, data explorer surfaces individual level data points โ making it ideal for spotting patterns across your workforce clicking on a person opens their side panel so you can drill directly into their profile charts built in data explorer can be added directly to any dashboard one of its most powerful uses is building a nine box visualization by plotting two performance or potential rating fields against each other 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 brackets & syntax use { } curly braces around filters and expressions (e g , {department="engineering"}), and ( ) parentheses only for function call parameters (e g , find(jobfilter)) mixing these up is one of the most common formula errors 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) finding your question field id every form question in charthop is linked to a field id (e g , managerreviewrating) you'll need this to write chart formulas for survey or review data to find it, open the form editor and look for the copy question id to clipboard button on the question you want to report on pull responses from any form findanswers('fieldname', fromdate, untildate) 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') the assessment name must match exactly as it appears in charthop, including capitalization goal formula avg rating from a specific review, grouped by reviewee's dept findanswersbyassessment('downwardrating', '1h performance review') groupby{target department} mean{value} favorable response % for an engagement question (findanswersbyassessment('questionid', 'engagement survey') count{value="agree"} + findanswersbyassessment('questionid', 'engagement survey') count{value="strongly agree"}) / findanswersbyassessment('questionid', 'engagement survey') count() enps score grouped by team findanswersbyassessment('questionid', 'q4 engagement survey') groupby{submit team} nps{value} calculating nps instead of manually writing out promoter and detractor counts, use the built in nps{} method findanswersbyassessment('questionid', 'assessment name') groupby{target department} nps{value} this calculates nps automatically based on response values (9โ10 = promoters, 7โ8 = passives, 0โ6 = detractors) 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 customizing chart labels & display options editing labels โ chart labels appear greyed out but are editable click directly on a label to rename it a reset icon appears once you've made a change, which reverts it back to the default controlling what groups appear โ in the chart's sort/show settings, two checkboxes let you control grouping behavior group remaining as "other" โ rolls up any groups outside your top n into a single "other" bucket include "none" in results โ shows records where the grouped field has no value chart level filters vs formula filters โ if you add a filter at the top of the chart and inside your groupby{} formula, they work independently and won't override each other use the chart level filter for broad audience scoping and the formula level filter for specific calculation logic sharing dashboards access level what they can do owner full edit access, can share with others editor can edit charts and content viewer can view the dashboard; can apply filters if the dashboard does not use full data sharing note on filtering viewers can only use dashboard filters if the dashboard is set to normal data access if a dashboard uses full data sharing (exposing all org data regardless of the viewer's permissions), filters are intentionally disabled as a privacy safeguard 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} \# enps by team findanswersbyassessment('questionid', 'assessment name') groupby{submit team} nps{value} \# favorable response % for an engagement question (findanswersbyassessment('questionid', 'engagement survey') count{value="agree"} + findanswersbyassessment('questionid', 'engagement survey') count{value="strongly agree"}) / findanswersbyassessment('questionid', 'engagement survey') count() \# ai summary of a chart {{summarizechart(reportid, 'headcount')}} \# personalized text for the viewer you are in the {{department}} department, reporting to {{reportsto}} tips & known behaviors 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 chart showing 0 values? bar and column charts suppress zero results by default if you need zeros to appear, use a crosstab table instead ai summaries not respecting dashboard filters? the ai summary reflects the underlying chart data make sure your charts include jobfilter so the summary reflects the filtered view currency in charts all monetary values are converted to your organization's primary currency if your org spans multiple countries, be aware that dashboard charts normalize everything to the org level currency "other" grouping and filters the "other" bucket is calculated at submission time, not dynamically applying a manager level or audience filter after the fact will not re calculate what falls into "other " filtering out specific groups you can filter out a specific group value using {field!="value"} in your formula however, for multi select fields like teams, filtering out one value may remove a person from all groups they belong to โ not just the filtered one in those cases, build each group as a separate formula line rather than using exclusion filters de identified survey dashboards use findanswersbyassessment() to pull results groupings like department or location are calculated at submission time, not dynamically per manager filter โ this can occasionally surface small group results unexpectedly
