How do I use bulk actions on the database?
The /database page has a Notion / Airtable-style selection bar that pops up when you select one or more rows. It exposes 10 actions covering state changes, organization, AI enrichment, output, and removal — turning the database into a real workspace instead of a list view.
Open the selection bar. Tick any row's checkbox (or click the header checkbox to select-all visible). The bar slides up from the bottom of the table within ~100ms and stays until selection clears. The "Clear" button on the bar dumps the selection.
Selection cap. Soft cap at 1,000 rows. We warn you with a toast at 500 because anything over 100 queues as a background bulk_jobs row (you can keep working — we'll notify on completion). Anything ≤100 runs synchronously.
The 10 buttons
Grouped by category:
State change
- Move to stage — pick a new pipeline stage (Lead, Contacted, Qualified, Proposal, Negotiation, Won, Lost). Status-changed timestamps update.
- Assign owner — reassign every selected prospect to a teammate. Validates the target is on your team. (Solo / Pro / Enterprise tiers.)
- Tag… — adds a free-form tag. Existing tags are preserved; commas split multiple.
Organize
- Add to list — drop the selection into an existing list or create a new one inline.
- Add to sequence — enroll selected prospects in a visual sequence. The executor fires the first step within 30 seconds. Solo / Pro / Enterprise; Solo capped at 3 active enrollments per sequence.
- Account list from people — derives a deduped account list from the selected prospects' company values. See the account lists guide.
AI (usage charged)
- Enrich… — opens a section picker with live cost preview. Per-prospect, per-section usage. Enrichment is paid-only: Basic sees the modal with every section locked; Solo / Pro unlock every section, from the 0-unit email and LinkedIn lookups to phone, title, company info, signals correlation, and ICP scoring. Each LLM section writes a
usage_ledgerrow bytask_typeso the bill is fully auditable. - Clean fields — LLM scans for empty + malformed fields and proposes corrections. Default is review-first via a diff modal; auto-apply mode lives on
/settings#bulk-actions. See the clean fields guide. 2 units per prospect.
Output
- Export to CSV — streams the selection through a chunked Response. Default columns are the visible ones; cap is 1,000 rows.
Removal
- Delete — soft delete: sets
deleted_at = NOW(), the prospects move to/database/trash. Undo toast fires for 10 seconds after the action — one click restores everything just deleted. After 30 days, the nightly purge worker hard-deletes anything still trashed and writes a row tohard_delete_auditfor long-retention evidence.
How sync vs async works
For ≤100 selected, every action runs synchronously — you see the result inline within seconds. Above 100, the action queues a bulk_jobs row and the worker drains it in the background. Track progress at /api/bulk-jobs/<id>. Queued jobs are cancellable from the same endpoint; running jobs commit progress incrementally so cancel returns "already running" once dispatch starts.
CSV exports are always sync (capped at 1,000 rows, ~100KB CSV). Account list derivation is also always sync.
Recovery
Soft-deleted prospects live at /database/trash for 30 days with a per-row Restore button and a bulk Restore option. Empty Trash hard-deletes everything currently trashed — confirmation requires typing DELETE <N> exactly to avoid accidents. Tasks, activity, sequence enrollments, and list memberships stay intact through soft delete so a restore round-trips cleanly.
Selection across views
Filters and saved views narrow what's visible; the selection bar operates on the currently filtered set. Saved views aren't mutated by bulk actions — only the prospects you tick are touched.
Troubleshooting
- Bar doesn't show up — confirm at least one row checkbox is ticked. The bar reads selection state from the same checkbox listeners the table renders.
- Action says "no matching prospects" — every selected ID must be owned by you and not already trashed. Cross-tenant or already-deleted IDs silently fall into
denied_count. - Not enough usage for Enrich / Clean fields — paid tiers can enable auto-overage at
/settings/usage. Basic hits a hard block — upgrade to Solo or Pro.
Ask it on the help page and the assistant answers from the whole corpus. If it cannot, team@dealarena.io can, and the answer usually becomes a doc.

