Ghost/ghost/member-events/index.js

17 lines
976 B
JavaScript
Raw Normal View History

module.exports = {
Added member attribution events and storage (#15243) refs https://github.com/TryGhost/Team/issues/1808 refs https://github.com/TryGhost/Team/issues/1809 refs https://github.com/TryGhost/Team/issues/1820 refs https://github.com/TryGhost/Team/issues/1814 ### Changes in `member-events` package - Added MemberCreatedEvent (event, not model) - Added SubscriptionCreatedEvent (event, not model) ### Added `member-attribution` package (new) - Added the AttributionBuilder class which is able to convert a url history to an attribution object (exposed as getAttribution on the service itself, which handles the dependencies) ``` [{ "path": "/", "time": 123 }] ``` to ``` { "url": "/", "id": null, "type": "url" } ``` - event handler listens for MemberCreatedEvent and SubscriptionCreatedEvent and creates the corresponding models in the database. ### Changes in `members-api` package - Added urlHistory to `sendMagicLink` endpoint body + convert the urlHistory to an attribution object that is stored in the tokenData of the magic link (sent by Portal in this PR: https://github.com/TryGhost/Portal/pull/256). - Added urlHistory to `createCheckoutSession` endpoint + convert the urlHistory to attribution keys that are saved in the Stripe Session metadata (sent by Portal in this PR: https://github.com/TryGhost/Portal/pull/256). - Added attribution data property to member repository's create method (when a member is created) - Dispatch MemberCreatedEvent with attribution ### Changes in `members-stripe-service` package (`ghost/stripe`) - Dispatch SubscriptionCreatedEvent in WebhookController on subscription checkout (with attribution from session metadata)
2022-08-18 18:38:42 +03:00
MemberCreatedEvent: require('./lib/MemberCreatedEvent'),
MemberEntryViewEvent: require('./lib/MemberEntryViewEvent'),
MemberSubscribeEvent: require('./lib/MemberSubscribeEvent'),
MemberUnsubscribeEvent: require('./lib/MemberUnsubscribeEvent'),
MemberSignupEvent: require('./lib/MemberSignupEvent'),
MemberPaidConverstionEvent: require('./lib/MemberPaidConversionEvent'),
MemberPaidCancellationEvent: require('./lib/MemberPaidCancellationEvent'),
MemberPageViewEvent: require('./lib/MemberPageViewEvent'),
MemberCommentEvent: require('./lib/MemberCommentEvent'),
SubscriptionCreatedEvent: require('./lib/SubscriptionCreatedEvent'),
SubscriptionActivatedEvent: require('./lib/SubscriptionActivatedEvent'),
SubscriptionCancelledEvent: require('./lib/SubscriptionCancelledEvent'),
🐛 Fixed offer redemptions for free members redeeming an offer (#20571) ref https://linear.app/tryghost/issue/ENG-1251/support-escalation-re-offers-not-tracking - Offer Redemptions were not being persisted in the database for existing free members who upgrade to a paid plan with an offer, which resulted in inaccurate offer redemption counts. This made it difficult to assess the performance of an offer. - Previously, Ghost recorded an offer redemption in the DB in response to the `SubscriptionCreatedEvent`, under the assumption that the offer details would be included in this event. This assumption was valid for brand new members starting a subscription with an offer, but not for existing free members upgrading to a paid plan with an offer. - For existing free members, the subscription is first stored in Ghost in response to the `customer.subscription.created` Stripe webhook. At this point, the offer/discount is not attached to the subscription, so the `SubscriptionCreatedEvent` triggers without the offer information, and the offer redemption is not recorded. After the `checkout.session.completed` webhook is received (which _does_ include the offer details), the subscription is updated in Ghost, but the Offer Redemption is not stored. - For brand new members, the `customer.subscription.created` webhook no-ops, because the member and Stripe Customer don't exist yet. Therefore, the subscription is first created in Ghost in response to the `checkout.session.completed` webhook, which _does_ include the offer information, so the offer information is included in the `SubscriptionCreatedEvent` and the offer redemption is recorded as expected. - This change adds a new `OfferRedemptionEvent`, which triggers either: (1) when a new subscription is created with an offer (as in the case of a brand new member), or (2) when an existing subscription is first updated to include an offer (as in the case of an existing free member upgrading with an offer). The Offer Redemption is then persisted in the DB in response to the `OfferRedemptionEvent` rather than the `SubscriptionCreatedEvent`.
2024-07-10 02:05:26 +03:00
OfferRedemptionEvent: require('./lib/OfferRedemptionEvent'),
MemberLinkClickEvent: require('./lib/MemberLinkClickEvent')
};