0Pricing
Stripe Payments & SaaS Billing Systems · レッスン

トライアル期間とプラン変更への対応

新規購読者向けのトライアル期間を実装し、異なるサブスクリプションプラン間のアップグレードやダウングレードをスムーズに管理します。

「トライアル期間とプラン変更への対応」はCoddyKit上の無料Stripe Payments & SaaS Billing Systemsレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはStripe Payments & SaaS Billing Systems学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Stripe Payments & SaaS Billing Systemsコースには全4レッスンが含まれています。

このレッスンの一部はまだ翻訳されておらず、英語で表示されています。

Flexible Subscriptions Intro

Welcome! In this lesson, we'll dive into making your subscription service more flexible and user-friendly. We'll cover two key features:

  • Trial Periods: Attract new users with a taste of your service.
  • Plan Upgrades/Downgrades: Allow users to adjust their plan as their needs evolve.

These features are crucial for improving customer satisfaction and retention.

Understanding Trial Periods

A trial period gives users free access to your service for a limited time before they are charged. It's a great way to:

  • Let users experience your full features.
  • Build trust and demonstrate value.
  • Reduce friction for new sign-ups.

Stripe handles the billing logic automatically once the trial ends.

Setting Up a Trial Period

You can define a trial period when creating or updating a Price in Stripe. This sets the default trial duration for any subscription created with that price.

In the Stripe Dashboard, when you create a new Price, look for the 'Trial period' option and specify the number of days (e.g., 7 or 30 days).

Via the API, you use the trial_period_days parameter.

Creating a Subscription with Trial

To create a new subscription that includes a trial, you simply pass the trial_period_days parameter when creating the subscription. Stripe will automatically manage the trial start and end dates.

Try running this Java example:

import com.stripe.Stripe;
import com.stripe.exception.StripeException;
import com.stripe.model.Subscription;
import com.stripe.param.SubscriptionCreateParams;
import java.util.ArrayList;
import java.util.List;

public class Main {
  public static void main(String[] args) {
    Stripe.apiKey = "sk_test_YOUR_SECRET_KEY"; // Replace with your actual test secret key

    try {
      List<SubscriptionCreateParams.Item> items = new ArrayList<>();
      items.add(
        SubscriptionCreateParams.Item.builder()
          .setPrice("price_1OQ2eFLkd2M9gC7q0L1xP5cW") // Replace with YOUR Price ID
          .build()
      );

      SubscriptionCreateParams params = SubscriptionCreateParams.builder()
        .setCustomer("cus_Pq34567890abcdef") // Replace with YOUR Customer ID
        .addAllItem(items)
        .setTrialPeriodDays(7) // Sets a 7-day trial
        .build();

      Subscription subscription = Subscription.create(params);

      System.out.println("Subscription created with trial:");
      System.out.println("ID: " + subscription.getId());
      System.out.println("Status: " + subscription.getStatus());
      System.out.println("Trial End (Unix timestamp): " + subscription.getTrialEnd());

    } catch (StripeException e) {
      System.err.println("Error creating subscription: " + e.getMessage());
    }
  }
}

Monitoring Trial Status

You can check a subscription's status to see if it's currently in a trial. A subscription in trial will have a status of trialing and the trial_end field will contain a Unix timestamp indicating when the trial concludes.

This allows your application to display appropriate messaging to the user.

import com.stripe.Stripe;
import com.stripe.exception.StripeException;
import com.stripe.model.Subscription;

public class Main {
  public static void main(String[] args) {
    Stripe.apiKey = "sk_test_YOUR_SECRET_KEY";

    try {
      String subscriptionId = "sub_12345ABCDEF"; // Replace with an existing Subscription ID
      Subscription subscription = Subscription.retrieve(subscriptionId);

      System.out.println("Subscription ID: " + subscription.getId());
      System.out.println("Current Status: " + subscription.getStatus());

      if ("trialing".equals(subscription.getStatus())) {
        System.out.println("This subscription is currently in a trial period.");
        System.out.println("Trial ends on: " + subscription.getTrialEnd());
      } else if ("active".equals(subscription.getStatus())) {
        System.out.println("This subscription is active and being billed.");
      } else {
        System.out.println("Subscription status: " + subscription.getStatus());
      }

    } catch (StripeException e) {
      System.err.println("Error retrieving subscription: " + e.getMessage());
    }
  }
}

Preparing for Trial End

It's good practice to notify users before their trial ends. This gives them time to decide whether to continue or cancel, reducing unexpected charges and potential disputes.

Stripe sends a webhook event called customer.subscription.trial_will_end a few days before the trial concludes. You can configure this notification period in your Stripe settings.

Your application should listen for this webhook to send custom email reminders.

Understanding Plan Changes

As your users' needs change, they might want to switch to a different subscription plan. Stripe makes it easy to handle upgrades (moving to a higher-tier plan) and downgrades (moving to a lower-tier plan).

When you update a subscription, Stripe automatically handles the complex billing calculations, including prorations, to ensure fair charges.

Upgrading a Subscription

To upgrade a subscription, you update the existing subscription's items array, replacing the old Price ID with the new, higher-tier Price ID. Stripe will then adjust the billing accordingly.

The proration_behavior parameter lets you control how charges are calculated for the change. always_invoice is a common choice.

