RecurlyEventHandler.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. const AnalyticsManager = require('../Analytics/AnalyticsManager')
  2. function sendRecurlyAnalyticsEvent(event, eventData) {
  3. switch (event) {
  4. case 'new_subscription_notification':
  5. _sendSubscriptionStartedEvent(eventData)
  6. break
  7. case 'updated_subscription_notification':
  8. _sendSubscriptionUpdatedEvent(eventData)
  9. break
  10. case 'canceled_subscription_notification':
  11. _sendSubscriptionCancelledEvent(eventData)
  12. break
  13. case 'expired_subscription_notification':
  14. _sendSubscriptionExpiredEvent(eventData)
  15. break
  16. case 'renewed_subscription_notification':
  17. _sendSubscriptionRenewedEvent(eventData)
  18. break
  19. case 'reactivated_account_notification':
  20. _sendSubscriptionReactivatedEvent(eventData)
  21. break
  22. case 'paid_charge_invoice_notification':
  23. if (
  24. eventData.invoice.state === 'paid' &&
  25. eventData.invoice.total_in_cents > 0
  26. ) {
  27. _sendInvoicePaidEvent(eventData)
  28. }
  29. break
  30. case 'closed_invoice_notification':
  31. if (
  32. eventData.invoice.state === 'collected' &&
  33. eventData.invoice.total_in_cents > 0
  34. ) {
  35. _sendInvoicePaidEvent(eventData)
  36. }
  37. break
  38. }
  39. }
  40. async function _sendSubscriptionStartedEvent(eventData) {
  41. const userId = _getUserId(eventData)
  42. const { planCode, quantity, state, isTrial } = _getSubscriptionData(eventData)
  43. AnalyticsManager.recordEventForUser(userId, 'subscription-started', {
  44. plan_code: planCode,
  45. quantity,
  46. is_trial: isTrial,
  47. })
  48. AnalyticsManager.setUserPropertyForUser(
  49. userId,
  50. 'subscription-plan-code',
  51. planCode
  52. )
  53. AnalyticsManager.setUserPropertyForUser(userId, 'subscription-state', state)
  54. AnalyticsManager.setUserPropertyForUser(
  55. userId,
  56. 'subscription-is-trial',
  57. isTrial
  58. )
  59. }
  60. async function _sendSubscriptionUpdatedEvent(eventData) {
  61. const userId = _getUserId(eventData)
  62. const { planCode, quantity, state, isTrial } = _getSubscriptionData(eventData)
  63. AnalyticsManager.recordEventForUser(userId, 'subscription-updated', {
  64. plan_code: planCode,
  65. quantity,
  66. })
  67. AnalyticsManager.setUserPropertyForUser(
  68. userId,
  69. 'subscription-plan-code',
  70. planCode
  71. )
  72. AnalyticsManager.setUserPropertyForUser(userId, 'subscription-state', state)
  73. AnalyticsManager.setUserPropertyForUser(
  74. userId,
  75. 'subscription-is-trial',
  76. isTrial
  77. )
  78. }
  79. async function _sendSubscriptionCancelledEvent(eventData) {
  80. const userId = _getUserId(eventData)
  81. const { planCode, quantity, state, isTrial } = _getSubscriptionData(eventData)
  82. AnalyticsManager.recordEventForUser(userId, 'subscription-cancelled', {
  83. plan_code: planCode,
  84. quantity,
  85. is_trial: isTrial,
  86. })
  87. AnalyticsManager.setUserPropertyForUser(userId, 'subscription-state', state)
  88. AnalyticsManager.setUserPropertyForUser(
  89. userId,
  90. 'subscription-is-trial',
  91. isTrial
  92. )
  93. }
  94. async function _sendSubscriptionExpiredEvent(eventData) {
  95. const userId = _getUserId(eventData)
  96. const { planCode, quantity, state, isTrial } = _getSubscriptionData(eventData)
  97. AnalyticsManager.recordEventForUser(userId, 'subscription-expired', {
  98. plan_code: planCode,
  99. quantity,
  100. is_trial: isTrial,
  101. })
  102. AnalyticsManager.setUserPropertyForUser(
  103. userId,
  104. 'subscription-plan-code',
  105. planCode
  106. )
  107. AnalyticsManager.setUserPropertyForUser(userId, 'subscription-state', state)
  108. AnalyticsManager.setUserPropertyForUser(
  109. userId,
  110. 'subscription-is-trial',
  111. isTrial
  112. )
  113. }
  114. async function _sendSubscriptionRenewedEvent(eventData) {
  115. const userId = _getUserId(eventData)
  116. const { planCode, quantity, state, isTrial } = _getSubscriptionData(eventData)
  117. AnalyticsManager.recordEventForUser(userId, 'subscription-renewed', {
  118. plan_code: planCode,
  119. quantity,
  120. is_trial: isTrial,
  121. })
  122. AnalyticsManager.setUserPropertyForUser(
  123. userId,
  124. 'subscription-plan-code',
  125. planCode
  126. )
  127. AnalyticsManager.setUserPropertyForUser(userId, 'subscription-state', state)
  128. AnalyticsManager.setUserPropertyForUser(
  129. userId,
  130. 'subscription-is-trial',
  131. isTrial
  132. )
  133. }
  134. async function _sendSubscriptionReactivatedEvent(eventData) {
  135. const userId = _getUserId(eventData)
  136. const { planCode, quantity, state, isTrial } = _getSubscriptionData(eventData)
  137. AnalyticsManager.recordEventForUser(userId, 'subscription-reactivated', {
  138. plan_code: planCode,
  139. quantity,
  140. })
  141. AnalyticsManager.setUserPropertyForUser(
  142. userId,
  143. 'subscription-plan-code',
  144. planCode
  145. )
  146. AnalyticsManager.setUserPropertyForUser(userId, 'subscription-state', state)
  147. AnalyticsManager.setUserPropertyForUser(
  148. userId,
  149. 'subscription-is-trial',
  150. isTrial
  151. )
  152. }
  153. async function _sendInvoicePaidEvent(eventData) {
  154. const userId = _getUserId(eventData)
  155. AnalyticsManager.recordEventForUser(userId, 'subscription-invoice-collected')
  156. AnalyticsManager.setUserPropertyForUser(
  157. userId,
  158. 'subscription-is-trial',
  159. false
  160. )
  161. }
  162. function _getUserId(eventData) {
  163. let userId
  164. if (eventData && eventData.account && eventData.account.account_code) {
  165. userId = eventData.account.account_code
  166. } else {
  167. throw new Error(
  168. 'account.account_code missing in event data to identity user ID'
  169. )
  170. }
  171. return userId
  172. }
  173. function _getSubscriptionData(eventData) {
  174. const isTrial =
  175. eventData.subscription.trial_started_at &&
  176. eventData.subscription.current_period_started_at &&
  177. eventData.subscription.trial_started_at.getTime() ===
  178. eventData.subscription.current_period_started_at.getTime()
  179. return {
  180. planCode: eventData.subscription.plan.plan_code,
  181. quantity: eventData.subscription.quantity,
  182. state: eventData.subscription.state,
  183. isTrial,
  184. }
  185. }
  186. module.exports = {
  187. sendRecurlyAnalyticsEvent,
  188. }