A reminder campaign is a deep-copy of its parent's non-clicked recipients with NEW gift_tokens. Clicks on the reminder were flagging the CHILD recipient's gift_link_clicked but the parent campaign's counters never updated — operators had to check two campaigns to see the cumulative click rate. Hub: - New cascadeClickToParent() helper — when a recipient with parent_campaign_id is flagged as gift_link_clicked, mirror the flag + timestamp onto parent.recipients[parent_row_index] and broadcast a recipient-update SSE event so the parent's open page refreshes live. Adds a gift_clicked_via_reminder breadcrumb (the child campaign id) so the parent UI can show "↩ via la relance XXX". Idempotent — already-clicked rows are no-op. - Three cascade call sites: applyWebhookEvent fast path (CustomID), applyWebhookEvent fallback (msgId scan), handleGiftRedirect wrapper. - handleGiftRedirect also now sets gift_link_clicked=true on first successful redirect (Mailjet webhook can lag or drop; the wrapper redirect is the most reliable click signal we have). - GET /campaigns/:id now attaches a "reminders" array with summary counters for every reminder child of the campaign. Ops UI: - "Cette campagne est une relance" banner on child detail pages with a back-link to the parent. - "N relance(s) envoyée(s)" banner on parent detail pages with clickable chips showing each child's gift_clicked/total ratio. - Recipient table: 🔁 icon next to the gift-click indicator when the click came via reminder, plus a "↩ via la relance XXX" line in the tooltip so the operator can trace the engagement channel. One-time backfill applied on prod to mirror clicks that happened between reminder send and this deploy (1 click cascaded — cmp-20260522-2d4605 gift_clicked 27 → 28). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| api | ||
| boot | ||
| components | ||
| composables | ||
| config | ||
| css | ||
| data | ||
| layouts | ||
| modules | ||
| pages | ||
| router | ||
| stores | ||
| utils | ||
| App.vue | ||