Setting the file. One moment.
Skill 104 · Resolving Ingestion Warnings
Subchapter 104.13
references/fixing-message-size-too-large.mdMarkdown7 KBView on GitHub
The event was dropped during ingestion — it never reached PostHog’s events table — because the fully-enriched Kafka message exceeded the ~1MB size limit.
Category size, severity error: this is data loss, not a cosmetic warning.
There are two distinct failure modes, and they look completely different from the app’s side:
source = capture, pipeline_step = capture_validation, and on the legacy endpoints the count covers the whole rejected batch); request-body-level 413s still produce no warning.The total budget is shared: event properties + person properties + group properties < ~1MB.
Three consequences:
$group_set) makes every event tagged with that group undeliverable — potentially across many users at once. Many users affected simultaneously is the signature of a group-side cause.posthog:execute-sql: SELECT timestamp, details FROM system.ingestion_warnings WHERE type = 'message_size_too_large' AND timestamp > now() - INTERVAL 7 DAY ORDER BY timestamp DESC LIMIT 20 (or the Ingestion warnings page under Data management). The details JSON carries event_uuid and distinct_id; pipeline_step is emit-event (single event), flush (batched person/group writes), or capture_validation (raw event rejected at capture before enrichment — the fix is the event payload itself, not person/group properties).posthog:persons-list (filter by the sampled distinct_id) to fetch the person behind it first, then read the pattern at the person level:
posthog:execute-sql: SELECT length(properties) FROM events WHERE event = '<name>' ORDER BY timestamp DESC LIMIT 10. Anything in the hundreds of KB means the event is (most of) the problem.posthog:execute-sql: SELECT length(properties) FROM persons WHERE id = '<person_id>'.$groups, inspect each group’s properties the same way — a single fat group poisons every event that references it.$set / groupIdentify sites feeding those properties: base64 blobs, file contents, entire API responses, or unbounded accumulation (interaction_1, interaction_2, …) are the usual suspects.The fix is always the same shape: send references, not payloads, and keep person and group properties bounded.
$set, or $group_set. Store them in your own storage and send an ID or URL.$unset cleanup of the oversized keys is needed — until then that person’s events keep being dropped even after the code fix. $unset deletes person data irreversibly and cohorts/flags/filters may depend on those properties, so propose it to the user and get their approval; run it as a throwaway one-off, never as shipped application code. Load fixing-person-properties-size-violation for the full cleanup procedure.groupIdentify with the oversized keys set to small values (group properties are overwritten per key) and let the user decide.Per SDK, the bug usually looks like:
posthog.capture('x', { document: bigString }), posthog.setPersonProperties({ history: bigObject }), a large register() payload attached to every event, or posthog.group('org', id, bigSettingsObject).client.capture({ properties: { $set: wholeCrmRecord } }) in sync jobs; response bodies logged into properties; client.groupIdentify({ properties: bigObject }).posthog.capture(..., properties={'payload': json.dumps(obj)}) with unbounded obj; $set in identify() or group_identify() carrying full profiles.system.ingestion_warnings with posthog:execute-sql (filter type = 'message_size_too_large', timestamp after your fix) — the count for the affected distinct IDs must stop growing. Warnings are debounced per team+type, so judge by “no new occurrences over a real usage window”, not by the historical count going down (it won’t).