Build1 distinct publisher2 min readUpdated
A six month backfill can land entirely on today with no error anywhere in the response. The docs ask for ISO 8601, and a number is accepted and then overwritten at ingestion.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
The same 200 covers two different failures, and only one of them leaves a hole in the data. A capture request with no `distinct_id` is not ingested at all, and PostHog's own capture docs say so while noting the 200 OK that comes back [3]. A request carrying a numeric epoch behaves worse than that: it is stored and counted, with the wrong date [2]. Nothing is missing afterwards, which is why nobody goes looking.
The trap is a type rather than a value. ISO 8601 is a string, `1770000000` is a number, and only the string is read; the linter's rule anchors on a date prefix instead of the digits [6][4]. Taken as seconds, that number is 2 February 2026 [13]. It is not nonsense, it is the wrong shape, and the ingestion clock wins.
According to the Pixellint maintainer's write-up, Segment's HTTP API expects the same ISO string, while Amplitude wants 13 digit milliseconds and reads a 10 digit seconds value as 1970 [7]. Run the arithmetic on the shared field: the same `1770000000`, read as milliseconds, is 21 January 1970 [12]. Note the asymmetry. A chart with points in January 1970 gets reported inside a day. A chart with six months of history stacked on today's date looks like a successful launch.
On a 500 row backfill the useful property is per row checking, so one bad row is one error with a row number attached rather than a gap found later in the middle of a file [9]. The same pass reads the envelope, where `api_key` has to be the project key from project settings and not a personal API key, before capture answers with a 401 [8].
Pixellint is independent of PostHog, and its rule ids cite the capture docs because that is where the requirement lives [5]. It matches PostHog capture paths and PostHog shaped bodies, and it will lint a fixture with no host at all [11]. What it cannot do is tell you what already happened to the events sitting in a project, and no request log will either. Between the three documented drop cases and the timestamp coercion, that is four ways for a capture call to end badly under an identical 200 [14].
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
PostHog documents the capture `timestamp` field as ISO 8601. An epoch number is a different type, capture still accepts the request, the historical value is not applied, and the event lands at ingestion time.
The example payload in the post carried "timestamp": 1770000000, and the suggested fix was an ISO 8601 value such as "2026-07-26T06:00:00Z".
Backfilling six months of "user signed up" events into PostHog through the capture API returned 200, and insights showed a spike today rather than a curve across 2025; the events were not missing but were stamped with the time PostHog received them.
PostHog's capture docs state that a missing event name, a missing distinct_id, or an empty distinct_id is not ingested, and that the endpoint still returns 200 OK.
Pixellint is an open source linter for pixels and analytics payloads maintained by the post's author; it is independent of PostHog, and its vendor/posthog pack contracts single capture and batch against PostHog's capture API docs page.
The pack raises vendor.posthog.body.timestamp.invalid when timestamp does not match ^[0-9]{4}-[0-9]{2}-[0-9]{2}[T ][0-9]{2}:[0-9]{2}:[0-9]{2}, and the validate run exits with code 1.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Reproducible but single-source and author-owned
The technical core is specific and checkable: a concrete payload, a named documented type, quoted rule ids and regex, CLI transcripts, and an explicit exit code. Against that, the entire cluster is one dev.to post written by the maintainer of the tool it recommends; PostHog's documented behavior is paraphrased rather than quoted verbatim with a version or date, and no second publisher, PostHog changelog, or third-party reproduction corroborates the epoch-to-ingestion-time overwrite. Derived arithmetic on the example epoch value checks out, which supports internal consistency but not external verification.
Availability only, no usage signal
The source establishes that the Pixellint PostHog pack exists and is installable via cargo or npm with a Node API and browser playground, but reports no downloads, dependent projects, teams using it, or PostHog-side incidence data. Availability is not adoption, and inferring uptake from install instructions would be a guess.
Mildly overstated tool framing, sober technical core
The failure-mode reporting is proportionate and even self-limiting: the author declines to add a rule for historical_migration, discloses independence from PostHog, and states that the docs are where the requirements live. The modest overstatement comes from the article's shape — a documented type mismatch is presented as a general instrumentation trap and resolved by the author's own tool, with install commands and a playground, while no evidence quantifies prevalence, rule coverage, or false positives. Nothing in the source contradicts the claims, so the gap is small rather than substantial.
Author-owned tool, disclosed
The post's author maintains Pixellint, the tool whose rulepack resolves the described problem, and the article ends with install commands, a Node snippet, and a playground link — a direct distribution incentive. Mitigating factors are real but partial: the tool is open source, independence from PostHog is stated outright, the rule ids cite PostHog's docs as the source of requirements, and the author explicitly refuses to extend rule coverage to the historical_migration flag.
Coherent and specific, but unverified and single-sourced
Confidence is limited by cluster structure rather than by internal quality: one publisher, one author, an author-owned remedy, and no independent confirmation of PostHog's ingestion behavior or its version scope. The claims are unusually falsifiable for a single-source post — named field types, quoted rule ids, a regex, an exit code, and arithmetic that checks out — which keeps confidence at the middle of the range instead of the bottom.
build
Segment's 200 means it got your bytes, not that your event shipped1 distinct publisher
product
A 2x LLM bill is not a bug report: token spend is an observability problem1 distinct publisher
build
Your .ai viewer is a pdf.js problem, and its worst bugs never throw1 distinct publisher
build
The NestJS default path puts the query inside the business rule, and nothing fails when it moves1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 21, 2026