TROCCOでStripeの請求書データを転送してみた

# TROCCOがStripeのデータ転送に対応しました:sparkles:

# Stripeとは?
Stripeは、オンライン決済処理を提供するSaaS（Software as a Service）です。企業や個人が簡単にクレジットカード決済や銀行振込、デジタルウォレット（Apple Pay, Google Pay など）を導入できるプラットフォームです!

# TROCCOとは?
TROCCOは、データの連携・変換をスムーズに実現するクラウド型データ統合ツールです。
執筆者はTROCCOのカスタマーサクセスエンジニアをしています。

# TROCCOでStripe??何ができるの??
コードを書かずに、Stripe APIから抽出したデータを
任意のサービスにデータを転送することができます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3033246/c085fa85-a88a-4b57-8f55-34f9f881669b.png)

次の2ステップでStripe→DWHへのデータ転送が可能です。
- 画面上でStripeから取得したいデータを選ぶ
- データの格納先の情報を入れる（今回はSnowflakeのテーブル）

![stripe_to_snowflake_demo_20250221.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3033246/641f7290-5557-4939-8fe0-7e81606415a8.gif)




プレビューが表示されるので、そのまま保存。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3033246/6f91156c-18fa-4134-9f19-5b6f7bb7f295.png)

設定を作成したら、実行。
Snowflakeにデータが格納されました!!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3033246/a09008a9-561f-4502-86a0-bb38685645ff.png)



# TROCCOの転送元Stripeで取得できるもの
2025/02現在、以下のエンドポイントからデータを取得可能です。
※まとめをAIにお任せしたので、間違いがあるかもしれません

