Stripe Billingでの定期課金への消費税設定方法とStripe Taxを使った効率化

Stripe Billingを利用することで、SaaSや会員制サービス・頒布会などの定期課金・継続課金を比較的簡単に実現させることができます。

そして2021/12/14に日本での提供が開始されたStripe Taxを組み合わせることで、税金の計算や徴収・申告についても効率化することができます。

https://qiita.com/hideokamoto/items/e92b6ae22065b0d134cd

この記事では、すでにStripe Billingを利用されている方向けに、Stripe Taxをお勧めしたいケースについて紹介します。

# 対象の読者
- Stripe Billingで定期課金を行なっている方
- 消費税の申告・納付が必要な方
- [Optional] 将来的に海外展開も検討されている方
- [Optional] 税率の変更があった場合に、追加作業をおこないたくない方

# アジェンダ

- Stripe Billing単体での消費税徴収方法
- Stripe Taxのメリット・デメリット
- 運用中のBillingにStripe Taxを設定する

# Stripe Billing単体での消費税徴収方法

Stripe Billingで消費税などの税金を価格に反映させる方法には、以下の２つがあります。

- 1:料金を「課税後の金額（内税）」で設定する
- 2:「税率」を設定し、サブスクリプションに設定する

## 1:料金を「課税後の金額（内税）」で設定する
1の方法は、もっとも簡単に導入・実装ができます。以下のコードでは、月額10,000円（税込）の定期課金プランの商品と料金をそれぞれ作成しています。

```js
    const product = await stripe.products.create({
      name: '消費税込み料金の商品',
    })
    const price = await stripe.prices.create({
      product: product.id,
      currency: 'jpy',
      unit_amount: 10000,
      recurring: {
        interval: 'month'
      },
      nickname: '消費税込の料金'
    })
```

サブスクリプションの作成も、とてもシンプルに行うことができます。

```js
    await stripe.subscriptions.create({
      customer: 'cus_XXXX',
      items: [{
        price: 'price_XXXX',
        quantity: 1
      }]
    })
```

### 税率が変更された時のオペレーション

「料金を新しく作成し、対象のサブスクリプションを全て更新後の料金に設定し直す」作業が発生します。
料金を変更するため、新規のサブスクリプション作成処理部分でもIDの変更などの作業が必要となります。

```js
    const subscriptionId = "sub_xxxx"
    const subscription = await stripe.subscriptions.retrieve(subscriptionId)

    /**
     * 「１料金のみ」の場合の実装。
     * 複数のプランがある場合はprice_idなどで対象をfindする必要があります。
     **/
    const updateTargetItem = subscription.items.data[0]

    await stripe.subscriptions.update(subscriptionId, {
     /**
      * 次回の請求から税金分を変更したいだけなので、
      * 比例配分は実施しない。
      **/
      proration_behavior: 'none',
      items: [{
       /**
        * 変更後の料金を設定する
        **/
        price: 'price_new_price_id',
        quantity: 1
      }, {
       /**
        * 以前の料金は削除（解約）する
        **/
        id: updateTargetItem.id,
        deleted: true
      }]
    })
```

## 2:「税率」を設定し、サブスクリプションに設定する

StripeにはTax以外にも税率の設定を行うことができる仕組みがあります。それが「税率（TaxRate）」です。

```js
    await stripe.taxRates.create({
      display_name: '消費税',
      percentage: 10,
      /**
       * true  = 内税（料金の金額に、税金を含める）
       * false = 外税（料金の金額に、税金を加算する）
       **/
      inclusive: true
    })
    await stripe.taxRates.create({
      display_name: '消費税 - 外税',
      percentage: 10,
      inclusive: false
    })
```

作成した税率を、サブスクリプション作成時に割り当てすることで、設定した税率を請求金額に含めることができます。

```js
    await stripe.subscriptions.create({
      customer: 'cus_xxxx',
      items: [{
        price: 'price_xxxx',
        quantity: 1,
        tax_rates: ['txr_xxxx']
      }],
    })
```

インボイスにも登録した税金が反映されています。
また、`inclusive=false`に設定した場合は、料金 * 税率が請求金額に加算されていることもわかります。

![スクリーンショット 0003-12-15 17.36.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/f32a1ff7-3568-783d-2c00-c88fec9d8d70.png)

### 税率が変更された時のオペレーション

税率を利用した場合は、料金の差し替えが不要になります。
「サブスクリプションの新規作成処理が更新する必要がある」ことと、「バッチで既存のサブスクリプションを更新する必要がある」ことについては、価格に税率を含めている時と同じですが、「税額の計算や金額の変更作業」はなくなります。

```js
    const subscriptionId = "sub_xxxxx"
    const subscription = await stripe.subscriptions.retrieve(subscriptionId)
    await stripe.subscriptions.update(subscriptionId, {
      proration_behavior: 'none',
      items: subscription.items.data.map(item => {
        return {
          id: item.id,
          tax_rates: ['txr_yyyy']
        }
      })
    }) 
```

# Stripe Taxのメリット・デメリット

## メリット1: 納付が必要な税額の情報をStripeから取得できる

Stripe Taxを利用して消費税を収集した場合、Stripe Dashboardのレポート画面から収集した金額データを確認できます。

![スクリーンショット 0003-12-14 18.44.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/cab4d2ba-b8a8-9f88-c6a4-c604701f74d9.png)

また、CSVでのエクスポートも可能ですので、必要に応じてユーザー側で加工することもできます。

