rudder-destination-debugging — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited rudder-destination-debugging (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
This skill teaches how to diagnose and fix event delivery failures between RudderStack and a destination — covering dropped events, auth errors, rate limiting, transformation filters, and warehouse sync failures.
Requires RudderStack MCP connected. See rudder-mcp-setup if not yet configured.
Events travel through four stages before reaching a destination. Each stage can fail independently:
SOURCE SDK
│ events sent
▼
PROCESSOR TRANSFORM
│ maps event to destination format
│ applies user transformations
│ tracking-plan governance (block/log/forward)
▼
ROUTER / BATCH
│ groups events for efficient delivery
│ respects destination rate limits
▼
DATA DELIVERY
│ sends HTTP request to destination API
│ parses response code
├── 2xx ──► delivered ✓
├── 298 ──► filtered (transformation dropped it)
├── 299 ──► suppressed (tracking-plan governance)
├── 429 ──► throttled → retry with backoff
├── 4xx ──► aborted (permanent failure, no retry)
└── 5xx ──► retryable → auto-retry ┌─────────────────────┐
│ Events not at dest? │
└──────────┬──────────┘
│
┌────────────────┼──────────────────┐
▼ ▼ ▼
Source sending? Metrics show Errors present?
(check source failures?
event metrics) (check dest
event metrics)
│ │ │
▼ ▼ ▼
No events at Events sent but Get error messages
source → SDK not delivered → → see error
or connection check error log classification
issue belowAsk Claude:
"Show me event metrics for source \<source-name\> over the last hour"
If source volume is zero: the problem is upstream (SDK not firing, write key wrong, source disabled). Not a destination issue.
Ask Claude:
"Show me event metrics for destination \<dest-name\> — how many succeeded vs failed?"
| Metric | Meaning |
|---|---|
delivered | Accepted by destination API |
failed / aborted | Permanent failure — need manual fix |
retried | Temporary failure — RudderStack retrying automatically |
filtered | Dropped by transformation (status 298) |
suppressed | Blocked by tracking-plan governance (status 299) |
Ask Claude:
"What errors is destination \<dest-name\> producing?"
Match the error to the classification table in references/error-reference.md to determine the fix.
Ask Claude:
"Show me live events flowing through source \<source-name\>"
Compare what you see to what the destination expects. Auth errors, field name mismatches, and type errors often become obvious here.
Every delivery failure has an error category and an error type. These determine what action you need to take.
| Category | What it means | Where to look |
|---|---|---|
network | HTTP call to destination API failed | Destination error log, destination status page |
dataValidation | Event payload rejected by destination API | Live events — check field names, types, required fields |
transformation | User transformation threw or returned bad output | Transformation error log |
platform | RudderStack internal error | Contact support; usually transient |
| Error type | Retried? | What it means | What to do |
|---|---|---|---|
retryable | Yes, auto | Temporary network/server issue (5xx) | Wait; check destination status page |
throttled | Yes, auto with backoff | Destination rate-limited you (429) | Reduce event volume or request higher rate limit |
aborted | No | Permanent failure (4xx, bad credentials, bad payload) | Fix credentials or event data |
instrumentation | No | Event data violates destination schema | Fix SDK call — wrong field type or name |
configuration | No | Destination misconfigured in RudderStack | Fix destination settings (API key, URL, etc.) |
filtered | n/a | Transformation returned false or empty | Check transformation logic |
Key rule: If error type is aborted, it will never self-heal. You must fix the root cause.
Symptoms: High aborted count, errors mention "unauthorized", "invalid token", "forbidden".
Causes and fixes:
| Cause | Fix |
|---|---|
| API key expired or rotated | Update destination config with new key |
| Wrong account region/URL | Verify base URL in destination settings |
| Missing required OAuth scopes | Re-authorize the OAuth connection |
| IP allowlist blocking RudderStack | Add RudderStack egress IPs to destination allowlist |
Ask Claude:
"Show me the current config for destination \<dest-name\>"
Then open the destination in the RudderStack dashboard and update the credentials.
Symptoms: High aborted count, errors mention "invalid payload", "required field missing", "unexpected field".
Root causes:
revenue sent as a string "49.99" but destination expects a numberuserId but you're sending user_idDebug steps:
Symptoms: Events are retrying, errors mention "too many requests", "rate limit exceeded", "quota exceeded".
This is safe — RudderStack automatically retries with exponential backoff. No data is lost unless retries exhaust the retry window.
Actions if sustained:
Symptoms: filtered count is unexpectedly high; events leave source but never arrive at destination.
Cause: A user transformation returned false, null, or an empty array for the event — this tells RudderStack to drop it without delivery.
Ask Claude:
"Show me the transformation attached to destination \<dest-name\>"
Review the transformation logic for conditions that drop events unintentionally. Common mistake:
// Bug: returns undefined instead of the event when condition is not met
export function transformEvent(event, metadata) {
if (event.type === 'track') {
return event;
}
// Missing: should return event here for non-track events too
}Fix: ensure all code paths return the event (or explicitly return false only when you intend to drop it).
Symptoms: suppressed count in destination metrics, tracking-plan violation log shows blocked events.
Cause: Source's tracking plan is configured with unplannedEvents: block or violations: block, and the event doesn't match the plan.
Fix options:
rudder-cli apply or the Data Catalog skilllog instead of block if you want to allow unplanned events throughSymptoms: RETL sync shows errors, records not appearing in destination warehouse.
Ask Claude:
"Show me recent RETL syncs for source \<source-name\>"
Common causes:
| Error | Cause | Fix |
|---|---|---|
permission denied | Warehouse user lacks write permissions | Grant INSERT/UPDATE/MERGE on target table |
table not found | Table was dropped or renamed | Recreate table or update model SQL |
column type mismatch | Schema drift in source table | Update model or add a cast in SQL |
quota exceeded | Warehouse compute/storage quota | Increase warehouse capacity |
Symptoms: Events retrying with errors mentioning "internal server error", "service unavailable", "bad gateway".
This is safe — retries are automatic. Check the destination's status page to see if there is an ongoing incident. If errors persist beyond the retry window, contact support.
If events arrive but with high delay:
Ask Claude:
"Show me latency metrics for destination \<dest-name\>"
| p99 latency | Likely cause |
|---|---|
| < 1s | Normal |
| 1–5s | Destination API slow or batching delay |
| 5–30s | Significant destination slowdown or retry storm |
| > 30s | Destination incident or RudderStack retry queue backed up |
High latency on its own does not mean events are lost — events in the retry queue will eventually be delivered.
Ask Claude:
"List all my destinations and flag any that have failures in the last 24 hours"
Claude will call list_destinations + get_destination_event_metrics for each and surface a summary.
| Symptom | First thing to check | Likely fix |
|---|---|---|
| Events missing at destination | Source event metrics | SDK not firing or write key wrong |
High aborted count | Error messages | Fix credentials or payload |
High retried count | Destination status page | Wait for auto-retry or check rate limits |
High filtered count | Transformation logic | Fix transformation return value |
High suppressed count | Tracking-plan violations | Add event to plan or loosen governance |
| RETL records not syncing | RETL sync log | Permissions, schema drift, or table missing |
| High latency | Latency metrics | Destination incident or retry queue backlog |
See references/error-reference.md for detailed status code definitions and destination-specific patterns.
When working with destination credentials (API keys, OAuth tokens, write keys, access tokens):
$DEST_API_KEY or similar; never hardcode them in transformation code or configuration files.env files and ensure .env is listed in .gitignoreWhen inspecting live events, error payloads, and API responses:
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.