# Performance

Speed is the product: fewer calls, fewer tokens, no waiting. UndoCRM is benchmarked with **one workspace holding 1,000,000 contacts** and their history:

| Records | Count |
| --- | --- |
| Contacts | 1,000,000 |
| Identities (emails, phones, handles) | 1,700,000 |
| Interactions | 3,000,000 |
| Facts | 2,000,000 |
| Audit log entries | 2,000,000 |
| Deals | 100,000 |
| Tasks | 200,000 |

## Results

Server-side times, 10 runs each. The benchmark fails if a search returns nothing or the wrong person first, so these are times for correct answers. Network time between your agent and UndoCRM comes on top.

| Operation | p50 | p95 |
| --- | --- | --- |
| Brief by email | 3ms | 5ms |
| Brief by id, over MCP | 4ms | 7ms |
| Search by name | 9ms | 28ms |
| Search by name with a typo ("Prya Patl") | 37ms | 51ms |
| Search by partial email | 2ms | 3ms |
| Search by company domain | 5ms | 6ms |
| `can_contact` + claim | 5ms | 8ms |
| Log an interaction (+facts, +task) | 5ms | 13ms |
| Log an interaction with a new person | 4ms | 5ms |
| Search conversations | 4ms | 5ms |
| Deals in a stage | 25ms | 27ms |

**Concurrent writes:** 100 interactions from two agents at once, half of them creating new people: about 600 writes a second, no failures, no duplicate contacts.

## Known limits

- **Typos that swap letters** ("Pryia" for "Priya") match poorly; missing and extra letters match well. Agents usually search by email or id, which are exact.
- **Request rates** depend on your [plan](/#pricing).
