Intempt Docs
GuidesEvents

Failed events

See every tracked event the ingestion pipeline rejected, find out why, and export the records you need to fix and resend.

Overview

The Failed tab on the Events page lists every tracked event the ingestion pipeline accepted, then rejected while processing it. Each row shows when it was rejected, why, which source sent it, and the payload exactly as the pipeline received it.

Use it when an event you sent never shows up in the Table or Live view. The Live view shows what arrived. The Failed tab shows what arrived and was then thrown away.

📘 Good to know

A request the API refuses on the spot never reaches this tab. The sender gets that error back in the API response. The Failed tab only holds events that were accepted and later rejected during processing, which is why nothing else in the console would otherwise tell you about them.

How it works

Opening the Failed tab

Open Events in the main nav. The page has three tabs: Table, Live and Failed. Once you've opened it, the Failed tab shows how many failed events match the current search and filters.

The Failed tab on the Events page, with the search bar, Filter, Sort by and Export all 14 in the toolbar, and a table of failed events showing when each failed, the reason, source, event and a payload preview

Retention

Failed events are kept for 30 days, then removed. The line under the toolbar states the window. A rejected record older than that is gone and can't be listed or exported.

The table

ColumnWhat it shows
Failed atWhen the event was rejected during ingestion.
ReasonWhy the pipeline rejected this payload. See Rejection reasons.
EventThe event the record was headed for.
SourceThe SDK or integration that sent it.
PayloadA one-line preview of the record as the pipeline received it. Open the row for the full record.

The list is sorted by Failed at, newest first. You can flip it to oldest first from the sort control. Rejected records have no ID of their own, so rows can't be selected.

Searching and filtering

  • Search payloads… narrows the list to failed events matching the text you type.
  • Filter opens a panel with these fields:
FieldWhat it narrows to
From / ToA date range. Leave empty for Any date inside the retention window.
ReasonOne rejection reason.
SourceOne source.
EventOne event.

Each Reason, Source and Event option shows how many failed events it matches over the last 30 days, so you can see where the failures are concentrated before you pick one. The counts don't change with the dates, filters or search you set. Clear resets every filter.

If nothing matches, the table says No failed events match these filters. Widen the time range or clear a filter. If the window holds no failures at all, it says No failed events and Every event in this window was ingested. If the list can't load, it says We couldn't load failed events, with a Try again button.

Opening a failed event

Click a row to open the Failed event panel.

The Failed event panel for a checkout_completed event rejected as Invalid identifier value, showing the Reason block, the record's details, the formatted payload with Copy, and the Download record and Close buttons

  1. Summary line. When it was rejected and which source sent it, in the form Rejected 2 hours ago from followed by the source name.
  2. Reason. The rejection reason and a one-line explanation of what it means.
  3. Error message. The pipeline's own message, in full. It's shown only when the pipeline recorded one.
  4. Source and Collection. Where the record came from and which event it was meant for, when the record names them.
  5. Not fixed by resending. A note that appears on reasons the payload itself doesn't control. See Rejection reasons.
  6. Payload. The raw record, with JSON indented for reading. Copy puts it on your clipboard.
  7. Download record. Saves this one record as a JSON file.

The downloaded file carries these fields:

FieldContents
failed_atWhen the record was rejected
reasonThe rejection reason code
reason_detailThe pipeline's error message, or null
source_id / source_titleThe source that sent it
collection_id / collection_titleThe event it was headed for
errorThe same error message as reason_detail
raw_payloadThe record as received

Rejection reasons

ReasonCodeWhat it meansFixable in the payload?
No primary identifierno_primary_identifierThe record carried no eventId, objectId or productId, so it could not be placed.Yes
Invalid identifier valueprimary_value_invalidThe primary identifier must be a single non-empty string.Yes
Unreadable payloaddeserialization_failedThe request body could not be read as valid JSON.Yes
Duplicate identifierduplicate_eventThis identifier was already processed. Identifiers stay claimed for 7 days.No
Identity resolution incompleteresolution_incompleteThe record waited for related identifier items that never arrived.No
Reference not foundforeign_match_failedThe referenced record does not exist in the target collection.No
Unexpected item typeunexpected_item_typeThe item type is not one the pipeline handles.No
Identity conflictmerge_conflictThe identifier change was rejected because it conflicts with an existing identity.No
OtherotherThe pipeline rejected this record for a reason it does not classify further.No

