Pricing
A per-developer license, billed monthly or yearly — covers both PivotGrid and DataGrid. Use it in unlimited end-user apps. Taxes & invoicing handled by Paddle.
Prices shown per month for comparison. Annual plans are charged once, upfront, and renew yearly — you can cancel at any time.
Community
A usable pivot table and data grid, free
- Handles millions of rows smoothly
- Drag-and-drop report building
- Sort, filter and group your data
- Color-code cells and show % of totals
- Saved views, themes and 12 languages
- Import files; export to CSV, JSON or print
- DataGrid too — virtualized rows, pinned columns, CSV export
- Community support on GitHub
Developer
For a solo developer
Billed $185 once a year
Annual saves $43 a year (19%)
- Everything in Community, plus:
- PivotGrid: custom calculated fields
- PivotGrid: visual filter builder & drill-down
- PivotGrid: interactive charts
- PivotGrid: styled Excel & PDF export
- DataGrid: inline editing with validation & lookups
- DataGrid: range selection, fill handle & paste
- DataGrid: multi-level grouping & master-detail
- DataGrid: styled Excel & PDF export
- 1 developer, unlimited apps
- 1 year of updates
Team
For small teams
Billed $699 once a year
Annual saves $249 a year (26%)
- Everything in Developer, plus:
- Up to 5 developers
- Priority email support
- Faster response times
- 1 year of updates
EnterpriseComing Soon
For large organizations
- Everything in Team, plus:
- Unlimited developers
- Remove the watermark (white-label)
- SLA & dedicated support
- Custom feature requests
- Invoicing & purchase orders
All paid tiers include the proprietary @kanunilabs/pivotgrid-react-enterprise + @kanunilabs/datagrid-react-enterprise + @kanunilabs/datagrid-enterprise packages, delivered via our private registry with a per-customer token.
Every feature, and which edition it needs
Generated from the same inventories the products themselves read — 95 of 134 features across both components need no licence key.
DataGrid
Data & performance
- Virtual scrollingCommunityA million rows at 60fps — only the visible window is in the DOM.
- Web Worker offloadCommunityFiltering and sorting move off the main thread above ~20,000 rows.
- Columnar encodingCommunityTyped arrays instead of objects — the reason sort and filter stay fast.
- Server-side dataEnterpriseFiltering, sorting, paging, distinct values and totals run on your server.
- PaginationCommunityClassic pager with page size control.
- Infinite scrollCommunityAppend rows as the user reaches the end.
- TransactionsCommunityAdd, update and remove rows without rebuilding the grid.
- Async transactionsCommunityBatch a burst of live updates into one pass.
Columns
- SortingCommunitySingle and multi-column, with a custom comparator escape hatch.
- ResizingCommunityDrag the edge; double-click for best fit.
- ReorderingCommunityDrag a header to move the column.
- PinningCommunityFreeze columns to either edge.
- Visibility & chooserCommunityHide columns and bring them back from a picker.
- Bands (multi-level headers)CommunityGroup headers over related columns, collapsible.
- Auto-size & fitCommunitySize to content or fill the grid exactly.
- Automatic columnsCommunityInfer columns from the first row when you have not declared any.
- Custom sort orderCommunitySort by your own rule — "Critical > High > Normal".
- Cell span / mergeEnterpriseMerge repeating cells down a column.
Filtering
- Filter rowCommunityA per-column input under the header.
- Header filter popupCommunityCheckbox list of every distinct value, virtualized and unlimited.
- Quick searchCommunityOne box across every column, with match highlighting.
- Filter panel barCommunityShows the active filter as text, with one-click clear.
- External filterCommunityAND your own row predicate into the grid filter.
- Multi filterCommunityThe filter row and the popup coexist instead of overwriting each other.
- Filter builderEnterpriseNested AND/OR conditions, built visually.
Grouping & hierarchy
- Grouping (one level)CommunityGroup by a column; drag it to the group panel.
- Group panelCommunityDrag columns in and out to regroup.
- Multi-level groupingEnterpriseNest groups as deep as the data goes.
- Group summariesEnterprisePer-group totals in the group footer.
- Master-detailEnterpriseExpand a row into your own detail panel.
- Tree dataEnterpriseSelf-referencing hierarchies with expand/collapse.
Totals
- Footer column totalsCommunityColumn-aligned totals over the whole filtered result.
- Totals row placementCommunityPin the totals row to the top or the bottom.
- Custom aggregationCommunityYour own reducer beside sum/avg/min/max/count.
- Selection statisticsEnterpriseSum, average, min, max and count of the selected range.
Selection & keyboard
- Row selectionCommunitySingle, multiple, and checkbox selection.
- Cell focus & keyboardCommunityArrow keys, Tab, Home/End, Page Up/Down.
- Focused rowCommunityA highlighted current row, independent of selection.
- Deferred selectionCommunityApply the selection when the user confirms it.
- CopyCommunityCtrl+C, with or without headers.
- Range selectionEnterpriseDrag a rectangle across cells.
- Fill handleEnterpriseDrag the corner to fill a range, spreadsheet-style.
- Cut & pasteEnterprisePaste a block from Excel straight into a range.
Editing
- Cell editingEnterpriseEdit one cell at a time, committed on blur or Enter.
- Batch editingEnterpriseCollect changes and save them together.
- Row editingEnterpriseEdit a whole row with save/cancel controls.
- Form editingEnterpriseEdit the record as a form laid out in the row flow.
- Popup editingEnterpriseEdit the record in a dialog over the grid.
- ValidationEnterprisePer-column rules with inline error reporting.
- CRUD handlersEnterpriseOne call per row — the shape REST and SQL want.
- PermissionsEnterpriseAllow add, update and delete per row, enforced in the engine.
- Custom editors & lookupsEnterpriseYour own editor component, or a lookup bound to another source.
- Undo / redoEnterpriseFull history with a public API and events.
Export & import
- CSV exportCommunityThe whole result or the current selection.
- Excel exportEnterpriseReal .xlsx, with the grid’s formatting carried over.
- PDF exportEnterprisePaginated, with repeated headers; streams for large results.
- Styled exportEnterpriseNumber formats, banded rows, outline levels, totals.
- Import wizardEnterpriseFile → column mapping → commit.
Presentation
- Themes & palettesCommunitySix themes, six palettes, light and dark.
- DensityCommunityNormal and compact row heights.
- LocalizationCommunityTwelve languages, and your own strings.
- TooltipsCommunityAutomatic on truncated text, or your own content.
- Row numbersCommunityA numbered column that renumbers after sort and filter.
- Print layoutCommunityEvery row on paper, not just the rendered window.
- Aligned gridsCommunityTwo grids sharing one column layout.
- Cell flashCommunityHighlight cells that just changed.
- Loading & empty overlaysCommunityBuilt-in states you can drive yourself.
- Pinned rowsCommunitySticky comparison rows above or below the data.
- Row drag & dropCommunityReorder rows, or move them between grids.
- SparklinesEnterpriseA small chart inside a cell.
- Cell notesEnterpriseA corner marker with text on hover, editable from the menu.
- Status barEnterpriseDocked counters and range statistics.
- Side bar & tool panelsEnterpriseDocked Columns and Filters panels.
Charts
- Chart data hookCommunityShapes the grid’s current result for any chart library.
- Chart panelEnterpriseDocked charts driven by the grid’s own columns.
- Cross-filter & zoomEnterpriseClick a bar to filter the grid; wheel to zoom the axis.
- Chart exportEnterpriseSave a chart as PNG or SVG.
Integration
- EventsCommunityFifty-five events covering cells, rows, columns, editing and lifecycle.
- Imperative APICommunityDrive the grid from your own code via the controller.
- Saved viewsCommunityPersist and restore column, filter and sort state.
- Context menusCommunityHeader, row and cell menus you can extend or replace.
- SSR & bundlersCommunityRenders on the server; works with Vite, Next.js and webpack.
PivotGrid
Data & performance
- Web Worker offloadCommunityAggregation, grouping and filtering run off the main thread, so the UI never blocks on a recompute.
- No bundler configurationCommunityThe worker is compiled into the package and started from a Blob URL — nothing to wire up in Vite, Webpack or Next.
- Million-row datasetsCommunityColumnar storage and a trie-based grouper; the playground runs 1K to 2M rows in the browser.
- Pre-aggregation filterCommunityA predicate applied to the source rows BEFORE the pivot is computed, set through `layout.prefilter`.
- Visual prefilter builderEnterpriseA multi-condition editor for that predicate, with grouped AND/OR nesting.
Aggregation
- Six summary typesCommunitysum, count, avg, min, max and distinct count, per measure.
- Custom summariesCommunity`calculateCustomSummary` with the classic start → calculate → finalize phases, for rollups the built-ins cannot express.
- Summary display modesCommunitySeven post-aggregation transforms: % of total, of row, of column, running total, difference and % difference.
- Calculated fields in codeCommunityDeclare a measure from an expression — row-level or summary-level — in your field definitions. The expression engine is in the free core.
- Calculated field designerEnterpriseThe no-code modal that lets end users build, edit and delete those formulas from the footer.
Shaping the pivot
- Row, column, data & filter areasCommunityEvery field declares its area and position; changing them re-pivots.
- Drag-and-drop field panelCommunityEnd users reshape rows, columns, measures and filters by dragging — no code.
- Field chooser & settings dialogCommunityA searchable field list plus a per-field settings dialog for summary type, format and sort.
- Date & number groupingCommunityGroup dates by year, quarter, month or day, and numbers into buckets.
- SortingCommunityAscending, descending, or your own comparator through `calculateCustomSort`.
- Sort a dimension by a measureCommunityOrder regions by revenue rather than alphabetically, with `sortBySummaryField`.
- Top-NCommunityKeep only the leading values of a dimension, applied after the sort and per level.
- Header filtersCommunityInclude/exclude value pickers on every row and column header, fully keyboard-driven.
- Filters set in codeCommunitySeed the same filters from your field definitions with `filterValues` and `filterType`.
- Expand & collapseCommunityPer-node expansion plus expand-all / collapse-all from the footer.
- Node context menuEnterpriseRight-click a header node for bulk expand/collapse of that branch or that whole level.
Layout & totals
- Grand totalsCommunityRow and column grand totals, each switched independently.
- SubtotalsCommunityPer-level subtotals on the row axis.
- Totals positionCommunityTotals above or below the rows they summarise.
- Tree or tabular row headersCommunityNest the row dimensions in one indented column, or give each its own.
- Hide empty rows & columnsCommunityDrop combinations that produced no data instead of rendering blank bands.
- Measure caption placementCommunityPut the measure captions on the column axis or the row axis.
Presentation
- Six built-in themesCommunityLight, dark and high-contrast presets, all driven by CSS variables you can override.
- Zebra stripingCommunityOne prop.
- Conditional formattingCommunityStyle cells by value with expression rules; several matching rules merge, later ones winning.
- Cell templatesCommunityRender your own React node in a data cell instead of the formatted value.
- Number & date formattingCommunityPer-measure `Intl` options or a formatter function.
- Twelve localesCommunityEvery label, menu and number format, translated in the box.
- Right-to-leftCommunityArabic flips the whole layout automatically.
Data in and out
- File importCommunityCSV, TSV, TXT, Excel (.xlsx/.xls/.xlsm/.xlsb), XML and JSON, with locale-aware type inference.
- Paste & drag-drop importCommunityDrop a file on the grid or paste delimited text straight into it.
- Import preview & column mappingCommunityAn optional review step before the rows are applied, with progress and cancellation on large files.
- CSV, JSON, XML, print & clipboard exportCommunitySeven of the ten export formats, including three JSON shapes and a full session snapshot. CSV output is sanitised against formula injection.
- Styled Excel exportEnterpriseThe view as a real workbook — merged header spans, total styling and per-measure number formats — or a flat list.
- PDF exportEnterpriseA print-ready document of the current pivot.
State & reports
- Named saved viewsCommunityEnd users save, load, rename and set a default report — fields and layout together.
- State persistenceCommunityRestore the grid across reloads from localStorage, sessionStorage, or your own backend through onSave/onLoad.
- Controlled fields & layoutCommunityDrive the grid from your own state and observe every change, instead of letting it own its configuration.
Analytics
- Drill-down dataCommunityClicking a cell resolves the source records behind it and hands them to your handler.
- Drill-down modalEnterpriseA ready-made searchable, exportable detail grid for those records.
- Chart synchronisationCommunityA hook that re-derives chart data on every reshape, expand or filter. You supply the transformer and the chart.
- Chart transformer & rendererEnterpriseThe transformer that turns an engine result into series, and the chart component that draws them.
Platform
- Headless controllerCommunityBuild your own shell out of `usePivotController` and the body/footer components; the grid is not the only entry point.
- Keyboard navigationCommunityMove, select and open menus without the mouse; the filter popup is fully keyboard-driven.
- FullscreenCommunityExpand the grid to fill the viewport from the footer.
- Toolbar configurationCommunityShow or hide each footer control individually.
- Plugin registryCommunityRegister your own export format or expression resolver; a custom exporter takes precedence over the built-in one, paid ids included.
Licence questions
Who counts as a developer?
Every person who writes or modifies code that uses the library needs a seat. Designers, testers, product managers and CI machines do not. A contractor writing code for you counts as one of your seats for the duration of the work.
One licence, two components — really?
Yes. A paid key unlocks the Enterprise features of BOTH DataGrid and PivotGrid. There is no separate purchase and no second key to install.
What happens when my subscription ends?
You keep the last version you paid for, and applications already shipped with it stay licensed. You stop receiving new versions and support. Nothing you have deployed stops working or starts showing a watermark.
Can I ship the library inside a product I sell?
Yes, compiled into your application. What you may not do is redistribute the package itself, your registry token or your licence key — see the Terms of Service for the exact wording.
What exactly is free?
The Community edition of both components: no key, no watermark, no expiry, and commercial use is allowed. The table above lists every feature and which edition it needs.
How is the paid package delivered?
From our private registry with per-customer credentials that arrive with your purchase. Public packages are proxied through the same registry, so one line in your .npmrc covers everything.
Do you offer refunds?
A 14-day conditional guarantee: if the software has a critical issue our support cannot resolve, you can ask for a refund within 14 days. Change of mind or a cancelled project do not qualify. The full policy is on the Refund Policy page.
What if we are more than five developers?
The Team tier covers up to five. Beyond that, use Contact sales above and we will quote for your team size.