Communityライティング&編集github.com

erberkk/web-presence-and-seo

モバイルアプリのストア登録とローンチに必要なWebサイト(プライバシーポリシー、利用規約、サポート、アカウント削除ページ、.well-knownファイル、招待ページ、ランディングページ、OG画像、SEO対策)を構築・チェック・デプロイするスキルです。

web-presence-and-seo とは?

このスキルは、モバイルアプリのストア登録や公開に必要なWebプレゼンスを迅速に構築し、SEO最適化を行うためのものです。iOS/Androidの両ストアで要求されるプライバシーポリシー、サポート、アカウント削除ページ、およびApple App Site Associationやassetlinks.jsonなどのファイルを、静的サイトとして作成します。また、招待/紹介ページ(/i/<code>)では、アプリがインストールされていれば直接開き、そうでなければストアに誘導する仕組みを提供します。ランディングページでは、ストアバッジと国ごとの正確な価格をエッジで動的に表示し、Open Graph画像、技術的SEO(hreflang、canonical、sitemap、robots.txt、JSON-LD)、Search ConsoleやBing Webmaster Tools、IndexNowによる発見性向上、AIクローラーポリシーとllms.txt、さらに承認ゲート付きのCloudflare Workerへのデプロイまでをカバーします。サイトチェッカーやIndexNowピングスクリプトも含まれており、開発者がストア提出前にライブURLを用意し、検索エンジンやAIアシスタントに発見されるための完全なソリューションを提供します。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/erberkk/mobile-app-launch-skills/tree/HEAD/skills/web-presence-and-seo

Installed? Explore more ライティング&編集 skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

WebプレゼンスとSEO

目的

両ストアはアプリを提出する前にURL(プライバシーポリシー、サポート、アカウント削除、アプリリンク用の.well-knownファイル)を要求します。このスキルは、まずそれらのフォームを満たす小さく高速な静的サイトを構築し、次にトラッカーやダークパターン、アプリが裏付けできない数字を使わずに、検索エンジン、リンクプレビュー、AIアシスタントから見つけられるようにします。

これはストア登録とプライバシーフォーム(listing-and-aso、privacy-and-declarations)の前に行ってください。ライブURLが必要です。

前提条件

  • あなたが管理するドメインとDNSアクセス(例ではCloudflareを使用していますが、ヘッダーを設定しファイルをリダイレクトなしで配信できるホストであれば何でも構いません)。
  • identity-and-signingからのアプリの最終的な識別子と署名データ(Team ID、バンドルID、パッケージ名、Play アプリアップグレード用 SHA-256)。
  • privacy-and-declarations(コード/SDKスキャンから導出)からのプライバシーポリシーテキストと、アプリ内に実際に存在する削除フローの内容。
  • subscriptions-and-paymentsからのストア読み戻しの価格(記憶から入力しないこと)。
  • Node.js 18+(scripts/内のスクリプト用)。

1. ストアが必要とするページ

すべてのストアフィールドとURLの対応チェックリスト:references/store-url-checklist.md

ページパス(推奨)ルール
プライバシーポリシー/privacy公開、ログイン不要、ジオブロッキングなし、HTML(PDF不可)、アプリ名を記載、ストアのプライバシー回答と一致
利用規約/termsサブスクリプションを販売する場合に必要(Apple標準EULAまたは独自のもの、アプリとストア登録にリンク)
サポート/問い合わせ/support実際の連絡手段(メールまたはフォーム)、FAQのみではない
アカウント削除(Web)/delete-accountGoogle Playで必須。ストア登録と同じアプリ名を記載、ページからユーザーが削除をリクエスト可能、削除されるもの・保持されるものとその期間、ストアのサブスクリプションは別途キャンセルする必要があることを明記
  • Appleは削除をアプリ内で開始することを要求します(ガイドライン5.1.1(v))。Webページはこれを代替しません。Playはアプリ内パスとWeb URLの両方を要求します。ドキュメント:Appleアカウント削除、Playアカウント削除、PlayプライバシーポリシーURLルール
  • サインアウト状態でも安定。 クッキーウォール、ログイン、テキスト読み取りにJavaScript不要。提出後にパスを変更しないこと。変更する場合は、古いパスから301リダイレクトを維持すること。
  • 言語別。 言語ごとに1つのURL(/privacy、/de/privacy)にhreflangを設定。App Store ConnectではロケールごとにプライバシーURLを設定可能。ページが翻訳されていない場合は、404ではなくデフォルト言語のページにリンクすること。
  • 法律ページには「最終更新日」を表示し、古いバージョンはバージョン管理に保持すること。

2. アプリリンクのホスティング

