1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Google AdSenseを断念して忍者AdMaxに乗り換えた話。審査を追うのをやめた個人開発サイトの選択

1
Posted at

ぱんだツールズ は、PDF・画像・CSV処理などをブラウザ完結で提供している無料Webツール集だ。

Google AdSenseに2回落ちた話は、以前2本の記事に書いた。

https://qiita.com/sakutto-panda/items/22d44783549150a31351
https://qiita.com/sakutto-panda/items/5ddc17acc4e11ed2311d

2回目の不合格を受けて「AdSenseを追わず、コンテンツを育てる」方針に転換し、ガイド記事セクション /guides/ を新設したところまでが前回の内容だ。あれから約5ヶ月、その後どうなったかを書く。

3回目以降も不合格が続いた

ガイド記事を継続的に追加し、サイト年齢を重ね、オーガニック流入も安定してきたところで再申請を重ねた。だが3回目以降も不合格が続いた。運用記録に残っているのは「不合格が続いたため断念」という事実だけだが、1・2回目と同じ「有用性の低いコンテンツ」を繰り返し引いていた可能性が高い。

ガイド記事は本記事執筆時点で110本を超えている。構造化データ・著者情報・更新日表示といった前回書いた施策もすべて実装済みだ。それでも通らなかった。

正直、ここまでやって通らないなら、AdSenseの審査基準とこのサイトの相性自体が良くないのだろうという判断に切り替えた。

審査を追うのをやめる

sakutto-ops.md の運用記録には、この判断がこうまとめられている。

2026-09-05 更新: AdSense は複数回の不合格を経て断念。月1.5万PVに達したため、審査不要の忍者AdMaxで収益化を開始(ツールページ・ガイドページ両方に配置)。

ポイントは2つ。

  1. AdSenseの審査を待ち続けるコストが見合わなくなった。何度再申請しても同じ理由で落ちるなら、その間ずっと広告収益がゼロのままになる
  2. 月間PVが1.5万に達し、審査不要な広告ネットワークでも十分な規模になった

EthicalAds や Carbon Ads のような開発者ツール向けの広告網も検討したが、こちらは月間5万PVが事実上の申請ライン。1.5万PVでは届かない。一方、忍者AdMaxは審査不要でタグを貼るだけで配信が始まる。「今すぐ収益化できる」ことを優先してAdMaxを選んだ。

実装:非同期タグの再スキャン方式に合わせて作る

忍者AdMaxのタグは「読み込み時に一度だけDOMを走査してその時点にある広告枠を埋める」方式になっている。Next.js の SPA 遷移や React のマウント/アンマウントとは前提が噛み合わないので、そこに合わせた薄いラッパーコンポーネントを作った。

// src/lib/admax.ts
export const ADMAX_ENABLED = process.env.NODE_ENV === 'production'

export const ADMAX_SLOTS = {
  rail: { hash: '...', width: 160, height: 600 },
  rectangle: { hash: '...', width: 300, height: 250 },
  reader: { hash: '...', width: 320, height: 100 },
} as const

配信可否は NODE_ENV だけで判定している。next dev はデフォルトで development になるので、開発環境やE2Eテストでは自動的にOFFになり、外部スクリプトを一切読み込まない。Cloudflare側の環境変数を別途用意する必要がないぶん設定ミスの余地が減る。

肝心の「SPA遷移のたびにタグを再スキャンさせる」部分は、スクリプトタグを都度貼り直すことで対応した。

// src/components/ui/AdMaxUnit.tsx
function scheduleAdmaxLoad() {
  if (typeof document === 'undefined' || loadScheduled) return
  loadScheduled = true
  window.setTimeout(() => {
    loadScheduled = false
    document.querySelectorAll('script[data-admax-loader]').forEach((el) => el.remove())
    const script = document.createElement('script')
    script.src = 'https://adm.shinobi.jp/st/t.js'
    script.async = true
    script.setAttribute('data-admax-loader', '')
    document.body.appendChild(script)
  }, 50)
}

