A Post is not a Doc — the structural snapshot is copied at creation so the version that earned the numbers is the one that went out.
A Post is not a Doc. A Doc is the artwork; a Post is one publication of it, so the same carousel can go to LinkedIn on Tuesday and Instagram on Friday as two records with two sets of numbers.
Post { id, docId, title, stage, platform,
framework, slideCount, hook, styleId, // the structural snapshot
scheduledFor, postedAt, url, caption, notes, metrics,
createdAt, updatedAt }The structural fields are copied at creation, not looked up through docId, because the document keeps being edited and the version that earned the numbers is the one that went out.
| Stage | Hint |
|---|---|
idea | A thought, not a carousel yet |
drafting | Being written or designed |
ready | Finished, waiting for a slot |
scheduled | Has a date |
posted | Live, collecting numbers |
Entering posted stamps a date; leaving it clears the date again. A post sitting in "drafting" while still carrying postedAt would keep feeding the baseline — a bug nobody notices and everybody acts on.
isMeasured requires stage posted, a postedAt, a metrics object and non-zero reach. Every ratio downstream divides by reach, so zero has to be turned away at the door.
Seven metrics are entered by hand, each labelled with the platform’s own word for it, because the fastest way to make manual entry hurt is to make people guess which number goes in which box. engagements = likes + comments + shares + saves — clicks and follows excluded.