Stripeで増税対応する方法

Stripeで増税対応する方法
どうもTAKUYAです。2019年10月1日から日本の消費税が8%から10%に変更された。一般的なウェブサービスの利用料は軽減税率の適応外のため、消費税は10%となる。拙作アプリInkdropでは課金にStripeを使用している。このStripeではこの対応をどうやって行うのか、備忘録も兼ねて書いておく。
Tax Ratesオブジェクトの管理
Stripeでは最近tax ratesという項目が追加された。これまで tax_rates
というフィールドを個別の請求やサブスクに指定していたが、今後はあらかじめ作成したTax RatesのIDを指定する。以下が移行に関するドキュメント。中の人のSamantha氏がわざわざメールで教えてくれた。
Tax Ratesの設定画面は以下の通り
日本では海外ユーザの売上は非課税となるため、0%のTax Rate Objectを用意した。8%のTax Rateが2つあるのは、Stripeの謎挙動による自分の管理ミスなので気にしなくていい。
10月1日、自分はこの既存の8%のTax Rate ObjectのRateを10%に変更すれば良いと思い込んでいた。しかしそれは出来なかった。以下のように、変更画面では付随的情報しか変更できず、肝心のRateは不可変となっている:

つまり、新しい税制に対応する場合は、それ用の新しいTax Rateオブジェクトを用意し、既存のサブスクや請求に適用する必要がある。顧客の数が多い場合は手動操作で済む量ではなくなるため、スクリプトを組む。
新しいTax Rate IDを指定する
結論から述べると、急遽以下のスクリプトを作って対応した:
async function updateTaxRate() {
let starting_after = undefined
let res
do {
logger.debug('Fetching subscriptions:', { starting_after })
res = await stripe.subscriptions.list({
limit: 100,
starting_after
})
const items = res.data
logger.debug('got', items.length, 'of items')
for (const item of items) {
const defTaxRates = item.default_tax_rates
if (defTaxRates && defTaxRates.length > 0) {
const [taxRate] = defTaxRates if (
taxRate.id === '<Old Tax Rate ID>'
) {
logger.debug('Found old tax rate:', item.id)
await stripe.subscriptions.update(item.id, {
default_tax_rates: ['<New Tax Rate ID>']
})
logger.debug('Updated default tax rate')
}
}
}
starting_after = items[items.length - 1].id
} while (res.has_more)
logger.debug('Finished!')
}
- stripe.subscriptions.list でサブスクの一覧を100件取得する
- 各アイテムの
default_tax_rates
を確認する - 古いTax Rateを見つける
- 新しいTax Rate IDを指定して stripe.subscriptions.updateをコールする
has_more
がある場合はループ
とても単純なコードだ。
なお、新しいサブスクリプションを作成する時も、新しいTax Rateを default_tax_rates
に指定する事を忘れないようにする。
さて、この変更によって将来のInvoiceで正しく10%が適用されている事を確認する。

大丈夫そう。以上。