ファイル自体のテンプレートはidentity-and-signing/templates/にあります。このセクションではそれらの配信について説明します。

  • https://<domain>/.well-known/apple-app-site-association および /.well-known/assetlinks.json:HTTP 200、Content-Type: application/json、リダイレクトなし(http→https、apex→www、末尾スラッシュ追加のいずれも不可)、認証なし、ボットチャレンジページなし。
  • apexとwwwのどちらを使うかは一度決める。エンタイトルメント/インテントフィルターにリストされているすべてのホストでファイルを配信し、もう一方のホストはページのみリダイレクト(/.well-known/はリダイレクトしない)。
  • 静的ホストでは、拡張子なしのAASAをapplication/octet-streamとして配信することがよくあります。Workerを介して/.well-known/*をルーティングするか(テンプレートを参照)、ヘッダーを明示的に設定してからscripts/check-site.mjsで確認してください。
  • ドメインを主張するアプリのビルドの前に.well-knownファイルをデプロイしてください。AppleはAASAをCDN経由で取得するため、変更が反映されるまで時間がかかることがあります。

招待/紹介ページ(/i/<code>)

  • Workerはコードをバックエンドが発行する正確なアルファベットと長さに対して検証し、テンプレートを埋めます。URLからHTMLに到達するものは他にありません。
  • アプリがインストールされている場合、ユニバーサルリンク/アプリリンクが直接開きます(パスがAASAのcomponentsとAndroidのインテントフィルターにある必要があります)。インストールされていない場合、ページには両方のストアボタンと手動フォールバックとして「コードをコピー」ボタンが表示されます。
  • Android:Play URLに&referrer=<urlエンコードされたkey=value>としてコードを追加し、PlayインストールリファラーAPIを使用してアプリで読み取ります。iOSにはインストールリファラーはありません。ユーザーにコードを貼り付けてもらうか、明示的なタップ後にのみクリップボードから事前入力します。
  • ヘッダー:X-Robots-Tag: noindex、Cache-Control: private, no-store、Referrer-Policy: no-referrer。/i/をサイトマップから除外すること。robots.txtでDisallowしないこと。ページを取得できないクローラーはnoindexを認識しません。

3. ランディングページ

  • ストアのスクリーンショットと同じビジュアル言語(色、フォント、同じ実際のUIカード)。サイトから訪れた人がストアページを認識できるようにすること。
  • ストアバッジは公式アートワークのみを使用し、未変更で、必要な間隔と文言を守り、ストア登録に直接リンクすること。ルール:Appleマーケティングガイドライン、Google Playバッジ
  • ローンチ前:「Coming soon to the App Store and Google Play」の1行のみ。無効なバッジ3つは表示しない。ローンチ時(リリース公開後):実際のバッジリンクに切り替え、Smart App Bannerメタタグを追加(ドキュメント)、llms.txtとJSON-LDを更新。これを単一の設定フラグとして管理し、1回の変更で済ませること。切り替えには承認が必要。
  • 正直な価格。 価格はストア読み戻しから生成された1つのファイルから取得します。ページにはプレースホルダー(%%PRICE_MONTHLY%%)が含まれています。Workerが訪問者の国(request.cf.country)に基づいてこれらを埋め、テーブル外の国には「ストアがお客様の通貨で正確な価格を表示します」と表示します。ページの言語が通貨を決定することはありません。取り消し線の「以前の」価格、偽のカウントダウン、事前チェックされたものは一切なし。
  • 高速でアクセシブル。 テキストはHTMLで提供(JSでレンダリングしない)、CSSは1ファイル、JSは最小限またはなし、セルフホストフォントでfont-display: swap、ヒーロー画像はサイズ指定とfetchpriority="high"。目標値:LCP < 2.5秒、CLS < 0.1、INP < 200ミリ秒(Web Vitals)。WCAG 2.2に従ったコントラストとフォーカス状態、prefers-reduced-motionを尊重。
  • アナリティクス。 なし、またはサーバーサイド/クッキーレスカウント(エッジログ、プライバシー重視のアナリティクスで識別子なし)を優先。クッキーを設定せず、サードパーティスクリプトを読み込まない場合、クッキーバナーは不要。「念のため」表示しないこと。トラッカーを追加する場合は、同意バナー、プライバシーポリシー、ストアのプライバシー回答をすべて一緒に変更する必要があります。

4. ソーシャルシェア画像

  • 言語ごとに1つのOpen Graph画像:1200×630のPNG/JPG、約1MB以下、サムネイルサイズでも読める大きさのテキスト。og:imageとtwitter:imageには絶対https://URLを使用し、og:image:width/height/alt、og:title、og:description、og:url、twitter:card=summary_large_imageを指定。仕様:ogp.me、Meta共有ガイド
  • メッセージングアプリはプレビューを積極的にキャッシュします。画像を変更した後は、新しいファイル名(または?v=2)を付け、Sharing Debuggerで再スクレイピング(「Scrape Again」)してください。WhatsAppなどのメッセンジャーは公開リフレッシュツールがない独自のキャッシュを保持するため、新しい画像URLが信頼できる解決策です。新しいチャットでリンクを送信してテストしてください。

5. 技術的SEO

  • タイトル(約50~60文字、ブランド名+説明)とメタディスクリプション(約150~160文字)はページと言語ごとにユニークに。タイトルリンク、スニペット
  • hreflang:各言語バージョンはすべてのバージョン(自身を含む)とx-defaultをリストし、ペアは相互でなければなりません。ローカライズ版
  • Canonical:自己参照、絶対URL、最終的な(リダイレクトしない)URLを使用。正規化
  • サイトマップ:200、インデックス可能、正規URLのみを含み、実際の<lastmod>(例:gitからのコンテンツ変更日、ビルド時間ではない)を設定。テンプレート、ドキュメント
  • robots.txt:テンプレート、紹介。robots.txtはクロールを制御し、インデックスは制御しません。結果に表示したくないページにはnoindexを使用します。
  • 構造化データ(JSON-LD):Organization、WebSite、MobileApplication。FAQPageはページ上に表示されているFAQにのみ使用。例とルール:references/structured-data.md
  • 非プロダクションホスト(プレビュー、*.workers.dev)はX-Robots-Tag: noindexを送信します。

6. 発見性向上

  1. Google Search Console:Domainプロパティを追加し、apexにgoogle-site-verification TXTレコードを追加、確認、サイトマップを送信、ホームページのインデックスをリクエスト。所有権確認
  2. Bing Webmaster Tools:Search Consoleからインポートするか、Bingから提供されたDNSレコード(CNAME)で確認し、サイトマップを送信。追加と確認
  3. IndexNow(Bing、Yandex、Seznam、Naverなど、Googleは非対応):/<key>.txtをホストし、キーを含めてデプロイし、node scripts/indexnow-ping.mjs(ドライラン)と--sendを実行。スクリプトは最初にキーファイルが公開されているか確認します。プロトコル
  4. AIクローラーとllms.txt:ボットごとに検索/回答ボットとトレーニングボットの許可/拒否を決定(所有者の判断、承認が必要)。ボット一覧、目的、公式リンク:references/ai-crawlers.md。製品概要と主要URLを含む短いllms.txtを追加します。価格は含めないでください。

DNSレコードは共有インフラです。新しいレコードを追加し、既存のTXT/SPF/MXレコードは編集または削除しないでください。DNS変更には承認が必要です。

7. デプロイ(Cloudflare Workerの例)

テンプレート:templates/worker.example.js。適切なタイプとリダイレクトなしで.well-knownファイルを配信し、国別価格プレースホルダーを埋め、/i/<code>をレンダリングし、セキュリティヘッダーと非プロダクションホストでのnoindexを追加します。

2つのストレージオプション:

  • Workers Static Assets(最もシンプル):wrangler.jsoncで"assets": { "directory": "./dist", "binding": "ASSETS", "run_worker_first": true }。Workerがenv.ASSETS.fetch()を呼び出します。ドキュメント
  • KV(コンテンツアドレス方式):ビルドでファイルをハッシュとmanifest.js(パス→ハッシュ、タイプ)の下に書き込み、wrangler kv bulk putでWorkerをデプロイする前にアップロードします。新しいマニフェストが存在しないファイルを指さないようにするためです。KVコマンド

手順:

  1. node build.mjs → dist/(不足している翻訳キーや価格以外の未入力プレースホルダーがあると失敗)。
  2. ユニットテスト(node --test):スタブアセットに対してWorkerのfetchを実行。カバー範囲:AASA/assetlinks 200 + application/json + リダイレクトなし。www/httpのページのみリダイレクト。/i/<bad> → 404、/i/<good> → noindex + no-store。すべての価格地域がすべてのプレースホルダーを埋める(%%が残らない)。不正なパーセントエンコーディング → 500ではなく404。
  3. プレビュー:npx wrangler deploy --dry-run、またはプレビューホストにデプロイしてnode scripts/check-site.mjs https://<preview-host>を実行。
  4. 承認 — プロダクションデプロイ(npx wrangler deploy)。wrangler.jsoncでaccount_id、name、ルートを固定し、共有アカウントで別のプロジェクトをターゲットにできないようにする。
  5. デプロイ後:node scripts/check-site.mjs https://example.com --invite <サンプルコード>、次にIndexNowピング。

人間の承認が必要な決定ポイント

  • プロダクションデプロイとDNS変更。
  • 法律ページ(プライバシー、利用規約、削除)の文言。所有者が変更に署名します。
  • AIトレーニングクローラーの許可/拒否。
  • 「近日公開」→「ダウンロード」の切り替えとサイトに表示される価格。
  • アナリティクス、ウェイトリストフォーム、または個人データを収集するものの追加。

検証

  • node scripts/check-site.mjs https://example.com --paths /privacy,/terms,/support,/delete-accountが0で終了:必要なページがサインアウト状態で200、AASA/assetlinksがリダイレクトなしのJSON、OGタグに到達可能な絶対画像、相互のhreflang、サイトマップURLがすべて200。
  • ストアURLチェックリストのすべてのURLがスマートフォンのプライベートウィンドウで開くこと。
  • リッチリザルトテストとスキーママークアップバリデーターでエラーなし。PageSpeed InsightsモバイルLCP < 2.5秒。
  • Search Console:サイトマップ「Success」。Bing:IndexNow送信が表示される。

よくある落とし穴

  • ログイン、PDF、またはアプリ名を記載していない一般的な会社ポリシーにリダイレクトするプライバシーURL。
  • 削除ページで「アプリ内で削除してください」とだけ書かれている(Playはページ上にリクエストパスを要求)か、ストアのサブスクリプションキャンセルを忘れている。
  • AASAがapex→wwwリダイレクト、text/html、またはボットチャレンジの背後で配信されている。
  • robots.txtでDisallow: /i/とnoindexヘッダーを同時に使用し、クローラーがnoindexを認識できない。
  • 価格が言語ごとにハードコードされている(スイスの訪問者に対してドイツ語ページでユーロ表示)、またはストアの価格変更後に古い数字が残っている。
  • 新しいアプリにaggregateRatingをでっち上げる、またはoffersの価格が1か国だけにしか当てはまらない。
  • OG画像のURLが相対パス、またはHTTPであり、HTTPSでない。

関連スキル

  • identity-and-signing — このサイトで使用されるバンドルID、パッケージ名、チームID、SHA-256フィンガープリント。
  • privacy-and-declarations — プライバシーポリシーの本文を生成し、データ削除に関する質問に答えます。
  • subscriptions-and-payments — 価格プレースホルダーに入力するストア価格を読み戻します。
  • listing-and-aso — このサイトとストア登録ページに表示されるストアテキストを生成します。

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

erberkk/privacy-and-declarations

Use when filling in or auditing App Store privacy and compliance answers and Google Play App content declarations - Apple App Privacy labels, Play Data safety (CSV import), Health apps declaration and Health Connect permissions, advertising ID, PrivacyInfo.xcprivacy and required-reason APIs, export compliance (ITSAppUsesNonExemptEncryption), age rating, account deletion (in-app, web URL, re-authentication), consent and disclosure for AI features, and rules for health data. Derives every answer from a code and SDK scan so the forms, the privacy policy and the in-app text say the same thing.

erberkk/review-readiness

Use before submitting an app version or a first subscription for App Store or Google Play review, or after receiving a rejection. Runs a go/no-go checklist and writes a report - demo account that signs in with a password (no email one-time code), filled with data and premium unlocked; review notes; in-app purchases visible and purchasable (guideline 2.1(b)); iPad compatibility mode for iPhone-only apps; no placeholders or "coming soon"; metadata matching the app; live privacy URLs; crash-free cold start - and gives a playbook for replying in Resolution Center and deciding when to appeal.

erberkk/social-publishing

Use when setting up scheduled publishing of an app's marketing content to Instagram (Reels, carousels, Stories), Threads, X and TikTok through official APIs - self-hosting Postiz in Docker behind a Cloudflare Tunnel, creating the Meta app with the newer use-case flow (business portfolio, Facebook Page linked to the Instagram professional account, Threads tester invite), X developer pay-per-use credits and spend cap, TikTok and YouTube audit limits, safe OAuth account selection when one browser holds personal and brand accounts, resource limits, and phasing a posting calendar around real launch events.

erberkk/store-screenshots

Use when producing or updating App Store and Google Play screenshots and the Play feature graphic - planning a connected "panorama" story across frames, capturing real in-app screens with the app's own test/screenshot harness at each device's logical size and pixel ratio, covering the full device matrix (iPhone 6.9", the required medium Dynamic Island slot, iPhone Duo outer and inner displays, iPad 13" if the app runs on iPad, Play phone, 7" and 10" tablets, 1024x500 feature graphic), checking for alpha channels and wrong sizes, and uploading in order via the App Store Connect and Google Play APIs.

関連スキル