## メリット2: 税情報の更新が１クリックで可能になる

Stripe Taxの特徴は、「商品に対して税率を設定する」ことです。
[利用可能な税コード](https://stripe.com/docs/tax/tax-codes)から、商品に該当する税コードを調べ、商品作成時に設定します。
なお、Stripe Tax設定時に指定した「デフォルトの商品税コード」を使用する場合は、省略することもできます。

```js
    const product = await stripe.products.create({
      name: 'SaaSパッケージ',

      /**
       * 「サービスとしてのソフトウェア (SaaS)」の税コードを設定した例。
       * Stripe Tax設定時に指定した「デフォルトの商品税コード」を使用する場合は、省略可能
       **/
      tax_code: 'txcd_10103000'
    })
    const price = await stripe.prices.create({
      product: product.id,
      currency: 'jpy',
      unit_amount: 10000,
      recurring: {
        interval: 'month'
      },
      nickname: 'SaaS月額料金',

      /**
       * 内税・外税の設定は料金で行う
       **/
      tax_behavior: 'exclusive'
    })
    console.log(price)
```

あとは、「Stripe Taxでの自動税計算を有効にする」設定をサブスクリプション作成時の処理に追加するだけです。

```js
    await stripe.subscriptions.create({
      customer: 'cus_xxxx',
      items: [{
        price: 'price_xxxxx',
        quantity: 1,
      }],
      automatic_tax: {
        enabled: true
      }
    })
```

### Stripe Taxで、税率が変更された時のオペレーション

商材によっては、商品の性質が変わったために、税コードを変更する必要などがあります。
Stripe Taxを利用した場合、「商品の税コード設定を更新する」だけで、対象サブスクリプションに設定されている税額が、次回請求から変更されます。

```js
    await stripe.products.update('prod_xxxx', {
      tax_code: 'txcd_40060003'
    })
```

大元の商品データを更新するだけで設定が完了するため、とても効率的です。
また、世界各地の税率にも自動で対応してくれるため、「販売地域の拡大」や「顧客の住所変更による課税地域変更」などにも追加実装なしで対応できます。

## デメリット: 手数料が発生する

Stripe Taxを利用する場合、取引金額の0.5%が手数料として請求される点にご注意ください。

取引額が大きい企業などでは、カスタム料金体系の案内もありますので、興味がある方は一度[営業チーム](https://stripe.com/jp/contact/sales?utm_source=qiita&utm_medium=stripeTaxGTM)にお問い合わせください。


# 運用中のBillingにStripe Taxを設定する

すでにBillingを運用している場合でも、Stripe Taxを有効化したのちに、以下の３ステップでStripe Taxでの税計算に移行できます。

- 商品に税コードを追加する
- 料金に「内税・外税」の設定を追加する
- サブスクリプションを更新する

## 商品に税コードを追加する(省略可能)

まずは商品に税コードを設定します。
ただしこのステップは、「デフォルトの商品税コード」を利用する場合、省略できます。


```js
    const productId = 'prod_xxxx'
    await stripe.products.update(productId, {
      tax_code: 'txcd_10103000'
    })
```

## 料金に「内税・外税」の設定を追加する

続いて、料金を「内税・外税」どちらで計算するかを設定します。
以下のような処理を書くことで、一括で更新できます。
なお、StripeのList APIでは、100件までしかデータを取得的ないことにご注意ください。

```js
    const productId = 'prod_xxxx'
    const {data: prices} = await stripe.prices.list({
      product: productId
    })
    for (const key in prices) {
      if (!Object.prototype.hasOwnProperty.call(prices, key)) {
        continue;
      }
      const price = prices[key];
      await stripe.prices.update(price.id, {
        tax_behavior: 'inclusive'
      })
    }
```

## サブスクリプションを更新する

最後に、サブスクリプションで自動税計算を有効化します。
初回の設定でのみバッチを動かす必要がありますので、計画時にはご注意ください。

```js
const subscription = await stripe.subscriptions.update(
  '{{SUBSCRIPTION_ID}}',
  {
    automatic_tax: {
      enabled: true
    }
  },
);
```

# おわりに

Stripe Tax日本ローンチにあわせて、Stripe Billingでの消費税計算処理について整理してみました。

今回紹介したように、海外展開時のメリットが大きいサービスではありますが、国内限定の利用でもStripe Taxを利用することでさまざまなメリットを受けることができます。

0.5%の手数料については、「対応地域を増やす際の工数削減」と「税務処理の効率化」で期待できるコストと比較して検討していただくのが良いかなと個人的には考えております。


# 参考URL

- Stripe Docs - 利用可能な税コード: https://stripe.com/docs/tax/tax-codes
- Stripe Docs - 継続支払いの税金を徴収する: https://stripe.com/docs/tax/subscriptions
- Stripe Docs - 既存のサブスクリプションを移行する: https://stripe.com/docs/tax/subscriptions/migrate

# [PR] Stripe開発者向け情報をQiitaにて配信中！
2021年12月よりQiitaにて、Stripe開発者のためのブログ記事更新を開始しました。

- [Stripe Updates]：開発者向けStripeアップデート紹介・解説
- ユースケース別のStripe製品や実装サンプルの紹介
- Stripeと外部サービス・OSSとの連携方法やTipsの紹介
- 初心者向けのチュートリアル(予定)

など、Stripeを利用してオンラインビジネスを始める方法について随時更新してまいります。

-> [Stripe Organizationsをフォローして最新情報をQiitaで受け取る](https://qiita.com/organizations/stripe)