When a CRM gets slow, people look at the database and the web servers. Less often they look at who is calling the API. Yet in many environments the busiest user of the system is not a person at all: it is a marketing sync, a billing connector, an enrichment tool or a nightly export script, each written by a different person at a different time, none aware of the others.
This article is about finding that traffic, understanding why it hurts, and changing how it behaves so users stop paying for it.
Recognise the Pattern
Integration-driven slowness has a recognisable signature. The slowdown arrives on a schedule, such as every hour on the hour, or at a fixed time overnight that has crept into the working day as data volumes grew. Interactive users complain at the same moments. Server graphs show bursts rather than a steady climb. And the application logs contain a lot of requests from a handful of service accounts.
If your complaints are “slow at 9:00 and 14:00 every day,” start with a list of everything scheduled at those times before touching any hardware.
Build an Inventory of Callers
You cannot manage what you have not listed. For every system that reads from or writes to the CRM, record:
- The account or API key it uses, so traffic can be attributed.
- What it does and why the business needs it.
- When it runs and how often.
- Roughly how many records it touches per run.
- Who owns it and who to contact when it misbehaves.
Giving each integration its own service account is the single most useful habit here. When everything shares one login, your logs cannot tell the nightly export from the billing sync, and you are back to guessing.
Then look at request logs or API usage reports grouped by account, endpoint and time of day. Check your CRM vendor’s current documentation for the reporting tools it provides.
Understand Why It Hurts
A few mechanisms account for most of the damage.
Polling. A connector asking “has anything changed?” every minute, across a large dataset, can generate heavy load while producing almost no useful results. Event-driven approaches, such as webhooks or change notifications, usually do the same job for a fraction of the effort, where the CRM and the other system both support them.
One record at a time. An integration that makes a separate request for each of many thousands of records pays the connection and processing overhead every single time. Bulk or batch endpoints, where available, are usually much kinder to the server.
Full syncs instead of incremental ones. Re-reading the entire dataset on every run when only a small part has changed wastes effort. Use modified-since timestamps or change tokens to fetch only what is new.
Contention. Heavy writes can lock rows or tables that interactive users also need. A bulk update running during business hours may block someone saving a contact.
Retry storms. When the CRM slows down, naive clients retry immediately and in large numbers, which slows it further. A small problem becomes a big one.
Apply Limits Deliberately
Rate limiting is not an insult to your integrations; it is protection for them and for users. Decide what each caller is entitled to and enforce it, either with the CRM’s own API limits, at a gateway or proxy in front of it, or both. Many platforms impose their own quotas, which differ by product and plan, so check the vendor’s current documentation instead of assuming.
Good limits are paired with good client behaviour. Well-behaved integrations should:
- Respect “too many requests” responses and wait before retrying.
- Use exponential backoff with some randomness, so a fleet of clients does not retry in lockstep.
- Process work in sensible batch sizes, and stop cleanly if errors pile up.
- Run heavy jobs outside business hours, or throttle them during the day.
Remediation Options Compared
| Symptom | Likely cause | Remedy | Trade-off |
|---|---|---|---|
| Spike every hour | Scheduled polling | Move to webhooks or lengthen interval | Needs support from both systems |
| Slow nightly job overrunning into the morning | Full sync each run | Incremental sync using modified timestamps | Must handle deleted records separately |
| Thousands of tiny requests | Record-by-record calls | Bulk endpoints, batching | Larger failures to retry |
| Users blocked while saving | Long-running writes locking data | Smaller batches, off-peak schedule | Longer total runtime |
| Load increases during outages | Immediate retries | Backoff with jitter, circuit breaker | Slower recovery of lost work |
| Unknown source of load | Shared credentials | One service account per integration | Some credentials to manage |
A Hypothetical Example
Imagine a CRM that becomes sluggish for ten minutes at the start of each hour. Investigation shows that a marketing connector checks the entire contact table for changes every hour, and a separate billing connector, set to the same schedule, requests each account individually to refresh balances. Both are using the same shared API login.
The team gives each integration its own account, which immediately reveals that those two callers account for most hourly traffic. They change the marketing connector to fetch only records modified since its last run, switch the billing connector to a bulk request, and stagger the schedules by a few minutes. The hourly slowdown disappears without any change to servers. The fix cost a few hours of careful work and no new hardware.
Make It Last
Set up monitoring on API volume per account, with an alert when a caller exceeds its normal range. Add a lightweight review step to your process for new integrations: expected request volume, schedule, batching approach, and owner. A short checklist at approval time prevents the next unnoticed polling loop.
Finally, test integration behaviour on staging with realistic data volumes, because a connector that behaves with a few hundred test records can behave very differently against a real dataset.
Frequently Asked Questions
How do I tell whether integrations or users are causing the load? Compare request logs grouped by account and by time. If service accounts dominate during the slow periods, or the slowness follows a schedule, integrations are likely involved. Separate service accounts per integration make this much easier.
Should I just raise the API limits? Rarely as a first move. Higher limits let a badly behaved caller do more damage. First make the traffic efficient with batching, incremental sync and sensible schedules, then adjust limits to match genuine need.
Are webhooks always better than polling? Often more efficient, but they require reliable receiving endpoints and a plan for missed or duplicated events. Many teams combine them with an occasional reconciliation check to catch anything dropped.
What is a safe batch size? It depends on your system, record size and the vendor’s limits, so there is no universal number. Start modestly, measure the effect on interactive performance, and adjust. Check the vendor’s current documentation for any stated maximums.
Do we need an API gateway? Not necessarily. It becomes valuable when many integrations call the CRM and you want central limits, logging and authentication. For a handful of well-behaved callers, the CRM’s native controls may be enough.
Next Step
List every system that calls your CRM, give each its own service account if they do not already, and sort last week’s request volume by account. The top three callers are where to start.
By CRMServerNest Editorial · Updated November 4, 2026
- CRM API limits
- integration performance
- rate limiting
- batch processing