PSA rate limits and dead-letter jobs
Both PSAs protect themselves from heavy callers, in different ways. Autotask enforces an hourly request budget on your Autotask database — roughly 10,000 API calls an hour — shared by every integration talking to it, not just Current; it also deliberately slows callers down as the budget fills (about half a second of extra latency per call past 50% utilization, a full second past 75%). ConnectWise publishes no fixed quota at all — it throttles bursts as they happen, answering with a 429 and a Retry-After. Current is built to stay well inside both without your attention. Here's what it does, and what to do when a job still dies.
Built-in protection
- +PSA requests ride out transient failures: on a 429 (rate limited) or any 5xx, Current retries with exponential backoff plus jitter, and honors the Retry-After header when the PSA sends one. On Autotask, reads retry up to four times, writes up to three, cheap count calls up to two; the ConnectWise client follows the same pattern, and additionally keeps only a small number of requests in flight at once. The jitter matters — it stops several concurrent pulls from retrying in lockstep and re-triggering the limit.
- +Every individual request also carries a hard network timeout (on Autotask, ConnectWise, and HaloPSA alike), so a PSA call that simply hangs can never eat the whole sync cycle — the run moves on and the slow entity resumes on the next cycle.
- +CRM records (companies, contacts, opportunities, notes, charges, tickets) get a reserved slice of every sync cycle, and both workspaces and record types are scheduled stalest-first — whatever has waited longest syncs next — so nothing can be starved indefinitely behind a heavy project pull.
- +On Autotask, before each 5-minute change poll, Current reads your live usage and simply defers the run when the budget is 80% or more spent, rather than piling on and eating the latency penalty. (ConnectWise has no readable budget — pacing there is reactive, driven by its throttle responses.)
- +Large pulls pause rather than fail. When the PSA throttles — or the run's own time budget runs out mid-pull — the run is reported as partial and picks up on the following cycle. Core entities report “Synced N records so far — large workspace, run Sync again to finish the rest,” and each per-entity row on the sync health page records the specific reason it paused (for example, which record failed to save, or that the request budget ran out) rather than a generic message.
- +Failed jobs retry on a growing delay, up to 5 attempts, before dead-lettering — and a job that failed specifically because of a rate limit waits roughly twice as long each round as an ordinary failure.
- +Every call Current makes is counted and attributed to your workspace, which is what feeds the usage readout on the sync health page.
Watch your usage
Go to Integrations → your PSA's card → Sync details. The Live telemetry card shows Current's own calls this hour. On Autotask it's drawn against the shared ceiling, and the bar turns amber around 7,000 calls with a plain note that Current may pace its syncs to stay under the limit — if that bar is high and you know Current isn't doing anything heavy, another tool is spending your budget (see the warning below). On ConnectWise there's no ceiling to draw, so the readout is a plain counter; sustained throttling shows up as retrying jobs instead.
How the retry schedule actually works
Each failure re-queues the job further out. The clock doubles every attempt, and rate-limit failures back off harder — on Autotask because the budget is hourly, on ConnectWise because a burst that just got throttled will get throttled again. Hammering it sooner just fails again.
| Failure | Next attempt (ordinary error) | Next attempt (rate limited) |
|---|---|---|
| 1st | ~2 minutes later | ~4 minutes later |
| 2nd | ~4 minutes | ~8 minutes |
| 3rd | ~8 minutes | ~16 minutes |
| 4th | ~16 minutes | ~32 minutes |
| 5th | Dead letter — parked for an admin | Dead letter — parked for an admin |
Retrying a dead-lettered job
- 1Read the error firstIntegrations → your PSA's card → Sync details → Recent jobs. Each row shows the attempt count as attempts/max (for example 3/5) and the last error message, stored as its first 500 characters — hover the error to read the stored text. An auth failure needs a credential fix, not a retry — retrying it just burns five more attempts and more of your request budget.
- 2Fix the causeExpired secret, a disabled API user, or a revoked key pair → re-enter the credentials on your PSA's card and press Test connection. Deleted PSA record → archive the Current side (the “Removed in your PSA” panel lists these). Throttling → just wait; Autotask's limit is hourly and refills on its own, and ConnectWise's burst throttle clears within moments.
- 3Press RetryThe job re-enters the queue immediately with its attempt counter reset to zero, and the next drain cycle picks it up within 5 minutes. Re-running a pull is safe — records are matched on their PSA id and updated in place rather than duplicated.
- 4Confirm it clearedThe Failed / dead-letter tile at the top of the page should fall back to zero, and the entity's row in Per-entity sync should show a fresh last-success time.
Symptom → cause
| What you see | Most likely cause | What to do |
|---|---|---|
| Syncs feel slow but nothing fails | Autotask is injecting latency because the shared hourly budget is over 50% used (Autotask only) | Check the usage gauge. If it's high and Current is idle, find the other integration spending it. |
| An entity reports a partial run for several cycles | Throttling or wall-clock truncation on a large workspace | Expected — it resumes each cycle. The CRM refresh (companies, contacts, opportunities, notes, charges) now serves whichever record type is most out of date first, so a lagging one catches up on its own within a few cycles. Press Sync now to continue immediately. |
| Change polls appear to skip | Current deferred the poll — Autotask's budget was 80%+ spent | Nothing to fix. It resumes once the hour rolls over. |
| A job dead-lettered with an authentication error | Credentials changed, or the PSA API user lost a permission | Fix the credentials, then Retry. Retrying alone will not help. |
| A job dead-lettered with a 404 or “not found” | The PSA record was deleted — or, on ConnectWise, it's outside the API Member's security-role scope (ConnectWise answers both the same way) | Retry will keep failing. On ConnectWise, check the security role before concluding the record is gone; otherwise archive or delete the Current side. |
| Repeated 429s all day | Another tool shares the same API identity, or an import is running | Give Current its own API user or API Member and stagger heavy imports. |
| The usage gauge reads zero but sync is stalled | This isn't a rate-limit problem — the worker isn't running | Check the background-job heartbeats on the same Live telemetry card. See “Reading the sync health dashboard (and fixing a stale sync).” |
Related reading: “How often does Current sync? Every schedule, in one table” for what runs when, “Connect Autotask and choose what syncs” or “Connect ConnectWise PSA and choose what syncs” for the credential and permission setup that causes most auth-related dead letters, and “Fix a sync conflict between Current and your PSA” for failures that are about your data rather than throttling.
