Skip to content

feat(workflows): show push metrics in the workflow Metrics tab - #71078

Merged
dmarchuk merged 3 commits into
masterfrom
claude/push-metrics-tab
Jul 16, 2026
Merged

feat(workflows): show push metrics in the workflow Metrics tab#71078
dmarchuk merged 3 commits into
masterfrom
claude/push-metrics-tab

Conversation

@dmarchuk

@dmarchuk dmarchuk commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Problem

The workflow Metrics tab has a curated summary for email steps (Sent / Delivered / Opened / Bounced / …) but nothing for push steps — a push step fell through to the generic Success/Failure tiles, so push counts were only reachable via a raw metric_name breakdown. Now that the observability backend emits push metrics (push_sent / push_skipped / push_failed), we can surface them the same way email is.

Changes

  • WORKFLOW_PUSH_METRICS — Sent / Skipped / Failed, with plain-language descriptions that are honest about push's limits:
    • Sent means the provider (FCM/APNs) accepted the notification for delivery, not that the device displayed it.
    • Skipped = recipient had no registered device token, or the provider reported the token dead (app uninstalled) and it was removed.
    • Failed = couldn't send (bad credentials, rejected payload, provider outage after retries).
    • There is deliberately no delivered/opened/clicked: unlike email's SES webhook, FCM/APNs respond synchronously and have no delivery-receipt channel.
  • PushMetricsSummary — a tile + trend component mirroring EmailMetricsSummary, rendered in the Metrics tab for a selected function_push step. These tiles reuse the trend series the metrics view already fetches (getSingleTrendSeries('push_sent'), etc.) — no extra data loading.
  • Push table on the Metrics Overview — a per-action PUSH table (Sent / Skipped / Failed, one row per push step) rendered below the existing email table, mirroring email's emailMetricsRows. It adds a pushTotalsByActionId loader and pushMetricsRows selector that mirror the email equivalents, plus an isPushAction guard. It renders only when the workflow actually has a push step (so email-only flows don't get an empty push section).
  • The per-step editor line graph (HogFlowEditorPanelMetrics.tsx) curates push labels and colors, the same way it already does for email.
pr71078-overview-push-table

How did you test this code?

Manual, in the browser (local dev, real data):

  • Verified against a workflow with a real push step: both the per-step Push view (select the push step from the Metrics dropdown) and the new Overview PUSH table render the three tiles/columns with real counts — Sent 57 / Skipped 20 / Failed 3 — matching the underlying app_metrics for that step. The push table sits below the email table on the Overview and hides on flows with no push step.

Static checks:

  • Frontend typecheck clean on the changed files (the new kea selectors typecheck against a regenerated *LogicType.ts; that file is gitignored, so CI regenerates it).
  • oxfmt / oxlint clean on all changed files.

Tests: no new unit tests. The Overview push selectors (pushMetricsRows, mapPushMetricsToActions) mirror the email emailMetricsRows / mapEmailMetricsToActions path one-to-one, and the tiles are static config maps — the value bar (a regression no existing test catches) isn't met by a render test here. CI's typecheck plus a reviewer's eyes on the rendered tab are the backstop.

Automatic notifications

  • Publish to changelog?
  • Alert Sales and Marketing teams?

Docs update

No docs change — this surfaces existing metrics in the existing Metrics tab UI.

🤖 Agent context

Autonomy: Human-driven (agent-assisted). Directed by the requester (session owner); a maintainer should set the DRI.

