Custom Data patterns and examples
Custom Data is not only “storage for the bot”. In v2 one module serves three roles: the administrator designs the table and imports data, operators and managers work with lists in a comfortable UI, and the integrator connects the same table to the process. This document helps you pick a pattern for your task — without unnecessary code where UI is enough, and without keeping Google Sheets “forever” when both people and automation need the same data.
How to choose quickly
| Your task | Where to look |
|---|---|
| Cities, stores, categories — bot shows a list | Directory + Routing in process |
| CSAT, requests, feedback — bot writes after a dialog | Journal + Save from process |
| Operators maintain a list (statuses, filters, board) | Operator patterns |
| Data already in Excel / Google Sheets | Import from file or Google Sheets |
| Field on one client’s card (manager, segment) | Client fields, not Custom Data → Extend contacts |
| Full CRM for the whole business | External system; Custom Data is an internal service directory → Compared to other approaches |
Client Fields and User Fields are for client or operator attributes, not standalone record registers.
Two main archetypes
In real projects almost all Custom Data tables fall into two models. The archetype defines who fills data and how to create the table.
Archetype 1: Directory (the process reads)
Idea: the table is filled by an administrator (import, manual edit), and the process reads records — cities, stores, categories, routing branches.
| Who writes | Administrator, integrator (import / editor) |
| Who reads | Process (custom_modules__get), sometimes operator for checks |
| Where structure comes from | Client file (most often) or from scratch |
| Typical examples | Stores by city, product categories, branch codes, language branches |
Best v2 start: New table → From file (Excel/CSV) or Data import into a new table. An empty directory without rows rarely makes sense — data usually already lives in the client’s spreadsheet.
Field example (stores): city, address, phone, lang_code.
Archetype 2: Journal (the process writes)
Idea: rows are created by the process during a dialog (rating, request, survey answer). Operators and supervisors view and change records in the UI — filters, board, card.
| Who writes | Process (custom_modules__set / save from input block) |
| Who reads / edits | Operators, supervisors, Metabase reports |
| Where structure comes from | Journal starter, CSAT starter, or design from scratch |
| Typical examples | CSAT after dialog, callback requests, survey entries, processing queue |
Best v2 start: Starters (e.g. quality rating) or From scratch with fields matching what the process collects. After save — Use in process tab and wire blocks.
Field example (CSAT): chat_id, rating, comment, created_at.
Important: a starter gives structure and hints, not ready automation. Until the process writes to the table, the journal stays empty — that is normal during design.
Table creation patterns (administrator / integrator)
Pattern: Directory from file → data ready to use
Task: move existing Excel/CSV into the platform and use it in the process immediately.
v2 path:
- New table → From file or Data import (new table).
- Wizard: source → name and group → column mapping → Preview before import → import.
- View data — verify rows in the table.
- Use in process — wire read access to the bot.
When it fits: routing directories, SKU catalogs, location lists — the most common path in production.
Pattern: Journal from starter → process + team UI
Task: collect CSAT or a request register: bot writes, supervisor sees the list.
v2 path:
- New table → Starters (quality rating, tasks, etc.) or From scratch.
- Editor: fields → Field display → optionally UI settings (chart, highlighting).
- Save → Use in process: write / read / Ask AI.
- In records table — Saved view “Open today” for operators.
When it fits: feedback, NPS, callback requests, internal queues.
→ Starters · Process tab
Pattern: Ask AI during design
Task: describe the need in words (“repair requests with address, status, priority”) and get a draft structure.
v2 path: New table → Ask AI → Instance Agent suggests fields → you review in Model editor → save.
When it fits: non-standard domain when starters do not fit but you need a quick draft.
Pattern: Refresh a directory without manual CRUD
Task: update a catalog weekly from Google Sheets or a new file.
v2 path: Data import into an existing table → Add to current records or Clear model and import again (with confirmation only) → Preview before import.
Do not confuse with legacy: old custom action google_sheets_fetch_data in processes is a deprecated workaround; administrators have native Data import.
→ Google Sheets · Import from file
Patterns for operators and managers
These patterns show why Custom Data is more convenient than an external spreadsheet for daily team work.
Pattern: Working list with a saved view
Task: supervisor opens “my open requests today” with the same columns and filters every day.
How it works: in the records Table, apply Filter and Sorting → Save view → optionally Make shared for everyone. The team switches view tabs without reconfiguring.
Permissions: view — broad role; shared view and edit — module permissions.
Pattern: Status board (Kanban)
Task: move requests or tasks across “New → In progress → Closed” by drag-and-drop.
How it works: List or Table relation field for grouping → Table / Board toggle → drag-and-drop updates status. The process sees the same value as the operator on the board.
When it fits: journals with a status field, internal queues, pipeline without a separate task tracker.
→ View records (table and board)
Pattern: Quick edit in grid or card
Task: operator changes one or two fields (comment, status, assignee) without opening CRM.
How it works: inline edit in the table or record Card in the side panel. Semantic types (User, Subject, Email) provide dropdowns instead of raw text.
Pattern: Macro from a row
Task: “Send to process” or “Check in CRM” button right on the record.
How it works: in editor UI settings — Macros → row button or selection button → launch process with id and field context.
When it fits: operator action on one journal row without opening the builder.
Pattern: Export with current filter
Task: manager sends a data slice to an analyst or Excel for a meeting.
How it works: apply filter → Export (CSV, XLS, PDF, etc.) — the file contains what is on screen.
→ Export data · Export filtered
Process integration patterns (integrator)
Pattern: Routing via directory
Task: user picks a city → bot shows stores in that city.
Sequence: custom_modules__get (all or by lang_code) → keyboard with cities → get with city filter → message with addresses.
Model: stores — city, address, lang_code.
Pattern: Write to journal after dialog
Task: save a rating or request after a survey.
Sequence:
- Simple path: input block with Save to Custom Data.
- Flexible path:
custom_modules__setwithmodule_nameand fields.
Model: csat_feedback — chat_id, rating, comment, created_at.
→ Save from process · custom_modules__set
Pattern: Update client row (reg_user_id)
Task: one row per client, process appends attributes (city, segment, external id).
Sequence: custom_modules__update with reg_user_id key — updates existing row, no duplicate.
When Client Fields are better: if data belongs on the client card in Operator Line, not a separate register.
Pattern: Inline buttons with record id
Task: show requests as buttons; on click load the full record.
Sequence: get list → inline buttons with callback_data = id → inline_call_back → continue with record fields.
Typical for: journals where the user (not operator) picks from their own list.
Pattern: Link between tables
Task: product references category; table shows label, not only id.
How it works: Table relation field → starters like “Products and categories” or two manually created tables.
Pattern: Analytics (Metabase)
Task: CSAT and NPS on dashboards.
Sequence: process writes to journal → Metabase reports on instance table. Optionally enable statistics under the table in UI (chart by rating field).
Richer display: charts, row highlighting, map — Advanced cases.
Summary matrix
| Pattern | Archetype | Who maintains data | v2 UI | Process |
|---|---|---|---|---|
| Directory from file | Directory | Admin (import) | Table, export | get |
| Journal + operators | Journal | Process + operator | Table, Board, views | set / update |
| City → location routing | Directory | Admin | Browse | get + keyboard |
| CSAT / NPS | Journal | Process | Statistics, export | set |
| Request queue | Journal | Process + operator | Kanban, macros | set + get |
| Profile update | Journal / hybrid | Process | Rarely | update |
| Catalog from Google | Directory | Admin (import) | Table | get |
| Metabase | Journal | Process | Optional charts | set |
Common mistakes
| Mistake | Why it hurts | Better |
|---|---|---|
| Create CSAT starter and wait for data without a process | Empty journal — nothing writes | Use in process first, then test dialog |
| Keep directory in Google Sheets “for operators” | Two UIs, sync, permissions | Import → Custom Data → platform roles |
| Custom Data for “client’s manager” field | That is profile, not a register | Client fields |
| Rename field after process is wired | Breaks get/set | Check Use in process before change |
| Empty directory “from scratch” | Nothing to show in bot | From file or import |
Related documents
- What is Custom Data — module concepts
- Compared to other approaches — why not a separate system
- Advanced Custom Data cases — validation, charts, map
- Create a table
- Integrator Hub · Admin Hub