OneSignalは、GoogleのFCMとAppleのAPNsの上に載り、iOS・Android・Webブラウザへプッシュ通知を配信するサービスです。管理画面からのセグメント配信、メールやアプリ内メッセージとの一元管理、REST APIでの個別送信までを1つの製品で扱えます。この記事では、FreeとGrowthの料金をMAU単位で見積もる式、FCMとAPNsの認証情報の登録、React NativeとExpoへのSDK組み込み、サーバーからの送信コードとレート制限、そしてOneSignalを使わずFCMへ直接送るべき条件までを、公式ドキュメントの記述をもとに整理します。
まとめ:OneSignalで通知を配信すべきアプリと、FCM直送を選ぶ条件
OneSignalが合うのは、マーケティング担当者が管理画面で配信対象を絞り、開発者を介さずに通知を出したいアプリです。月間アクティブユーザー(MAU)1,000人まではFreeで通知を無制限に送れるため、リリース直後のアプリなら費用ゼロで始められます。Growthに上がるとモバイルプッシュは1MAUあたり0.012ドルの従量で、MAU5万人なら従量分だけで月600ドルです。
反対に、通知が「注文が出荷されました」のような業務システムの一部で、送る相手も文面もサーバーが決めるなら、OneSignalを挟む利点は小さくなります。FCMは無料で、APNsへの接続もFCM経由でまとめられます。配信ログを自社DBに残したい、送信先データを外部SaaSに出したくない、という要件があるならFCMへ直接送る構成を選んでください。
OneSignalの仕組み:FCMとAPNsの上に載る配信層とユーザーモデル
OneSignalはプッシュ通知を自前で端末に届けるわけではありません。Android端末へはFCM、iPhoneへはAPNsという、OSベンダーの配信網を必ず通ります。
FCMとAPNsへの送信を代行する配信層と、無料のFCMとの役割の差
OneSignalの役割は、FCMとAPNsへの送信を肩代わりし、その手前に「誰に・いつ・何を送るか」を決める仕組みを足すことです。FCMそのものはFirebaseの料金ページで「No-cost」と書かれた無料サービスで、FCMだけでもAndroid・iOS・Webへ送れます。FCM単体の仕組みと送信方法はFCM(Firebase Cloud Messaging)とは|プッシュ通知の仕組み・送信方法とFID移行で解説しています。
OneSignalが上乗せするのは、セグメント(属性での配信対象の絞り込み)、配信予約、A/Bテスト、開封率の集計、メールやSMSとの横断配信です。FCMで同じことをするには、端末トークンの保存先とセグメントを計算するバッチを自社で作る必要があります。費用を払う対象は「通知の配送」ではなく「配信管理の画面と仕組み」だと捉えると、比較を誤りません。
External IDとSubscriptionで1人に20件の宛先を束ねる設計
OneSignalのデータは、ユーザー(User)と、その配信先であるSubscriptionの2層です。公式のユーザーモデル解説によると、Subscriptionはモバイルプッシュ・Webプッシュ・メール・SMSの宛先1件を表し、1ユーザーに最大20件まで紐づけられます。
実装で押さえるのはExternal IDです。自社の会員IDをExternal ID(最大128文字)としてログイン時に渡すと、iPhoneとAndroidタブレットとメールアドレスが1人のユーザーにまとまります。渡さないと、端末ごとに別ユーザーとして扱われます。「null」「0」「1」「NA」のような値は拒否されるため、未ログイン時の仮IDに使わないでください。
OneSignalの料金:Freeの1,000MAUとGrowthの従量で月額を見積もる
金額は2026年10月15日時点のOneSignal公式の料金ページに載っている値です。ProfessionalとEnterpriseは個別見積りで、公開されているのはFreeとGrowthの2つです。
FreeとGrowthで変わるモバイルプッシュ・Webプッシュ・メールの上限
まず、チャネルごとの上限と単価を並べます。
| チャネル | Free(0ドル) | Growth(月19ドルから) |
|---|---|---|
| モバイルプッシュ | MAU1,000人まで無制限 | 1MAUあたり0.012ドル |
| アプリ内メッセージ | MAU1,000人まで無制限 | モバイルプッシュの購入に含む |
| Webプッシュ | 1回の送信で最大1万購読者 | 1購読者あたり0.004ドル |
| メール | 月1万通 | 月2万通無料、以降1,000通1.50ドル |
| SMS・RCS | 利用可 | 営業に問い合わせ |
Growthは月単位の契約で、ProfessionalとEnterpriseは年契約です。SMSの単価は公開されていないため、SMSを主に使う計画なら見積りを取ってから比較してください。
MAU5万人で月額を試算する式と、オプトインを問わない課金対象
Growthのモバイルプッシュ費用は「MAU×0.012ドル」で決まります。MAU1万人なら120ドル、5万人なら600ドル、20万人なら2,400ドルです。ここに基本料金とメール・Webプッシュの従量が乗ります。
見落としやすいのはMAUの数え方です。公式のユーザーモデル解説には、課金期間中にセッションがあったモバイルSubscriptionが対象で、通知を許可したかどうかは問わないと書かれています。iOSで通知許可率が5割のアプリでも、起動した人数の全員分が課金されます。予算は「通知を受け取れる人数」ではなく「アプリを開いた人数」で置いてください。
送信前の準備:FCMの秘密鍵JSONとAPNsの.p8キーを登録する作業
OneSignalのアプリを作ったら、最初にFCMとAPNsへ送るための認証情報を登録します。ここが済んでいないと、SDKを組み込んでも通知は1通も届きません。
Firebaseで秘密鍵JSONを発行し、FCM HTTP v1で接続する手順
Android向けは、Firebaseのプロジェクト設定の「サービスアカウント」タブで秘密鍵を生成し、ダウンロードしたJSONをOneSignalの管理画面に上げます。OneSignalのFirebase認証情報の手順では、旧来のサーバーキーで送るレガシーAPIは完全に廃止済みと明記されており、使えるのはこのJSONによるFCM HTTP v1だけです。
登録時に「Invalid request」と出た場合は、Google Cloudのサービスアカウントにcloudmessaging.messages.createとfirebase.projects.getの権限があるかを確認します。秘密鍵JSONはGitに入れず、OneSignalへ上げたら手元から消す運用にしておくと漏洩の経路が減ります。
APNsの.p8キーで要るKey ID・Team ID・Bundle IDと環境の条件
iOS向けは、Apple Developerで作る.p8認証キーを使います。OneSignalのAPNs .p8接続の手順によると、入力するのは10文字のKey ID、同じく10文字のTeam ID、そしてBundle ID(例 com.example.app)の3つで、Bundle IDは大文字小文字まで一致させる必要があります。
.p8を選ぶ理由は期限です。.p8は失効せず同じアカウントの全アプリで使えますが、.p12証明書は1年で失効し毎年の更新が要ります。キーは「Sandbox & Production」で作ってください。片方の環境だけのキーは保存時に拒否されます。証明書方式の運用と410・403エラーの原因はAPNs証明書とは|取得・更新手順とAPNs-410/403エラーの原因別対処にまとめています。
React NativeとExpoへのSDK組み込みとExternal IDのログイン
ここからコードです。対象はReact NativeとExpoで、どちらも同じreact-native-onesignalパッケージを使います。FlutterとReact Nativeのどちらで作るかが未定なら、FlutterとReact Nativeの違いと選び方で先に決めておくと手戻りがありません。
react-native-onesignal 5.5系の要件と初期化・ログインのコード
React Native SDKの公式セットアップ手順の要件は、React Native 0.79以上でNew Architectureが有効なこと、iOS 15以上、CocoaPods 1.16.2以上、Google Play開発者サービス入りのAndroid 7.0以上です。パッケージはGitHubのリリース一覧で2026年10月13日公開の5.5.15が最新で、iOS SDK 5.8系を同梱しています。
npm install --save react-native-onesignal
// App.tsx:起動時に1回だけ呼ぶ
import { OneSignal, LogLevel } from 'react-native-onesignal';
OneSignal.Debug.setLogLevel(LogLevel.Verbose); // 本番ビルドでは外す
OneSignal.initialize('YOUR_ONESIGNAL_APP_ID');
OneSignal.Notifications.requestPermission(false);
// 自社の会員IDでログインさせ、端末をユーザーに束ねる
OneSignal.login('member_10234');
// ログアウト時はユーザーの文脈を外す
OneSignal.logout();
loginの前にメールやSMSの宛先を追加すると、それらは匿名ユーザー側に残ります。会員登録の画面でメールを登録する場合は、ログイン後にもう一度追加する順序にしてください。
onesignal-expo-pluginの配置とExpo Goで通知が動かない制約
Expoでは設定プラグインを追加します。Expo向けの公式セットアップ手順の要件はExpo SDK 53以上で、プラグインはplugins配列の先頭に置くよう指定されています。
npx expo install onesignal-expo-plugin
npm install --save react-native-onesignal
// app.json
{
"expo": {
"plugins": [
["onesignal-expo-plugin", { "mode": "development" }]
]
}
}
modeはAPNsの環境で、開発中はdevelopment、TestFlightとApp Store向けはproductionに切り替えます。ここを戻し忘れると、ストア版のiPhoneにだけ通知が届きません。Expo Goではプッシュ通知が動かないため、試すには開発ビルドが必要です。開発ビルドとEASの関係はExpo(React Native)とは?Expo Go・開発ビルド・EASの役割と採用判断で扱っています。
WebプッシュはHTTPSとルート直下のワーカー、iOSはホーム画面追加が条件
Webサイトに通知を出す場合はWeb SDKの公式セットアップ手順に従います。条件はHTTPSで配信していること、サイトのルートにOneSignalSDKWorker.jsを置くことの2つで、HTTPやシークレットモードでは動きません。
iPhoneとiPadはiOS 16.4以降で対応しますが、Androidと違い、manifest.jsonを用意したうえで利用者がサイトをホーム画面に追加しないと通知を受け取れません。iPhone利用者が多いサービスで「Webプッシュだけで済ませる」計画は、届く人数がかなり絞られる前提で立ててください。
サーバーからREST APIで送る:External ID宛ての送信とレート制限
注文確定や予約前日のリマインドのように、自社のサーバーが送信のきっかけを持つ通知はREST APIから送ります。
POST /notificationsで特定ユーザーへ送るcurlの送信例
プッシュ通知APIの公式リファレンスに沿った、External ID宛ての送信例です。
curl --request POST \
--url 'https://api.onesignal.com/notifications?c=push' \
--header 'Authorization: Key YOUR_APP_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"app_id": "YOUR_ONESIGNAL_APP_ID",
"target_channel": "push",
"include_aliases": { "external_id": ["member_10234"] },
"headings": { "en": "Order shipped", "ja": "ご注文の商品を発送しました" },
"contents": { "en": "Your order has shipped.", "ja": "お届け予定日はアプリでご確認ください。" },
"idempotency_key": "6f1c2a9e-4b7d-4e2a-9c3b-1d5e8f0a7b42"
}'
日本語だけを書いても送れません。contentsに英語(en)が無いと「Notifications must have English language content」というエラーが返るため、日本語向けアプリでもenを必ず入れます。include_aliasesを使うときはtarget_channelが必須で、included_segmentsやfiltersとは同じリクエストに混ぜられません。
もう1つの落とし穴は応答の読み方です。宛先が全員未購読だった場合もHTTP 200が返り、通知IDが空になります。ステータスコードだけで成功を判定せず、IDが入っているかまで確かめてください。idempotency_keyは再試行で同じ値を使い、別の通知では使い回しません。
有料6,000件・無料150件の秒間上限と、15分の送信量で止まる条件
公式のレート制限のページによると、通知の作成と取り消しは合わせて、Freeが1アプリ毎秒150リクエスト、有料プランが毎秒6,000リクエストです。ユーザーやSubscriptionの更新は毎秒1,000リクエストで、同じユーザーへの更新は毎秒1回までに制限されます。429が返ったら、Retry-Afterヘッダの秒数以上待って再送します。
APIの上限とは別に、アプリそのものが無効化される条件があります。直近15分間に送ったメッセージ数が、購読中のSubscription数の10倍を超えた場合です。購読1,000件のアプリなら15分で1万通が上限で、テスト中に同じ宛先へループで送り続けるとこの条件に当たります。検証用は本番とは別のOneSignalアプリに分けてください。
OneSignalを採用する条件と、FCM直接送信や自社配信基盤を選ぶ分岐
分かれ目は「通知を誰が作るか」です。マーケティング担当者が作るならOneSignal、サーバーのプログラムが作るならFCM直送が基本線になります。
担当者が管理画面でセグメント配信するアプリでOneSignalを選ぶ条件
OneSignalを選ぶべきなのは、次の条件に2つ以上当てはまるアプリです。
- キャンペーンや新着情報の通知を、開発者を介さず担当者が週に何度も出す
- 「30日起動していない人」のような行動条件で配信対象を絞りたい
- プッシュ通知とメール・アプリ内メッセージを同じ画面で管理したい
- MAUが1,000人未満で、まず費用ゼロで反応を測りたい
この場合、FCMで同等の管理画面とセグメント計算を作ると、開発費だけで数か月分の利用料を超えます。開封率の集計やA/Bテストまで自作する理由はありません。
通知が業務処理の一部ならFCM直送か自社開発を選ぶ条件と失敗例
逆に、送る通知の大半が出荷・予約・承認依頼のような業務イベントで、文面も宛先もサーバーが決めるなら、OneSignalは見送るべきです。MAUが増えるほど従量費が積み上がる一方、使う機能は送信APIだけになります。MAU20万人で月2,400ドルを払い続けるより、無料のFCMへ直接送るほうが合理的です。
よくある失敗は、「通知が届かない」問い合わせの原因をOneSignal側に求めて時間を使うことです。実際にはAndroidの省電力機能で配信が遅れている例が多く、原因の切り分けはAndroidのDozeモードとは?通知が遅れるときの解除方法が参考になります。配信ログを自社DBに残す、送信先の会員情報を外部SaaSに出さない、といった要件まで含めて設計する場合は、スマホアプリ開発の範囲で通知基盤ごと相談できる開発会社を選んでください。開発費の目安はアプリ開発の費用相場は?規模・OS・開発手法別の内訳で比べられます。
よくある質問
OneSignalの導入検討で多い質問に、公式ドキュメントで確認できる範囲で答えます。
OneSignalは無料で使えますか?
使えます。2026年10月時点の公式料金ページでは、Freeプランでモバイルプッシュとアプリ内メッセージが月間アクティブユーザー1,000人まで無制限、メールは月1万通、Webプッシュは1回の送信で最大1万購読者までです。1,000人を超えるとGrowth(月19ドルから)に移り、モバイルプッシュは1MAUあたり0.012ドルの従量になります。API経由の通知作成もFreeでは毎秒150リクエストまでに制限されます。
OneSignalとFirebase(FCM)は何が違いますか?
FCMはGoogleが無料で提供する配送の仕組みで、OneSignalはその上に配信管理の機能を載せたサービスです。OneSignalもAndroid端末へはFCMを通して届けるため、どちらか一方を選ぶ関係ではありません。違いは、セグメント配信・予約・開封率の集計・メールとの一元管理を画面で使えるかどうかです。サーバーから決まった通知を送るだけなら、FCMへ直接送るほうが費用はかかりません。
Expo Goで通知の動作を確認できますか?
できません。OneSignalのExpo向け手順に、Expo Goではプッシュ通知が動作しないと明記されており、開発ビルドを作って確認します。onesignal-expo-pluginはplugins配列の先頭に置き、modeは開発中がdevelopment、TestFlightとストア版がproductionです。Firebase系の通知ライブラリと併用する場合の注意はReact Native Firebaseとはも確認してください。
iPhoneにだけ通知が届かないときは何を確認しますか?
最初に確認するのはAPNsの環境です。Expoならmodeがproductionになっているか、.p8キーを「Sandbox & Production」で作ったかを見ます。次にBundle IDの大文字小文字、Team IDとKey IDの取り違えです。.p12証明書を使っている場合は、1年の有効期限が切れていないかも確認します。端末側では、ユーザーが通知の許可ダイアログで「許可しない」を選んでいないかを設定アプリで見てください。
Webプッシュだけを使うこともできますか?
できます。Web SDKをサイトに入れ、ルート直下にOneSignalSDKWorker.jsを置けば、アプリが無くてもブラウザへ通知を送れます。料金はFreeで1回の送信あたり最大1万購読者、Growthで1購読者あたり0.004ドルです。ただしiPhoneとiPadはiOS 16.4以降で、利用者がサイトをホーム画面に追加した場合に限られます。LINEで通知を送る方式と比べたい場合はLINE Notify終了後の移行実装で費用を試算しています。
関連記事
- FCM(Firebase Cloud Messaging)とは|プッシュ通知の仕組み・送信方法とFID移行【2026年】:OneSignalを使わずFCMへ直接送る場合の仕組みと送信コードです
- APNs証明書とは|取得・更新手順とAPNs-410/403エラーの原因別対処:iOS向け通知の認証情報とエラー対処を扱っています
- Expo(React Native)とは?Expo Go・開発ビルド・EASの役割と採用判断を実装目線で解説【2026年版】:OneSignalの検証に要る開発ビルドの作り方です
- React Native Firebaseとは|v26の新アーキ必須化とExpo・ベア別の導入と落とし穴【2026年8月時点】:FCMをReact Nativeから直接扱う場合の導入手順です
- AndroidのDozeモードとは?Deep/Lightの違いと通知が遅れるときの解除方法:Androidで通知が遅れる原因の切り分けに使えます
- Sendbirdとは?チャットSDKの料金と実装手順、自前WebSocket実装との使い分け:通知ではなくチャット機能そのものをSaaSで載せる場合の料金と実装です