同一tick内で複数の広告枠がマウントされてもロードが1回にまとまるよう、loadScheduled フラグで簡易的にdebounceしている。ページ遷移1回につきスクリプトタグを何本も貼り直すと無駄が多いので、この一手間を入れた。

広告枠側は usePathname を依存に入れて、遷移のたびに key を変えたdivを再マウントしている。

const pathname = usePathname()
// ...
<div key={`${hash}-${pathname}`} className="admax-ads" data-admax-id={hash} style={{ display: 'inline-block', width, height }} />

React が同じ位置に新しいDOM要素を生成し直すことで、t.js に「まだ埋めていない枠がある」と認識させている。

表示条件はメディアクエリ、枠のサイズは常に固定

もう一つ気をつけたのが、Cumulative Layout Shift(CLS)対策と viewability の両立だ。

function useMediaQuery(query: string): boolean {
  const subscribe = useCallback((onChange: () => void) => {
    const mql = window.matchMedia(query)
    mql.addEventListener('change', onChange)
    return () => mql.removeEventListener('change', onChange)
  }, [query])
  return useSyncExternalStore(subscribe, () => window.matchMedia(query).matches, () => false)
}

広告枠を囲む外側の div は常に width / height 固定でレンダリングし、CLSを防ぐ。一方で内側の実際の広告div(admax-ads)は、対象のメディアクエリにマッチしたときだけDOMに載せている。

{ADMAX_ENABLED ? (
  active && <div key={...} className="admax-ads" ... />
) : (
  <div className="...">AD</div>
)}

display: none で隠す実装だと、非表示の枠にもt.jsが広告を埋めてしまい、実際には見えていないのに「表示された」扱いになってviewabilityが落ちる。DOMに載せるかどうか自体をメディアクエリで切り替えることで、これを避けた。

配置:デスクトップは右レール、モバイルは記事内2枠

配置はデバイスごとに分けている。

  • デスクトップ(1280px以上): 本文右の余白に縦長160×600をstickyで配置
  • モバイル/タブレット(1280px未満): 記事内にFAQ手前300×250、FAQ後に320×100

ダウンロードボタンの直上・直横には置かない、という原則は前回AdSense向けに立てた社内ルールをそのままAdMaxにも引き継いでいる。誤クリックを誘発する配置は、審査の有無に関係なくユーザー体験を損なうからだ。

ads.txt の設置

public/ads.txt を追加し、adm.shinobi.jp を DIRECT で宣言している。広告枠のIDは公開情報としてタグにそのまま埋め込まれる値なので、src/lib/admax.ts のコメントにも明記した上でコードに直書きしている。

adm.shinobi.jp,231434,DIRECT

ads.txtは広告の売り手を偽装から守る仕組みで、実配信が始まる前提として必須のファイルだ。

振り返り:審査を「待つ」から「迂回する」への発想転換

AdSenseの1回目・2回目の記事では「どう対策すれば通るか」を考えていた。今回の判断は方向性が違って、「通すための対策」自体をやめて「審査がいらない選択肢に切り替える」という迂回策だ。

ガイド記事を45本以上書いてきた努力が無駄になったわけではない。オーガニック流入は着実に増えていて、AdMaxの収益もPVに比例して伸びる。ただ「AdSenseに通ること」をゴールに設定し続けるのは、個人開発の時間配分としてもう見合わないと判断した。

同じようにツールサイトでAdSenseを目指している人には、「審査に固執せず、規模に応じた別の選択肢に切り替える」判断肢も持っておくことをすすめたい。EthicalAds・Carbon Ads・i-mobileなど、PV規模や面の性質によって選べる広告ネットワークは他にもある。

ぱんだツールズ では PDF・画像・CSV・テキスト処理など80本超の無料ツールを公開中。全部ブラウザ完結・登録不要で使える。
https://sakutto-panda.com


この記事は Zenn にも同じ内容を投稿しています。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?