import com.stripe.Stripe;
import com.stripe.exception.StripeException;
import com.stripe.model.Subscription;
import com.stripe.param.SubscriptionUpdateParams;
import java.util.ArrayList;
import java.util.List;

public class Main {
  public static void main(String[] args) {
    Stripe.apiKey = "sk_test_YOUR_SECRET_KEY";

    try {
      String subscriptionId = "sub_12345ABCDEF"; // Replace with the Subscription ID to update
      String currentSubscriptionItemId = "si_GHIJKLMN"; // Get from the existing subscription's items
      String newPriceId = "price_67890UVWXY"; // Replace with the ID of the new, higher-tier Price

      Subscription resource = Subscription.retrieve(subscriptionId);

      List<SubscriptionUpdateParams.Item> items = new ArrayList<>();
      items.add(
        SubscriptionUpdateParams.Item.builder()
          .setId(currentSubscriptionItemId)
          .setPrice(newPriceId)
          .build()
      );

      SubscriptionUpdateParams params = SubscriptionUpdateParams.builder()
        .addAllItem(items)
        .setProrationBehavior(SubscriptionUpdateParams.ProrationBehavior.ALWAYS_INVOICE) // Prorate and invoice immediately
        .build();

      Subscription updatedSubscription = resource.update(params);

      System.out.println("Subscription upgraded successfully:");
      System.out.println("ID: " + updatedSubscription.getId());
      System.out.println("Status: " + updatedSubscription.getStatus());
      System.out.println("New Price ID: " + updatedSubscription.getItems().getData().get(0).getPrice().getId());

    } catch (StripeException e) {
      System.err.println("Error updating subscription: " + e.getMessage());
    }
  }
}

Handling Plan Downgrades

Downgrading a subscription follows the same API pattern as upgrading. You update the subscription's items array with the ID of the new, lower-tier Price.

Stripe will automatically calculate any credits or refunds due to the customer based on the proration_behavior you specify. For more details on proration, refer to the 'Implementing Prorations' lesson.

import com.stripe.Stripe;
import com.stripe.exception.StripeException;
import com.stripe.model.Subscription;
import com.stripe.param.SubscriptionUpdateParams;
import java.util.ArrayList;
import java.util.List;

public class Main {
  public static void main(String[] args) {
    Stripe.apiKey = "sk_test_YOUR_SECRET_KEY";

    try {
      String subscriptionId = "sub_12345ABCDEF"; // Replace with the Subscription ID to update
      String currentSubscriptionItemId = "si_GHIJKLMN"; // Get from the existing subscription's items
      String newPriceId = "price_ZZZZAASSDD"; // Replace with the ID of the new, lower-tier Price

      Subscription resource = Subscription.retrieve(subscriptionId);

      List<SubscriptionUpdateParams.Item> items = new ArrayList<>();
      items.add(
        SubscriptionUpdateParams.Item.builder()
          .setId(currentSubscriptionItemId)
          .setPrice(newPriceId)
          .build()
      );

      SubscriptionUpdateParams params = SubscriptionUpdateParams.builder()
        .addAllItem(items)
        .setProrationBehavior(SubscriptionUpdateParams.ProrationBehavior.CREATE_PRORATIONS) // Create prorations but don't invoice immediately
        .build();

      Subscription updatedSubscription = resource.update(params);

      System.out.println("Subscription downgraded successfully:");
      System.out.println("ID: " + updatedSubscription.getId());
      System.out.println("Status: " + updatedSubscription.getStatus());
      System.out.println("New Price ID: " + updatedSubscription.getItems().getData().get(0).getPrice().getId());

    } catch (StripeException e) {
      System.err.println("Error updating subscription: " + e.getMessage());
    }
  }
}

Quick Check: Trial End

To notify a user that their subscription trial is about to end, which Stripe webhook event would you typically configure your application to listen for?

Recap & Next Steps

Great job! You've learned how to implement crucial features for flexible subscriptions:

  • How to define and create subscriptions with trial periods.
  • How to monitor a subscription's trial status.
  • The importance of the customer.subscription.trial_will_end webhook.
  • How to programmatically upgrade and downgrade subscription plans using the Stripe API.

These tools empower you to offer a dynamic and user-friendly subscription experience. Next, we'll explore prorations and metered billing in more detail!

よくある質問

「トライアル期間とプラン変更への対応」レッスンは無料ですか?

はい。「トライアル期間とプラン変更への対応」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Stripe Payments & SaaS Billing Systemsコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Stripe Payments & SaaS Billing Systemsコースには全4レッスンが含まれています。

「トライアル期間とプラン変更への対応」で何を学びますか?

新規購読者向けのトライアル期間を実装し、異なるサブスクリプションプラン間のアップグレードやダウングレードをスムーズに管理します。 ブラウザで直接実行するハンズオンコードでStripe Payments & SaaS Billing Systemsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Stripe Payments & SaaS Billing Systemsを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのStripe Payments & SaaS Billing Systemsは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「トライアル期間とプラン変更への対応」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このStripe Payments & SaaS Billing Systemsレッスンでコードを書いて実行できますか?

はい。すべてのStripe Payments & SaaS Billing Systemsレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. トライアル期間とプラン変更への対応
  2. 日割り計算と従量課金の実装
  3. サブスクリプションのライフサイクル管理とイベント
  4. クーポン、割引、プロモーションコード
← Stripe Payments & SaaS Billing Systemsに戻る