| **API名（英語）** | **管理画面上の表示（日本語）** |  **ユースケース** |
|------------------|------------------------------| ------------------------------|
| [Customers](https://stripe.com/docs/api/customers) | 顧客 | 顧客の購買履歴、支払い情報、連絡先の統合管理。CRMシステムとの連携。
| [Checkout Sessions](https://stripe.com/docs/api/checkout/sessions) | チェックアウトセッション |
| [Setup Attempts](https://stripe.com/docs/api/setup_attempts) | セットアップ試行 | Setupとは、顧客が支払い方法（クレジットカード、銀行口座など）をStripeに登録しようとする試みのこと。不正防止の検知など。
| [Accounts](https://stripe.com/docs/api/accounts) | アカウント |
| [Shipping Rates](https://stripe.com/docs/api/shipping_rates) | 配送料 |
| [Balance Transactions](https://stripe.com/docs/api/balance_transactions) | 残高取引 | 入出金、手数料などの情報を一元管理し、会計処理や資金管理の効率化を図れます。会計ソフトとの連携で、経理業務の自動化も可能か?
| [Files](https://stripe.com/docs/api/files) | ファイル | 契約書や支払い証明書などの文書管理
| [File Links](https://stripe.com/docs/api/file_links) | ファイルリンク |
| [Refunds](https://stripe.com/docs/api/refunds) | 返金 | 返金率や不正率の分析
| [Payment Methods](https://stripe.com/docs/api/payment_methods) | 支払い方法 |
| [Credit Notes](https://stripe.com/docs/api/credit_notes) | クレジットノート |
| [Early Fraud Warning](https://stripe.com/docs/api/early_fraud_warnings) | 早期不正警告 |
| [Authorizations](https://stripe.com/docs/api/issuing/authorizations) | 認証 | 支払い能力の確認。リスク管理や不正検知
| [Cardholders](https://stripe.com/docs/api/issuing/cardholders) | カード所有者 |
| [Charges](https://stripe.com/docs/api/charges) | 支払い | 財務分析・売上管理。不正決済の検知による、リスク管理
| [Coupons](https://stripe.com/docs/api/coupons) | クーポン |
| [Disputes](https://stripe.com/docs/api/disputes) | 支払い異議 |
| [Application Fees](https://stripe.com/docs/api/application_fees) | アプリケーション手数料 | プラットフォーム利用料の徴収
| [Invoices](https://stripe.com/docs/api/invoices) | 計算書 | 請求業務の効率化と正確性向上
| [Invoice Items](https://stripe.com/docs/api/invoiceitems) | 計算書アイテム |
| [Payouts](https://stripe.com/docs/api/payouts) | 振込 |
| [Plans](https://stripe.com/docs/api/plans) | プラン |
| [Prices](https://stripe.com/docs/api/prices) | 価格 |
| [Products](https://stripe.com/docs/api/products) | 商品 | 商品情報や価格設定、割引情報の管理
| [Reviews](https://stripe.com/docs/api/reviews) | レビュー |
| [Subscriptions](https://stripe.com/docs/api/subscriptions) | 定期支払い | 収益予測や解約率分析
| [Subscription Schedule](https://stripe.com/docs/api/subscription_schedules) | 定期支払いスケジュール |
| [Transfers](https://stripe.com/docs/api/transfers) | 振替 |
| [Payment Intents](https://stripe.com/docs/api/payment_intents) | 支払いインテント |
| [Promotion Codes](https://stripe.com/docs/api/promotion_codes) | プロモーションコード |
| [Setup Intents](https://stripe.com/docs/api/setup_intents) | セットアップインテント |
| [Transactions](https://stripe.com/docs/api/issuing/transactions) | 取引 |
| [Top-ups](https://stripe.com/docs/api/topups) | チャージ | Stripeアカウントへのチャージ情報を確認する事が可能
| [Subscription Items](https://stripe.com/docs/api/subscription_items) | 定期支払いアイテム |
| [External Accounts](https://stripe.com/docs/api/accounts/external_accounts) | 外部アカウント |
| [Customer Balance Transactions](https://stripe.com/docs/api/customers/balance_transactions) | 顧客残高取引 | 顧客の残高推移の管理、利用状況の把握
| [Person](https://stripe.com/docs/api/persons) | 個人 |
| [Cards](https://stripe.com/docs/api/issuing/cards) | カード |
| [Application Fee Refunds](https://stripe.com/docs/api/application_fees/refunds) | アプリケーション手数料の返金 |
| [Bank Accounts](https://stripe.com/docs/api/external_account_objects/bank_account) | 銀行口座 |
| [Invoice Line Item](https://stripe.com/docs/api/invoices/line_items) | 計算書明細項目 |
| [Transfer Reversals](https://stripe.com/docs/api/transfer_reversals) | 振替の取消 |


# TROCCOを使って、Stripeの請求データをSnowflakeに転送してみます!!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3033246/90760ea9-9992-48f6-adf7-2b76ee01e1ac.png)
（スクリーンショットはsandbox環境です）

## TROCCOを使って請求書データをSnowflakeに転送する
invoice（請求書）のデータを抽出するよう指定します。画面から選ぶだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3033246/21681117-33b4-4fd8-8b66-e35662aa4c3d.png)

Snowflakeの設定はこのような感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3033246/61ecc6cf-f0e2-4d6a-87a9-1e6a88a3a771.png)

TROCCO上でデータの加工もできますが、今回はなにもせず、そのままの形で転送します。

ジョブを実行して、データ転送は完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3033246/6a247e95-0085-491d-896b-8c0b5dfea654.png)

### 参考）invoiceのカラム一覧

| **カラム名** | **日本語訳** |
|-------------|------------|
| id | ID |
| object | オブジェクト |
| auto_advance | 自動更新 |
| automatic_tax | 自動税計算 |
| charge | チャージ |
| collection_method | 収集方法 |
| currency | 通貨 |
| customer | 顧客 |
| description | 説明 |
| hosted_invoice_url | 請求書URL |
| lines | 明細行 |
| metadata | メタデータ |
| payment_intent | 支払いインテント |
| period_end | 期間終了 |
| period_start | 期間開始 |
| status | ステータス |
| subscription | サブスクリプション |
| account_country | アカウント国 |
| account_name | アカウント名 |
| account_tax_ids | アカウント税ID |
| amount_due | 支払金額 |
| amount_paid | 支払済み金額 |
| amount_remaining | 残額 |
| amount_shipping | 送料 |
| application | アプリケーション |
| application_fee_amount | アプリケーション手数料 |
| attempt_count | 試行回数 |
| attempted | 試行済み |
| automatically_finalizes_at | 自動確定時刻 |
| billing_reason | 請求理由 |
| created | 作成日時 |
| custom_fields | カスタムフィールド |
| customer_address | 顧客住所 |
| customer_email | 顧客メール |
| customer_name | 顧客名 |
| customer_phone | 顧客電話番号 |
| customer_shipping | 顧客配送情報 |
| customer_tax_exempt | 顧客の税免除 |
| customer_tax_ids | 顧客税ID |
| default_payment_method | デフォルト支払い方法 |
| default_source | デフォルトの支払い元 |
| default_tax_rates | デフォルト税率 |
| discount | 割引 |
| discounts | 割引一覧 |
| due_date | 期限日 |
| effective_at | 適用日時 |
| ending_balance | 期末残高 |
| footer | フッター |
| from_invoice | 元の請求書 |
| invoice_pdf | 請求書PDF |
| issuer | 発行者 |
| last_finalization_error | 最終確定エラー |
| latest_revision | 最新の改訂 |
| livemode | ライブモード |
| next_payment_attempt | 次回支払い試行日時 |
| number | 請求書番号 |
| on_behalf_of | 代理請求先 |
| paid | 支払い済み |
| paid_out_of_band | 手動支払い済み |
| payment_settings | 支払い設定 |
| post_payment_credit_notes_amount | 支払い後のクレジットメモ金額 |
| pre_payment_credit_notes_amount | 支払い前のクレジットメモ金額 |
| quote | 見積もり |
| receipt_number | 領収書番号 |
| rendering | 表示設定 |
| shipping_cost | 送料 |
| shipping_details | 配送詳細 |
| starting_balance | 期首残高 |
| statement_descriptor | 明細記載情報 |
| status_transitions | ステータス遷移 |
| subscription_details | サブスクリプション詳細 |
| subscription_proration_date | サブスクリプション日割り適用日 |
| subtotal | 小計 |
| subtotal_excluding_tax | 税抜小計 |
| tax | 税額 |
| test_clock | テストクロック |
| threshold_reason | 閾値理由 |
| total_discount_amounts | 割引合計 |
| total_excluding_tax | 税抜合計 |
| total_tax_amounts | 税合計 |
| transfer_data | 振替データ |
| webhooks_delivered_at | Webhook配信日時 |


## Snowflake上で請求書データから未払請求書を特定してみる

クエリを書いて、TROCCOで転送したデータから未払請求書のデータを取り出してみます。
未払いの請求書は、statusがopenまたはuncollectibleのものを指します。
| **ステータス** | **説明** |
|----------------|----------------------|
| `draft`      | 下書き状態（顧客には未送信） |
| `open`       | 発行済み・未払いの状態 |
| `paid`       | 支払い完了 |
| `uncollectible` | 未回収（回収不能と判断されたもの） |
| `void`       | **無効化された請求書**（支払い不可） |

詳しくはこちら
https://docs.stripe.com/invoicing/overview?locale=ja-JP#invoice-lifecycle

### クエリ
```sql
SELECT 
    "id",
    "customer",
    "amount_due",
    "currency",
    "due_date",
    "status",
    TO_TIMESTAMP("due_date"),
    CURRENT_TIMESTAMP
FROM DEMO_SHANAI.PUBLIC."demotable_stripe_invoice"
WHERE 
("status" = 'open' AND TO_TIMESTAMP("due_date") < CURRENT_TIMESTAMP()) 
OR
("status" = 'uncollectible')
ORDER BY "due_date" ASC;
```
#####  ポイント
- 画面上Past Due（期限切れ未払い）と表示されているものの、status値はopen
- 期限（due_date）と現在日付を比較し抽出する必要がある
- 期限（due_date）はUNIXTIME


実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3033246/c918790b-10f5-4da8-9dd1-37e7067e2419.png)

未払いの請求書を特定することができました!!
※uncollectibleのテストデータは作れませんでした…

取得したIDを画面から検索しましたが、Past Due（期限切れ未払い）のものが取得できています:sparkles:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3033246/393825d1-adb7-47bf-9173-fd4599c814b4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3033246/506d1c8e-a60a-454e-953b-dc52e153e9b7.png)



# まとめ
いかがでしたでしょうか。TROCCOを利用することで、Stripeから簡単にデータを転送できました:cherry_blossom:
今回はStripeのデータを単体でクエリしましたが、Salesforce等の営業データと組み合わせることで、収益・顧客行動・営業の成果分析にも繋げられそうと思いました。

この記事を見てくださった方に、なにか少しでもお役に立てていたらならば幸いです🙏