Signup nudge eligibility treats subscribed-then-unsubscribed members as never subscribed
Maintainer thường phản hồi trong vòng 1 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức phù hợp với người mới
- 35/100
Hướng nghiên cứu
Start with app/services/signup_nudge_email_service.rb#never_subscribed and app/controllers/subscriptions_controller.rb#destroy, then inspect the subscription and activity data model. Confirm which persistence direction maintainers choose before implementing it. Done means a member who subscribed and later unsubscribed is not treated as never subscribed, while group-specific eligibility and followup behavior remain correct.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Summary
SignupNudgeEmailService#never_subscribed defines eligibility as "has no row in subscriptions". But SubscriptionsController#destroy deletes the subscription row when a member unsubscribes from a chapter group. A member who subscribed and later left is therefore indistinguishable from a member who never subscribed at all — and becomes nudge-eligible again.
Real production case
Member 31302 (dump of 2026-09-24), full timeline from activities + workshop_invitations:
| Time (2026-09, UTC) | Event |
|---|---|
| 09-02 11:16 | Signs up |
| 09-02 11:18 | RSVPs as Coach (2 minutes after signup) |
| 09-09 18:30 | Attends London workshop |
| 09-17 09:16 | RSVPs to the next London workshop |
| 09-17 09:34 | Unsubscribes from London Coaches group (subscription.removed activity, id 569) |
| 09-17 13:04 | Receives a "Let's get you connected with codebar!" signup nudge |
Four hours after choosing to leave the chapter group, this actively engaged coach got an email whose premise is "you never connected with codebar". The unsubscribe made him eligible again; the nudge arrived same-day.
Two compounding facts:
subscription.createdactivity tracking only started 2026-09-13 (65 events / 41 members) andsubscription.removedon 2026-09-14 (61 events / 45 members). His subscription predates tracking, so its removal left no "was subscribed" evidence — only the removal event exists.- In the dump, 37 of the 45 members with a tracked unsubscribe now have zero subscription rows — i.e. the nudge service currently classifies all 37 as "never subscribed". One of them is inside the current nudge window and not banned.
Why this is separate from #2919
The daily duplicate-send bug (#2919, .merge clobbering the delivery anti-join) causes the same member to be emailed repeatedly, but fixing it does not fix this: a subscribe-then-unsubscribe member with no prior nudge is genuinely selected by the corrected query. The eligibility rule itself needs to account for unsubscribes.
Scope of the wrongness
- Messaging mismatch: the nudge copy assumes a dormant lurker; unsubscribers made an active choice to leave. Re-pitching them risks reading as ignoring their opt-out.
- Same-day turnarounds are possible for any churn event shortly before the daily 12:00 UTC run, as the timeline shows.
- The unsubscribe may have been from one group only (e.g. left Coaches, still interested in Students) — naive "any unsubscribe = never eligible" would over-correct. Today's schema can't tell, because the row is gone.
Possible directions (for discussion)
- Tombstone subscriptions — soft-delete/discards (
discarded_at) or astatecolumn, so history survives; eligibility then reads "never had an active subscription". Most robust; biggest change. - Eligibility excludes members with a
subscription.removedactivity — cheap, but blind to all pre-2026-09-13 subscriptions, and depends on activity rows never being cleaned (nothing prunesactivitiestoday, but nothing guarantees that). - Member-level flag set on unsubscribe (mirroring the
received_student/coach_welcome_emailpattern) — simple, but loses which group/chapter was left.
Happy to take whichever direction maintainers prefer; option 1 is the only one that also preserves the data for the followup email logic (which keys off member_email_deliveries.created_at and would otherwise send a followup to someone who already left).
Environment
app/services/signup_nudge_email_service.rb(never_subscribed) andapp/controllers/subscriptions_controller.rb#destroyata50b5214- Rails 8.1 / Ruby 4.0, verified against
codebar_production_dump2026-09-24
- Ngôn ngữ chính
- Ruby
- Star
- 104
- Fork
- 205
- Merge trung bình
- 1 ngày 6 giờ
- Pull request đã merge (30 ngày)
- 70
Chuẩn bị môi trường
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của codebar/planner
-
enhancement
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
Maintainer thường phản hồi trong vòng 1 ngày
-
enhancement
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
Maintainer thường phản hồi trong vòng 1 ngày
-
enhancement
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
Maintainer thường phản hồi trong vòng 1 ngày
-
expenses
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 45/100
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của codebar/planner
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
solana-foundation/pay-kit#341 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 95/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Sign and read plain-text assetsĐang mởenhancement
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Cask still fails to install: `depends_on macos: :catalina` is now disabled (regression after #58)Đang mở
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 92/100