Authored with Claude Code, as the frontend follow-up to the merged push-observability backend work (#70913). I mapped how email's Metrics-tab summary is built (workflowMetricsSummaryLogic.ts, EmailMetricsSummary.tsx, WorkflowMetrics.tsx, WorkflowMetricsSummary.tsx, HogFlowEditorPanelMetrics.tsx) and mirrored it for push across the per-step summary, the editor panel, and the Overview per-action table.

Note: push metrics currently surface for steps typed function_push (how the editor creates push steps today). Legacy push steps stored as a generic function with the native-push template won't light up the push summary — not a concern while push isn't enabled anywhere yet, but worth knowing if older flows exist.

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

🤖 CI report

⚠️ Bundle size — 🔺 +3.1 KiB (+0.0%)

Uncompressed size of every built .js bundle, compared against the base branch.

Total: 64.78 MiB · 🔺 +3.1 KiB (+0.0%)

File Size Δ vs base
posthog-app/_parent/products/workflows/frontend/Workflows/WorkflowScene.js 122.8 KiB 🔺 +3.1 KiB (+2.6%)

Posted automatically by build-bundle-size-report · uncompressed bytes from dist-report

Eager graph — within budget

How much code each root ships on the eager path — downloaded and parsed before the surface is interactive. Measured from the esbuild output chunks (post-tree-shake, static imports only); lazy import() / React.lazy chunks are not counted.

Root Eager (shipped) Δ vs base Budget
entry (logged-out pages, app bootstrap)
src/index.tsx
1.22 MiB · 22 files no change ███░░░░░░░ 28.4% of 4.29 MiB
authenticated shell (every logged-in page)
src/scenes/AuthenticatedShell.tsx
8.13 MiB · 2,978 files 🔺 +52 B (+0.0%) █████████░ 87.9% of 9.25 MiB

🟢 node_modules/monaco-editor/ stays out of src/index.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 node_modules/monaco-editor/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx

Largest files eagerly shipped from src/index.tsx
Size File
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
24.6 KiB ../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js
6.3 KiB ../node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.production.min.js
4.5 KiB ../node_modules/.pnpm/@jspm+core@2.1.0/node_modules/@jspm/core/nodelibs/browser/process.js
3.9 KiB ../node_modules/.pnpm/scheduler@0.23.2/node_modules/scheduler/cjs/scheduler.production.min.js
1.4 KiB ../node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js
1.3 KiB src/RootErrorBoundary.tsx
912 B ../node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js
789 B src/scenes/ChunkLoadErrorBoundary.tsx
762 B src/index.tsx
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx
Size File
281.3 KiB ../node_modules/.pnpm/posthog-js@1.402.3/node_modules/posthog-js/dist/rrweb.js
267.7 KiB ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
235.5 KiB src/taxonomy/core-filter-definitions-by-group.json
222.9 KiB ../node_modules/.pnpm/posthog-js@1.402.3/node_modules/posthog-js/dist/module.js
164.0 KiB src/queries/validators.js
154.3 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
105.8 KiB src/lib/api.ts
93.3 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
92.7 KiB ../packages/quill/packages/quill/dist/index.js

Posted automatically by check-eager-graph · sizes are eager output bytes (shipped, post-tree-shake) from the esbuild metafile · part of #32479

Dist folder size — 🔺 +16.6 KiB (+0.0%)

Total size of the built frontend/dist folder (all assets), compared against the base branch.

Total: 1312.50 MiB · 🔺 +16.6 KiB (+0.0%)

@trunk-io

trunk-io Bot commented Jul 15, 2026

Copy link
Copy Markdown

Static BadgeStatic BadgeStatic BadgeStatic Badge

View Full Report ↗︎Docs

The Metrics tab had a curated summary for email steps (Sent / Delivered /
Bounced / ...) but nothing for push steps — push counts were only reachable via
a raw metric_name breakdown. Now that the backend emits push metrics under
metric_kind 'push' (push_sent / push_skipped / push_failed), surface them the
same way email is.

- Add WORKFLOW_PUSH_METRICS (Sent / Skipped / Failed) with plain-language
  descriptions honest about push's limits — "Sent" means the provider accepted
  the notification, not that the device displayed it; there's no
  delivered/opened/clicked because FCM/APNs have no delivery-receipt channel.
- Add a PushMetricsSummary tile+trend component mirroring EmailMetricsSummary,
  and render it in the Metrics tab for function_push steps.
- Curate the per-step editor line graph for push (labels + colors) the same way
  it already does for email.

No new data loading — the tiles read the trend series the metrics view already
fetches, so this is presentation only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bbav6vE7Tm24KkdRhZmvNM
@dmarchuk
dmarchuk force-pushed the claude/push-metrics-tab branch from ef66138 to 8cf5e2a Compare July 15, 2026 17:55
@dmarchuk
dmarchuk marked this pull request as ready for review July 15, 2026 21:33
@pr-assigner-resolver-posthog
pr-assigner-resolver-posthog Bot requested a review from a team July 15, 2026 21:34
@greptile-apps

greptile-apps Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Reviews (1): Last reviewed commit: "feat(workflows): show push metrics table..." | Re-trigger Greptile

@github-actions

github-actions Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

🦔 Hogbox preview · ✅ ready

▶ Open the preview

🔑 Login test@posthog.com / 12345678 (demo data)
🧩 Running this PR's backend and frontend, on the PostHog :master base
🔗 Link stable across rebuilds — a re-push swaps the box underneath, the URL stays
🔒 Access tailnet only (PostHog VPN)
🛠️ Admin inspect & debug state in hogland
💤 Idle sleeps after ~30 min idle (snapshot to S3, zero node cost) and wakes on your next visit in ~30s, behind a brief "waking up" screen

commit ff0f0dd · box box-bfdf151d4079 · ready in 762s (push → usable) · build log · rebuilds on every push, torn down on close

@dmarchuk
dmarchuk merged commit 4c82e59 into master Jul 16, 2026
204 checks passed
@dmarchuk
dmarchuk deleted the claude/push-metrics-tab branch July 16, 2026 08:06
@deployment-status-posthog

deployment-status-posthog Bot commented Jul 16, 2026

Copy link
Copy Markdown

Deploy status

Environment Status Deployed At Workflow
dev ✅ Deployed 2026-07-16 08:35 UTC Run
prod-us ✅ Deployed 2026-07-16 08:47 UTC Run
prod-eu ✅ Deployed 2026-07-16 08:50 UTC Run

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants