Slide 1

Slide 1 text

ޙ෇͚Ͱ ैྔ՝ۚϓϥϯͷ ఏڙΛ։࢝ͨ͠࿩ JP_Stripes Online Hidetaka Okamoto #JP_Stripes

Slide 2

Slide 2 text

TL;DR • StripeͰैྔ՝ۚϓϥϯͷఏڙ͸ͱͯ΋؆୯ • ঎඼ / ྉۚͷొ࿥ͱɺSubscriptionͷ࡞੒ɺ͋ͱ͸࢖༻ྔͷొ࿥ • ෳ਺ͷIntervalʢظؒʣΛఏڙ͢Δ৔߹ɺैྔ՝ۚͷճऩ࣌ظʹ஫ҙ • Stripe BillingͷྉۚλΠϓ͕෯޿͍ͷͰɺϏδωεاըʹ͍͔ͦ͏ #JP_Stripes

Slide 3

Slide 3 text

Agenda • ैྔ՝ۚͰͷΦϓγϣϯαʔϏεͷఏڙ։࢝ • ैྔ՝ۚϓϥϯΛఏڙ͢ΔͨΊʹ΍ͬͨ͜ͱ • Ϗδωε্ͷ൑அͰSubscriptionମܥΛม͑ͨ࿩ • ʢؾ͔ͮ͵ؒʹʣStripe Billingͷྉۚମܥ͕૿͑ͯͨ࿩ #JP_Stripes

Slide 4

Slide 4 text

Agenda • ैྔ՝ۚͰͷΦϓγϣϯαʔϏεͷఏڙ։࢝ • ैྔ՝ۚϓϥϯΛఏڙ͢ΔͨΊʹ΍ͬͨ͜ͱ • Ϗδωε্ͷ൑அͰSubscriptionମܥΛม͑ͨ࿩ • ʢؾ͔ͮ͵ؒʹʣStripe Billingͷྉۚମܥ͕૿͑ͯͨ࿩ #JP_Stripes

Slide 5

Slide 5 text

CDNసૹྔͷ ैྔ՝ۚΦϓγϣϯఏڙ։࢝ #JP_Stripes https://www.getshifter.io/ja/cdn-pay-as- you-go-option-is-available/

Slide 6

Slide 6 text

#JP_Stripes • ֹ݄Ͱͷ੥ٻ • 1GB͋ͨΓ0.18 USD • UIͰ͸ʮΦϯɾΦϑʯͷΈ

Slide 7

Slide 7 text

ͳͥैྔ՝ۚʁ • σʔλసૹྔ͸ແݶʹ૿͑ΔՄೳੑ͕͋Δ • ࠷্Ґϓϥϯͷར༻࿮Ͱ΋௒ա͢ΔϢʔβʔ͕ొ৔ • ͜Ε·Ͱ͸ʮXGB = $YʯͷΑ͏ͳݸผܾࡁΛ݄ຖʹ΍͍ͬͯͨ • ʮͲΕ͚ͩফඅ͢Δ͔ʯͷ༧ଌ͕Ϣʔβʔʹඞཁ • ʮ௒͔͑ͯΒܖ໿ʯͰ͸αΠτμ΢ϯ͕Ұ࣌తͰ΋ൃੜ͢Δ • ʮ࢖ͬͨ෼͚ͩ੥ٻʯͷΦϓγϣϯͰɺ ༧ଌͷखؒͱμ΢ϯϦεΫΛճආ #JP_Stripes

Slide 8

Slide 8 text

શ෦ैྔ՝ۚʹ͠ͳ͍ͷʁ • Shifter͸ᴈ໌ظɺैྔ՝ۚͩͬͨ • Stripe Billing͕ैྔ՝ۚରԠલͷྗٕ࣮૷ • ʮͲΕ͚ͩ੥ٻ͞ΕΔ͔Θ͔Βͳ͍ʯ͕ʮબ͹Εͳ͍ཧ༝ʯʹ • ʮ݄16υϧɺແྉϓϥϯ͋Γʯͷํ͕఻ΘΔࢢ৔ʹ͍ͨ • ैྔ՝ۚ => ύοέʔδՁ֨ => ύοέʔδ + ैྔ՝ۚ #JP_Stripes

Slide 9

Slide 9 text

Agenda • ैྔ՝ۚͰͷΦϓγϣϯαʔϏεͷఏڙ։࢝ • ैྔ՝ۚϓϥϯΛఏڙ͢ΔͨΊʹ΍ͬͨ͜ͱ • Ϗδωε্ͷ൑அͰSubscriptionମܥΛม͑ͨ࿩ • ʢؾ͔ͮ͵ؒʹʣStripe Billingͷྉۚମܥ͕૿͑ͯͨ࿩ #JP_Stripes

Slide 10

Slide 10 text

#JP_Stripes • plan(price)Ͱొ࿥ • 1୯Ґ = 1GBʹઃఆ • ૯ܭ͸ʮ࠷େ஋ʯΛར༻

Slide 11

Slide 11 text

Subscriptionͷૢ࡞͸ී௨ͷPriceͱશ͘ಉ͡ const subscription = await stripe.subscriptions.create({ customer: 'cus_XXXXX', items: [ {price: 'price_XXXXXXXX'}, ], }); const subscription = await stripe.subscriptions.update(‘sub_xxxx’, { items: [ {price: 'price_XXXXXXXX'}, ], }); #JP_Stripes

Slide 12

Slide 12 text

ैྔ՝ۚ͸ Subscription create/update ͚ͩͰ͸1ԁ΋੥ٻͰ͖ͳ͍ #JP_Stripes

Slide 13

Slide 13 text

createUsageRecordͰʮ࢖ͬͨྔʯΛొ࿥͢Δ const usageRecord = await stripe.subscriptionItems .createUsageRecord( ‘si_XXXXX', { quantity: 100, timestamp: 1571252444, action: ‘set’ } ); #JP_Stripes

Slide 14

Slide 14 text

setͩͱ૯ྔɺincrementͩͱՃࢉͰॲཧ͞ΕΔ const usageRecord = await stripe.subscriptionItems .createUsageRecord( ‘si_XXXXX', { quantity: 100, timestamp: 1571252444, action: ‘set’ } ); #JP_Stripes

Slide 15

Slide 15 text

࢖༻ྔͷूܭํ๏ 1. Amazon EventBridgeͰAWS StepFunctionsΛݺͼग़͢Πϕϯτ࡞੒ 2. ର৅ͷpriceΛؚΉSubscriptionΛશऔಘ 3. subscriptionຖʹฒྻͰूܭॲཧΛ࣮ࢪ 4. ूܭ݁ՌΛAWS DynamoDBʹอଘ 5. StripeͷUsageRecords APIʹར༻ྔΛొ࿥ #JP_Stripes

Slide 16

Slide 16 text

Price IDΛ࢖͑͹ʮର৅subscriptionʯ͚ͩҾ͚Δ const subscriptions = await stripe.subscriptions .list({ price: ‘price_xxx’ }); #JP_Stripes

Slide 17

Slide 17 text

100݅௒͑ΔͷͰɺ࣮ࡍʹ͸࠶ؼతͳ࣮૷ʹ async listSubscriptionRecuecive(priceId, items = [], startingAfter) { const {data: subscriptions} = await stripe.subscriptions .list({ starting_after: startingAfter, price: priceId, }) const mergedSubscriptions = [...items, ...subscriptions] if (subscriptions.length < 1) { return mergedSubscriptions } const lastSubscriptionId = subscriptions[subscriptions.length - 1].id return listSubscriptionRecuecive(planId, mergedSubscriptions, lastSubscriptionId) } #JP_Stripes

Slide 18

Slide 18 text

࢖༻ྔ͸GBͰϢʔβʔʹදࣔ • ʮϕʔεϓϥϯͷ࢖༻ྔΛ௒͍͑ͯΔ࣌ʯ͚ͩ੥ٻ͞ΕΔੑ࣭ • ʮԿGB࢖͍ͬͯΔ͔ʯ͕Φϓγϣϯͷ੥ٻൃੜલ͔ΒॏཁʹͳΔ • ୯Ձมߋ΍ෳ਺ྉۚͷఏڙ༧ఆ΋ͳ͍ͨΊɺ subscriptionItems.listUsageRecordSummaries͸࢖͍ͬͯͳ͍ • DynamoDBʹه࿥ͨ͠࢖༻ྔGBΛදࣔ͠ɺ ඞཁͳΒ$0.18/GBΛϑϩϯτͰܭࢉ #JP_Stripes

Slide 19

Slide 19 text

Agenda • ैྔ՝ۚͰͷΦϓγϣϯαʔϏεͷఏڙ։࢝ • ैྔ՝ۚϓϥϯΛఏڙ͢ΔͨΊʹ΍ͬͨ͜ͱ • Ϗδωε্ͷ൑அͰSubscriptionମܥΛม͑ͨ࿩ • ʢؾ͔ͮ͵ؒʹʣStripe Billingͷྉۚମܥ͕૿͑ͯͨ࿩ #JP_Stripes

Slide 20

Slide 20 text

ैྔ՝ۚΦϓγϣϯ͸ɺ ϗεςΟϯάͷSubscriptionͱ ผʹSubscriptionΛ࡞੒ #JP_Stripes

Slide 21

Slide 21 text

ैྔ՝ۚͩΖ͏͕Stripe BillingͰͷѻ͍͸ಉ͡ const subscription = await stripe.subscriptions.create({ customer: 'cus_XXXXX', items: [ {price: 'price_XXXXXXXX'}, ], }); const subscription = await stripe.subscriptions.update(‘sub_xxxx’, { items: [ {price: 'price_XXXXXXXX'}, ], }); #JP_Stripes

Slide 22

Slide 22 text

ͨͩ͠ɺ Intervalʢظؒʣͱ Currencyʢ௨՟ʣ͸ ౷Ұ͠ͳ͍ͱμϝ #JP_Stripes

Slide 23

Slide 23 text

FYI: ଟ௨՟Subscription͸΋͔͢͠Δͱɾɾɾʁ https://stripe.com/docs/invoicing/additional-features/multiple-currencies

Slide 24

Slide 24 text

ෳ਺ͷInterval͕ొ৔͢ΔͨΊɺ࢓༷ͱͯ͠ಠཱ • ຊདྷͳΒɺ1 Subscriptionʹ·ͱΊͨํָ͕ • ֹ݄ͨͩ͠ <-> ೥ֹͷ੾Γସ͕͑೉͘͠ͳΔ • ೥ֹͷैྔ՝ۚΦϓγϣϯ͸ग़ͨ͘͠ͳ͔ͬͨ • ಠཱͨ͠Subscriptionʹ͢Δ͜ͱͰɺInterval ( Currency )ڝ߹Λճආ • DynamoDBʹattributeΛ1ͭ଍͚ͨͩ͠Ͱղܾ #JP_Stripes

Slide 25

Slide 25 text

੥ٻλΠϛϯάΛἧ͑ΔͨΊͷ billing_cycle_anchor await stripe.subscriptions.create({ customer: customerId, items: [{ price: priceId, }], billing_cycle_anchor: moment().add(1, ‘month’) .startOf('month').unix() }) #JP_Stripes

Slide 26

Slide 26 text

ࠓఏڙ͍ͯ͠ΔSubscriptionʹ ैྔ՝ۚΛ௥Ճ͢Δʹ͸ • Currency / Interval͕1ͭͳΒͦͷ··subscriptionʹ௥Ճָ͕ • ෳ਺͋Δ৔߹͸ɺʮैྔ՝ۚͰग़͢currency / intervalʯΛܾΊΑ͏ • ରԠͨ͠PriceΛશͯἧ͑ͳ͍ͳΒɺಠཱͨ͠Subscription͕ແ೉ • ੥ٻλΠϛϯά͸ಉ͡λΠϛϯάʹἧ͓͑ͯ͘ͷ͕਌੾ • ɾɾɾͱ͍͏͜ͱ͕͋ΔͷͰɺbilling_cycle_anchor͸࢖͓ͬͯ͜͏ #JP_Stripes

Slide 27

Slide 27 text

Agenda • ैྔ՝ۚͰͷΦϓγϣϯαʔϏεͷఏڙ։࢝ • ैྔ՝ۚϓϥϯΛఏڙ͢ΔͨΊʹ΍ͬͨ͜ͱ • Ϗδωε্ͷ൑அͰSubscriptionମܥΛม͑ͨ࿩ • ʢؾ͔ͮ͵ؒʹʣStripe Billingͷྉۚମܥ͕૿͑ ͯͨ࿩ #JP_Stripes

Slide 28

Slide 28 text

ஈ֊తͳՁ֨ઃఆ

Slide 29

Slide 29 text

਺ྔϕʔεͷՁ֨ઃఆ

Slide 30

Slide 30 text

ύοέʔδ୯Ґͷྉۚମܥ 10Ϣχοτ·Ͱ͸$10 #JP_Stripes

Slide 31

Slide 31 text

࡞ΕΔྉۚମܥͷ छྨ͕૿͍͑ͯΔ ↓ ఏڙͰ͖ΔϏδωεͷछྨ͕ ૿΍ͤΔΑ͏ʹͳΔ

Slide 32

Slide 32 text

ϝʔϧͰߋ৽৘ใΛ ͬ͟ͱݟͰ͖Δ Developer Digest #JP_Stripes

Slide 33

Slide 33 text

https://stripe.dev/

Slide 34

Slide 34 text

StripeΛཧղ͢Δ StripeΛ࢖͍͜ͳ͢ ↓ ఏҊɾ࣮૷Ͱ͖Δ ΦϯϥΠϯϏδωεͷ෯͕޿͕Δ

Slide 35

Slide 35 text

[એ఻] 6/26 WordCamp Japan 2021ͰWP with SaaS https://japan.wordcamp.org/2021/session/autumn02/

Slide 36

Slide 36 text

Thanks! • StripeͰैྔ՝ۚϓϥϯͷఏڙ͸ͱͯ΋؆୯ • ঎඼ / ྉۚͷొ࿥ͱɺSubscriptionͷ࡞੒ɺ͋ͱ͸࢖༻ྔͷొ࿥ • ෳ਺ͷIntervalʢظؒʣΛఏڙ͢Δ৔߹ɺैྔ՝ۚͷճऩ࣌ظʹ஫ҙ • Stripe BillingͷྉۚλΠϓ͕෯޿͍ͷͰɺϏδωεاըʹ͍͔ͦ͏ #JP_Stripes