For the three reasons marked Yes, the fix is in the payload you send: add the missing identifier, send it as a single non-empty string, or send valid JSON.

For the rest, the detail panel says so directly: This one is not fixed by resending. The pipeline rejected it for a reason the payload itself does not control. The pipeline can also mark an individual record either way, and the panel follows that mark over this table.

📘 There's no replay button, and that's on purpose

A record's eventId stays claimed for 7 days, even when the record is rejected. If you fix a payload and resend it under the same eventId inside those 7 days, it's dropped as a duplicate and lands back on this tab as Duplicate identifier. When you resend a corrected event, give it a new eventId.

Exporting failed events

Export when you need the records outside the console: to hand them to the developer who owns the integration, to fix and resend a batch, or to keep a copy past the 30-day window.

Start an export

  1. Set the search and the Reason, Source and Event filters the export should cover. The export uses them, so filter first.
  2. Click Export all N in the toolbar, or Export 1 event when only one matches. N counts the failed events matching your current search and filters. The button is disabled when nothing matches.
  3. In Export failed events, pick the From and To dates. These replace any dates set in the Filter panel, so the export can cover a different number of events than N. The range starts 7 days before today by default and runs to today.
  4. Click Start export.

The date picker only offers days your plan keeps data for. The note under it names your plan's retention window and the earliest date you can export from.

📘 Good to know

Your plan's data retention and the 30-day failed-events retention are separate. If your plan keeps data longer than 30 days, you can pick a date older than 30 days, but failed events from that date have already been removed and the export comes back empty for it.

Track and download it

Large exports are prepared in the background. You can leave the page and come back.

When an export you started from this browser finishes as a single file, the download starts on its own the next time the Failed tab is open. An export written in more than one part never downloads on its own. Download each part from the Exports list.

The arrow half of the export button opens the Exports list. While an export is running, it shows how many are in flight. A dot appears when one has finished and you haven't opened the list yet.

The Exports list opened from the export button, with one export Preparing and two Ready to download, each showing when it was requested and the date range it covers

The list holds every export the project still has, including ones teammates started. Each shows its status, progress and files. Exports you started from this browser also show when they were requested, how many filters they used and the date range they cover:

StatusWhat it means
QueuedWaiting to start.
PreparingBeing written, one day at a time. Progress reads as Day 3 of 7 (43%), with the rows written so far.
ReadyDone. Download the files.
FailedPreparing the file didn't finish. Run the export again.
CancelledYou cancelled it. Any parts already written are still listed.
ExpiredThe download links have expired. Run the export again to get a fresh file.
UnknownThe console couldn't read the status. Dismiss it, or run the export again.

An export is written in parts, and each part is its own file with its row count and size. A long export is partly downloadable while it's still running. The list says when the links expire.

Cancel stops a running export. Dismiss deletes an export and its files. Clear finished does the same for every export that's no longer running. A deleted export's files can't be downloaded again.

Send failed events to S3 on a schedule

To keep failed events past 30 days without exporting by hand, use a workflow. In the Write Parquet to S3 node, set What to export to Failed events. See Amazon S3 for how that source differs from Events and Records.

Use cases

  1. An event never shows up. You tracked checkout_completed from your backend, but it's not in the Live view. Filter the Failed tab by Event and Source to see whether it was rejected and why.
  2. Checking a new integration. After connecting a source, open the Failed tab, filter by that Source, and confirm the count is zero before you rely on its data.
  3. Finding a missing identifier. A spike in No primary identifier after a release usually means a code path stopped setting eventId. Open one row, look at the payload, and find the call site.
  4. Fixing broken JSON. Unreadable payload rows point at a sender that's building request bodies by hand. The payload shows exactly what arrived.
  5. Avoiding a silent resend failure. Before you replay a fixed batch, check that each record gets a new eventId, or the 7-day claim drops it as a duplicate.
  6. Handing a failure to a developer. Open the row, click Download record, and send the JSON file. It carries the reason, the error message and the raw payload in one place.
  7. Auditing one source after a release. Filter by Source and a date range to see what that integration sent that the pipeline rejected.
  8. Knowing when not to resend. For Identity conflict or Identity resolution incomplete, resending the same payload won't help. The panel says so, which saves a round of retries.
  9. Keeping a record past 30 days. Export the window before it ages out, or stream failed events to your own S3 bucket with a workflow.

Where to go next

On this page