Performance & Limits

Records, API rate limits, AI quotas, file sizes — what HotCRM allows and how to stay within bounds.

Performance & Limits

The limits below are the default Enterprise plan. Other plans differ; self-hosted has no platform-imposed caps but bottlenecks shift to your infrastructure.

Data volumes

ItemLimitNotes
Records per object100 millionPractical; can go higher with archiving
Custom objects1,000 per tenant
Custom fields per object800Standard + custom combined
Picklist values per field2,000
Relationships per object40 lookup / 2 master-detail
Validation rules per object500
Workflow rules per object500
Flows per objectUnlimitedEach flow has its own complexity limits
Page layouts per object200
Record types per object200

File storage

ItemLimit
Single file upload2 GB
Attachments per recordUnlimited
Total file storagePer plan (typically TB per tenant)
Image preview formatsjpg, png, gif, webp, svg
Document preview formatspdf, docx, xlsx, pptx

Files over 100 MB upload via multi-part; the platform handles chunking.

API limits

LimitDefault
Requests per minute (per user)6,000
Requests per minute (per tenant)60,000
Concurrent connections (per user)25
Request body size20 MB
Response size (single record)10 MB
Max records per query2,000 (use cursor pagination for more)
Max records per bulk write10,000 per batch
Long-running query timeout120 s

Rate-limit responses use HTTP 429 with Retry-After header. Always implement exponential back-off.

Search limits

ItemLimit
Global search resultsTop 200 per object
Search query length2,000 chars
Indexed fields per objectTop 30 by default (configurable)
Search latency (p95)<500 ms

AI Copilot limits

ItemDefault
Skill invocations per user per day500
Skill invocations per tenant per day50,000
Knowledge base size100,000 chunks per base
Knowledge base re-indexNightly or on-demand
Max tokens per skill prompt8,000 (input) / 2,000 (output)
Max simultaneous skill executions10 per user
Embedding storagePer plan (typically GB per tenant)

Bulk-skill invocations (e.g., qualify 500 leads) count as 500 skill calls — be mindful of quotas.

Reporting & cubes

ItemLimit
Report rows displayed10,000
Report rows exported1,000,000
Dashboards per userUnlimited
Widgets per dashboard50
Cube refresh frequencyEvery 5 min (incremental) / nightly (full)
Concurrent report runs (per user)5

For deeper analysis, export to a data warehouse.

List view limits

ItemLimit
Visible rows per page200 (configurable up to 500)
Filter clauses20 per view
Columns40 per view
Saved views per user500

Automation limits

ItemLimit
Workflow re-evaluations per save5 (then halts)
Flow steps500 per flow
Flow loop iterations2,000
Scheduled job concurrency20 simultaneous tenant-wide
Email alerts per hour1,000 per user / 50,000 per tenant
Approval steps per process30

Email & calendar sync

ItemLimit
Email body size logged5 MB
Calendar events synced per user5,000 active
Email retention2 years default (configurable)
Tracking pixel events storedPer email indefinitely

Webhook & event bus

ItemLimit
Webhook payload1 MB
Webhook retries5 with exponential back-off
Webhook timeout10 s
Event bus throughput1,000 events/sec per tenant
Event retention in bus7 days

User & session limits

ItemLimit
Users per tenantUnlimited (subject to plan)
Concurrent sessions per user5 (configurable)
Session idle timeout30 min (configurable)
Session absolute timeout12 hr (configurable)

How to stay within limits

Pagination

When fetching >2,000 records:

GET /api/v1/opportunities?limit=200&cursor=eyJpZCI6...

Always paginate; never load all records at once.

Back-off

When you hit 429:

async function callApi(fn, retries = 5) {
  try { return await fn(); }
  catch (e) {
    if (e.status === 429 && retries > 0) {
      await sleep(Math.min(60000, 1000 * Math.pow(2, 5 - retries)));
      return callApi(fn, retries - 1);
    }
    throw e;
  }
}

Or use the platform SDK which handles back-off automatically.

Bulk operations

For >100 records, use the bulk API rather than 100 single calls.

AI invocation batching

When triaging many records, use a bulk skill invocation — it batches under the hood and counts as N invocations (so still respects per-user quota), but uses connection pooling for ~10× speedup.

Field indexing

For custom fields you query frequently, mark them indexed — speeds list filtering and report execution.

Archive old data

Records older than your operational window (e.g., closed cases >2 years) can be archived:

  • Removed from hot storage; still queryable via the archive API.
  • Frees indexes and improves performance.
  • Auto-archive policies configurable per object.

Monitoring your usage

Each tenant has a Usage dashboard at Setup → Usage:

  • API calls per minute / day / month, by user.
  • AI skill invocations, by skill.
  • Storage growth.
  • Top users by record creation / API consumption.
  • Anomaly alerts.

Enterprise tenants get a quarterly usage review with the account team.

When you outgrow these limits

  • Vertical — Enterprise+ plan extends most quotas.
  • Sharded — multi-region deployments for >1 billion records.
  • Self-hosted — eliminate platform caps; bottlenecks become infrastructure.

Reach out to your account team or file an issue at GitHub.

On this page