Google Cloud’s free trial has an expiration date. When it expires, if you haven’t upgraded to a full account, your resources are stopped.

In my case, that expiration date fell right in the middle of a contest’s judging period.

Firestore and Cloud Functions shutting down while judges are using the app. The demo video and the store listing are fine, but open the app on a real device and nothing works. I noticed 46 days before the trial expired.

First, how to check the expiration date

This is where I stumbled first. You can’t get it from the CLI.

gcloud billing accounts describe 012A11-412AAD-E43B6A

All it returns is the currency and the open status. Neither the credit balance nor the days remaining are included. I checked this myself.

The only way is to open the billing account page in the console and read the banner at the top.

無料トライアルのステータス: ¥48,488 クレジット、残り 46 日

That reads “Free trial status: ¥48,488 credit, 46 days remaining.” If this banner isn’t shown, that account is already a paid account. That’s all you need to tell. You’ll also see an ”ⓘ Paid account” label.

Each app has a different billing account, so checking one tells you nothing

I have 4 projects, and every one was attached to a separate billing account. They were created at different times, so in hindsight that makes sense.

AppProjectTrial status
Narabugyoretsu-appIn trial (46 days left)
Kirokuai-diary-shipaton-744bbAlready a paid account
Nemurushipaton-ehonAlready a paid account

Check one, feel relieved, and you’ll have an accident. Trial expiration is independent for each billing account, so I had to check all of them.

I also noticed along the way that there was a confusingly named separate project, ai-diary-shipaton (no hash suffix). That one is billingEnabled=false; the real one is -744bb. If you go by project name alone, you’ll look at the billing for a project that isn’t running and wrongly conclude “¥0, so it’s safe.”

So what does the bill look like on a paid account?

This is the main point. I thought “full account = charges begin.” I was wrong.

The order goes like this:

① Offset by the free tier (Always Free)  →  ② Drawn from remaining credits  →  ③ Only the excess is charged

The free tier doesn’t go away when you become a paid account. That was my biggest misconception.

Here are the actual numbers for the 2 apps that were already running on paid accounts (2026/08/01–08/26).

AppCostSavings (free tier)Total cost
Kiroku¥6−¥6¥0
Nemuru¥2−¥2¥0
Narabu¥14−¥14¥0

All 3 had a total cost of ¥0. The forecasted total cost for the month was ¥0 as well.

Even more decisive: the credit balance hadn’t dropped by even ¥1. Narabu’s balance was ¥48,488, the same amount as when the trial started. So that ¥14 never even reached ② (credit consumption); it was covered entirely by ① the free tier.

To reach ③, you’d need several hundred times the current usage. Unless my usage changes, the bill stays at ¥0.

I ran the upgrade after seeing these numbers. “Upgrading to a paid account adds almost no real cost” was backed not by a paper estimate but by real measurements from other apps with the same setup, so the decision took 10 seconds.

The ¥48,488 in credits will expire unused

This one isn’t funny. Trial credits aren’t extended when you upgrade. In my case, they expire on October 11, 2026.

At the current pace (the equivalent of ¥14 a month, all of it within the free tier), there’s no way I’ll ever use up ¥48,488. In practice, it will expire without a single yen being used.

So don’t count on these credits as funding for your business plan. The idea of “I’ve got ¥50,000 worth of credits, so I can run a nationwide crawl” dies at the expiration date.

Where people first go wrong with budget alerts

As insurance, I set up a budget alert: ¥1,000 a month, with 3 thresholds at 50%, 90%, and 100%.

There’s one setting to watch here: whether the budget should “include or exclude credits.” If you create it without thinking about this, the alert won’t behave the way you expect.

  • After credits (include): monitors the amount you’ll actually be billed. Choose this if you want it to react to “money going out”
  • Before credits (exclude): monitors usage itself. Choose this if you want it to react to abnormal usage spikes that credits are hiding

For an indie developer, the latter is the scary one. Even if a bug sends Functions into an infinite loop, the bill stays at ¥0 while you still have plenty of credits, so an after-credits alert won’t fire until the balance runs out. The moment it does, real charges start piling up in earnest.

I prioritized “finding out about abnormal usage early.” An alert that fires after the damage is done is too late.

Summary

  • The days remaining on the free trial can only be read from the console banner. You can’t get it from the CLI
  • Billing accounts are separate per project. Checking one tells you nothing about the others
  • Upgrading to a paid account doesn’t remove the free tier. At indie scale, the measured total cost is ¥0
  • Trial credits aren’t extended, so don’t count on them
  • Set at least one budget alert based on usage with credits excluded

As an aside, the upgrade itself is an operation that can incur real charges, so I explicitly excluded it from automation and made it a rule that a human does it by hand. This is the one place I decided not to optimize.


The full picture of what I’m actually billed is in Running 3 apps for a month cost me ¥22, and the revenue-side design is in how rewarded ads beat subscriptions.