diff --git a/src/app/(mobile-ui)/dev/journey/EmailCard.tsx b/src/app/(mobile-ui)/dev/journey/EmailCard.tsx
new file mode 100644
index 0000000000..81ae14b42f
--- /dev/null
+++ b/src/app/(mobile-ui)/dev/journey/EmailCard.tsx
@@ -0,0 +1,34 @@
+'use client'
+
+import { JOURNEY_API_BASE } from './journeyData'
+import type { SpecEmailStep } from './journeyTypes'
+
+/**
+ * Compact card for one lifecycle email step. Links to the API's live rendered
+ * preview (opens in a new tab against the sandbox API).
+ */
+export default function EmailCard({ step }: { step: SpecEmailStep }) {
+ return (
+
+ {step.preview}
+ {step.ctaText}
+ → {step.ctaPath}
+ {step.type} · preview ↗
{finding.detail}
++ {finding.sourceFiles.join(' · ')} +
+{state.description}
+No activation-specific surface.
+ )} + +{specError}
} + {spec && state.includesWelcome && ( + <> ++ On signup (immediate): +
++ stage {stage.stage} —{' '} + {stage.predicate} +
+ {stage.steps.map((step) => ( ++ {state.noEmailReason ?? 'No lifecycle email in this state.'} +
+ )} + +{specError}
} + {spec && + (state.includesPushReminder ? ( + spec.pushReminders.map((push) => ( +{push.note}
++ {push.type} · {push.channels.join(' + ')} +
+—
+ ))} ++ The API spec reports stages this board doesn't map to a column yet — update + FUNNEL_STATES.specStages in journeyData.ts: +
+{unmappedStages.map((s) => s.stage).join(', ')}
+{surface.copy}
+ {surface.cta && ( ++ {surface.cta.label} + → {surface.cta.dest} +
+ )} +{surface.condition}
+ {surface.note &&{surface.note}
} +{surface.sourceFile}
++ signed up {new Date(result.user.createdAt).toLocaleDateString()} · card access{' '} + {result.user.cardAccessGrantedAt + ? new Date(result.user.cardAccessGrantedAt).toLocaleDateString() + : 'not granted'} +
++ Current nudge:{' '} + {dueLabel} +
+ +Nothing sent or attempted yet.
+ ) : ( +| event | +channel | +status | +skip | +sent | +
|---|---|---|---|---|
| {row.eventType} | +{row.channel} | +{row.status} | +{row.skipReason ?? '—'} | ++ {row.sentAt ? new Date(row.sentAt).toLocaleString() : '—'} + | +
{props.title}
+ {props.ctas?.map((c) => ( + + ))} +