WORKING DEMO
https://bingo-grid-demo-2026.bubbleapps.io/version-testINSPECT THE BUBBLE EDITOR
https://bubble.io/page?id=bingo-grid-demo-2026&tab=Workflow&name=index# Business Data Grid setup
Launch price: $19/month or $249 once per Bubble application. Browser element; no additional Bingo plugin or external service required.
## Bind your records
1. Install Business Data Grid and place a Business Grid element, approximately 900 × 620 pixels.
2. Set Record data type to your datatype, Records to an authorized search/list, and Unique ID field to Bubble's unique id. Turn on Hide synthetic example for a customer-facing page.
3. Configure application privacy rules. The plugin displays what Bubble supplies; it does not authorize access or database writes.
4. Create The grid is ready workflow. Add an Add or update column action for each field. Choose native datatype/field, a unique label, value type, width, editing permission and optional pinned/required settings.
The example uses GridItem fields name (text), quantity (number) and active (yes/no), displayed as Product, Quantity and Active. Its records are visible only to their creator. Load demo records creates a small inventory for the current visitor.
## Save an edit
Create An edit is requested. Edited record is the actual native Bubble Thing. Add conditional Make changes to a thing actions:
| Only when Edited label is | Field | Value |
| --- | --- | --- |
| Product | name | Grid's Proposed text |
| Quantity | quantity | Grid's Proposed number |
| Active | active | Grid's Proposed boolean |
Authorize the change. After persistence succeeds, run Accept edit with the exact Edit id as the final workflow step. Another queued edit can become active immediately afterward. Reject a change with Reject edit, passing that ID and a message instead of saving. Never acknowledge a failed database/API save.
The demo rejects proposed Product values equal to REJECT using a separate workflow. Try renaming a product, setting Quantity to 0 and Active to false, then reloading. Enter REJECT to restore the previous value. Enter or leaving the input commits it; Escape discards an uncommitted draft. Malformed/required-empty input is rejected before persistence.
Proposed is empty distinguishes empty values from zero/false. Use Proposed text for high-precision decimals stored as text; Proposed number is available only for safe lossless numeric conversion. Date columns are UTC date-only and discard time-of-day. Application transactions and competing database writers require your own controls.
## Select, search and navigate
Row checkboxes expose Selected records (your native datatype list) and Selected ids for authorized workflows. Selection changes signals an update. Clear selection is both a built-in control and native element action.
Search and Set search filter loaded rows; header buttons sort them. Remote searches belong in your app. Scroll to record focuses a loaded stable ID. Arrows, Page Up/Down and Ctrl/Command + Home/End navigate; Enter edits and Escape cancels the draft. Pinned columns remain visible when moving horizontally.
## Load pages and recover
1. Run Request page with your source cursor.
2. On A page is requested, fetch an authorized batch using Page cursor.
3. Run Supply page with the native datatype/list and exact Page request id. Append records is no for replacement, yes for additional rows. Repeated IDs update the existing row.
4. Set Next cursor and More pages available to expose Load more records.
5. On failure, run Fail page with the matching ID and message. Existing rows/cursor remain, loading ends, and you can retry when the source recovers.
The demo's first page contains three rows; Load more records appends the rest. Test page failure displays an explicit failure. Restore records runs Refresh records, resetting the bound dataset and paging. Both page searches use the same name/Created Date order for these fixed fixtures. Production pagination needs stable ordering and a cursor/snapshot policy appropriate to concurrent changes.
Stale/duplicate page responses are ignored. Finish pending saves before requesting pages. Refresh records, Clear columns, reconfiguration and changed record identity sets invalidate old edit tokens. To rebuild a layout, Clear columns and run the desired Add or update column actions again. Same-record source changes during an active save are deferred until acknowledgment.
## Limits and support
Maximum 10,000 loaded rows, 100 columns, 10,000 characters per cell and 20 million characters across loaded cells. Supply bounded lists. Old pages are not automatically evicted. In Bubble, the 620-pixel example rendered only 13 of 10,000 synthetic rows. Scalar text, numbers, booleans and dates are supported; nested Things/lists, arbitrary HTML and executable formulas are not. Column widths: 80–600 pixels. IDs: unique nonempty text up to 256 characters. Cursors: up to 4,096 characters.
Use Error code/message, Status, Loading and Pending count for extra feedback. A stuck edit usually needs its save workflow or exact acknowledgment ID checked. A loading page needs Supply page or Fail page. Reload when Bubble announces that the test page has changed. Qualification covers Bubble editor/runtime; separate browser/device certification is not claimed.
For support, include plugin version, action/event, field configuration, error code and a small synthetic reproduction. Do not send credentials or private production data. Preserve public interface IDs and your previous plugin version; test upgrades in development before promoting the app.