Repository navigation
docs(marketing): sweep the pre-#597 engagement vocabulary off three more pages - #1850
Conversation
…ore pages `marketing/campaigns`, `guides/email-and-calendar` and `marketing/index` — all three locales each — still described the campaign member #597 removed: the `opened` / `clicked` / `bounced` statuses and the `first_opened_date` / `first_clicked_date` stamps. `crm_campaign` never had an open or click column at all; its rollup block is `num_sent` · `num_responses` · `num_leads` · `num_converted_leads` · `num_opportunities` · `num_won_opportunities` · `actual_revenue` (`CAMPAIGN_METRIC_FIELDS`, campaign.hook.ts:312-320) plus the `response_rate` and `roi` formulas. Campaigns: - the record-sections table named an `Engagement` *(rollup)* section holding "opens, clicks, responses, conversions". The detail screen is derived from the object's six field groups (campaign.object.ts:37-43) and the table now names them; the ROI cross-reference in the views section moves from a `Costs` section that does not exist to `Budget & ROI`; - "Measuring a campaign" claimed a right-hand panel with an Open rate, a Click rate, a Conversion rate and a Pipeline value — none of them a field, and the surviving `Response rate` / `Conversion rate` bullets imported a `status >=` ordering the four-value picklist does not have. Rewritten over the real counters, `num_responses` quoted as the hook's own predicate (members at `responded` OR `converted`) and `response_rate` as its formula over `num_sent`, with a callout stating that no open, click or conversion rate exists; - the In Progress status row and the sales-rep tip drop "engagement" for what a member records. Email & Calendar: the sentence certifying First Opened / First Clicked as "the one adjacent thing that *is* real" — inside a section otherwise honest about what is not shipped — now names the response a member does record, its two writers, and the absence of any open/click/bounce status. Marketing Cloud overview: two claims stronger than the ones this card was filed for. The life cycle had members moving through Sent → Opened → Clicked → Responded → Converted, and "what the system does for you" promised that opens, clicks and bounces update the member status automatically. Both are rewritten against the four shipped statuses and their real writers. zh-Hans takes its status nouns from the zh-CN pack (已发送 · 已响应 · 已转化 · 已退订); zh-Hant mirrors them in each page's own Traditional conventions (已發送 · 已回應 · 已轉化 · 已退訂), per PR #1846. No metadata change: the doc surface catching up with #597. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuzfS5chho38Yx1jxx9DEj
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
PM review → accepted, auto-merge armed. Open question ruled: A.CI 9/9 green on Four of this PR's findings were outside what the card and my dispatch measured, and they are the reason the card was worth more than its filing. I re-derived the load-bearing ones myself before arming:
⭐ Deleting The guard table is now the house standard for this class — nine guards named, each with the reason it stayed green, plus two ablations (a broken anchor reds Ruling — should
|
Fixes #1844
Nine files —
marketing/campaigns,guides/email-and-calendarandmarketing/index, three locales each — still described the campaign member #597 removed. Rewritten against what the metadata declares today:crm_campaign's rollup block isnum_sent·num_responses·num_leads·num_converted_leads·num_opportunities·num_won_opportunities·actual_revenue(CAMPAIGN_METRIC_FIELDS,campaign.hook.ts:312-320) plus theresponse_rateandroiformulas, and the member picklist shipssent·responded·converted·unsubscribed.⭐ The dispatch's sharpening, and one the dispatch did not make
The PM's sharpening is discharged:
Response rateandConversion ratewere not left standing.≥ Respondedis gone,num_responsesis quoted as the hook's own predicate, and Conversion rate turned out not to be a field at all — checked againstnum_converted_leads/num_opportunitiesas instructed, and replaced by them rather than restated.⭐
marketing/indexwas carrying two claims stronger than the ones this card was filed for, and neither the filing nor the pre-dispatch re-measurement reached them — both are outside the:15line the card names::28— "Track engagement — members move through Sent → Opened → Clicked → Responded → Converted." The whole phantom monotonic ladder, written out as the product's life cycle.:35— "Automatic status updates — opens, clicks, bounces, unsubscribes update the member status as engagement happens." This is the #1846 admin-tip class: it does not merely name absent values, it promises an automatic writer for three statuses that do not exist, on the page a reader lands on first.So
marketing/indexwas never only a wording call. The:15wording is settled too (engagement status → how each of them responded), which was the ruling; the two false claims above are what actually needed the pass.Per file — what was rewritten, and where each new claim comes from
marketing/campaigns.mdx(+.zh-Hans/.zh-Hant):15status tablemark_responded(campaign.actions.ts:61-93) and the conversion sweep are the only writers:36-49record sectionscampaign.object.ts:37-43, each field's owngroup:; the form agrees atcampaign.view.ts:97-176). The page now says the detail screen is derived from them, which is why there is no hand-built page undersrc/pages/. A closing line states there is no Engagement section and no open or click column:76-88"Measuring a campaign"≥ Opened), Click rate (≥ Clicked), Response rate (≥ Responded), Conversion rate, Pipeline valuememberRows.length), Number of Responses (status === 'responded' || status === 'converted',campaign.hook.ts:140), Response Rate % (num_responses × 100 ÷ num_sent,campaign.object.ts:236-241), Number of Leads, Converted Leads, Opportunities Created, Won Opportunities, Actual Revenue, ROI % (:243-248). No right-hand panel: the numbers are in Performance, ROI in Budget & ROIactual_revenuesums closed-won amounts only, and the Actual Revenue bullet now says so explicitly:107:122rep tip> **A campaign has no open rate, click rate or conversion rate.**— states that the four statuses have no order between them, so "at or above Opened" is not a question the app can be askedguides/email-and-calendar.mdx:76(+ siblings)Was, inside a section whose whole point is honesty about what is not shipped:
Both fields were deleted by #597, so the sentence certified the phantom as the real part and offered a workaround — fill them by hand or by import — that cannot be performed. It now says what a member does record (a response), names its two writers (Mark Responded; that person's lead converting), and states there is no member status for an open, a click or a bounce.
marketing/index.mdx(+ siblings):3frontmatter and:8intro drop track engagement / track who engaged for responses / who responded.:15becomes "and how each of them responded" — the object's owndescription, "Membership and response tracking for marketing campaigns" (zh-Hans takes the pack's 「营销活动所触达的线索与联系人及其响应状态」).:28describes the four real values and says there is no ladder and no open or click step.:35becomes Automatic conversion tracking, naming the one status the app writes by itself (campaign_lead_conversion_refresh, which promotes only members stillsent/respondedand never anunsubscribedone) and attributing Responded and Unsubscribed to the people who set them.:37recomputes "as memberships change and as opportunities are attributed" rather than "as engagement happens".Chinese wording
zh-Hans takes its status nouns from the zh-CN pack — 已发送 · 已响应 · 已转化 · 已退订 (
src/translations/zh-CN/objects.marketing.ts:114-120) — and 「标记为已响应」 for the action (_actions.mark_responded.label). zh-Hant mirrors them in each page's own Traditional conventions — 已發送 · 已回應 · 已轉化 · 已退訂 — the ruling from PR #1846 (回應, not 響應: 響應 appears once in this whole corpus, onguides/mobile.zh-Hantin the "responsive layout" sense). Field and section names stay English on both Chinese pages, which is what those pages already do and whatcampaign-members.zh-Hans's field table does. 著陸頁 rather than a coined 到達頁, matching the two existing zh-Hant uses.Docs guards — checked before deleting any string, and measured
No guard pins any string this PR removes. A sweep of
test/andscripts/forOpened|Clicked|Bounced|Open rate|Click rate|Conversion rate|Pipeline value|互动|互動returns onlyCasesOpenedByDayPriorityReport(an unrelated service report) andseed-consistency.test.ts'sUNWRITTEN_FIELDS/ "never seeds an opened / clicked / bounced status", which read seed rows, not docs.The guards that do read these pages, and why each stayed green:
docs-anchor-links.test.ts#measuring-a-campaign, resolves to the heading that keeps its wording. Ablated: breaking it to#measuring-a-campaign-does-not-existturns the guard red namingcampaigns.mdx:45; restored, 18/18 passdocs-locale-callouts.test.tscampaigns.zh-Hant.mdx: 0 callout(s), but campaigns.mdx has 1docs-object-coverage.test.tscrm_campaign: { page: 'marketing/campaigns' }meta*.json, and still names the object's termdocs-view-rosters.test.ts'content/docs/marketing/campaigns.mdx': 'crm_campaign'docs-conversion-rate-spelling.test.tsdocs-object-term-consistency.test.tscrm_caseandcrm_quoteonly — campaign is not in it, which is the caveat PR #1846's review already recordeddocs-setup-navigation-names.test.ts**App → …**citations, incl. this email guide's two Traditional surface-denialsdocs-metadata-counts.test.ts,docs-src-tree-paths.test.tssrc/paths these pages nameNothing would have caught this drift — the same finding #1829 recorded, now measured on two further page families. ⛔ Per epic #1579's fence, no guard is added here; the question is already with the maintainer from PR #1846's review, and this PR is a second data point for it rather than a second attempt to answer it.
Verification
pnpm verifyrun stage by stage on the committed tree, every exit code captured before any pipe:pnpm validatecrm_campaignpnpm typecheckpnpm lintpnpm lint:i18n-gate✓ i18n lint gate: 0 i18n/missing-* issuespnpm hygiene✓ source hygiene clean(its control-byte scan readscontent/)pnpm hygiene:tokens✓ source token ratchet cleanpnpm builddist/objectstack.json (1913.9 KB)pnpm testTest-file / test counts are identical before and after: 165 / 3455 passed / 1 skipped on the pre-change tree at
90ae658, and the same on this commit. No test file added or removed — nothing intest/**is touched.An extra control-byte sweep over the nine edited files plus the changeset (
grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]') returns no hits, and every markdown table on the edited pages has a uniform column count.The Docs App workflow (the only thing that compiles these MDX pages,
apps/docs, its own lockfile) is declared to CI: it runs on this PR through thecontent/docs/**path filter.Scope
⛔ No metadata change — #597 removed the member's tracker columns because nothing wrote them, and the campaign never had open/click columns at all. ⛔ Nothing in
test/**. ⛔ Nocontent/docs/releases/edit. Nine docs files plus the changeset, nothing else.Out of scope — filed, not fixed here
analytics/cubesandanalytics/reportstoo — six more files, a third surface family #1847 — ⭐ a third surface family carries the same Campaign member lifecycle: support contacts, live metrics, and trim tracker fields that have no writer #597 stamps, six more files:analytics/cubes.mdx:72andanalytics/reports.mdx:95(+ both.zh-Hans/.zh-Hant) still say "crm_campaign_memberstamps First Opened, First Clicked, Response Date and Responded per member", andanalytics/reports.mdx:98carries the ungreppable paraphrase — "the opens, clicks and responses are stamped on each member record". They are outside this dispatch's nine files and both pages are pinned bydocs-conversion-rate-spelling.test.ts, so widening into them here would have put a guarded page in a diff that was not measured for it.🤖 Generated with Claude Code
https://claude.ai/code/session_01DuzfS5chho38Yx1jxx9DEj
Generated by Claude Code