Google gives one range for AdSense approval, and it is the only figure worth trusting: usually a few days, and in some cases 2 to 4 weeks. Anything more precise than that is somebody’s experience on somebody’s site. Google does not publish a finer breakdown, and we found nothing in its documentation that lets you shorten the wait.
The range also hides a structure. Google’s approval process has 2 stages: the account is approved first, which includes verifying payment information, and then the site is checked against the program policies. Google states one range for the whole process and does not split it between the stages, so a long wait can come from either one.
What Google states, and what it leaves out
Only 3 statements are on the record. The process usually takes a few days. In some cases it takes 2 to 4 weeks. And if the site is not ready, the help page for that situation tells you to fix the cause and request a new review.
What Google leaves out is longer. The pages we checked do not say which cases take 2 to 4 weeks, whether a young site waits longer, or whether the time of week matters. We would be inventing if we filled those gaps, so we leave them open. The practical consequence is that your planning unit should be weeks, not days: if you need the site to earn money before a fixed date, a review that starts on that date is already too late.
A timeline you can plan around
Google defines no calendar, so this table is ours: Google’s range laid over the actions that matter on each day.
| When | What is happening | What you do |
|---|---|---|
| Day 0, you submit | The 2 stages begin: payment information first, then the site against the program policies | Confirm the ad code is live on the published pages and the site is open to everyone. Save a copy of your sitemap so you know exactly which version was submitted |
| The first few days | This is the usual duration according to Google | Publish as you normally do. Check the account and the email linked to it each day. Leave the site structure alone |
| Up to week 4 | Google’s stated outer range, which Google says applies in some cases | Keep the site up, the code in place and the quality steady. Fix only what the account asks you to fix |
| Past week 4 | Outside the range Google states | Audit your side, then contact Google through its help channels. Details in the last section |
| Any day, a notice arrives | Approval, or a reason the site is not ready | Approved: finish the setup. Refused: diagnose with the rejection reasons guide, fix the cause, request a new review |
If the notice is a refusal, resist the urge to resubmit the same day. The 3-week plan for reapplying explains why we space it out, and why that spacing is our recommendation and not a rule from Google.
What to do while you wait
Keep the site the way a reviewer would want to find it. We recommend continuing to publish pages of the same quality at the same pace as before you applied, because the site under review should resemble the one you plan to run afterwards.
Use the time for work that does not change what is being reviewed. Prepare the ads.txt line for your account: Google specifies 4 fields, the file lives at the root of your domain, and a change can take from a few days to a month to be picked up, depending on traffic. Our ads.txt checker validates the file line by line once you have your publisher ID. If you have visitors in the EEA, the UK or Switzerland, plan your consent banner now: Google requires a certified consent management platform for personalized ads there, and without one the ads are not personalized.
Avoid the changes that make a review land on a half-built site. We would not redesign the theme, move to a new host or CMS, change the URL structure, delete pages in bulk or switch domains while the review is open. Google does not say when it fetches your pages, so any of those can be caught in the middle. And be wary of anyone who sells a faster approval: we found no mechanism in Google’s documentation that accelerates one.
A daily check you can automate
A pending review can be damaged by something you did not touch: a certificate that expires, a plugin update that adds a noindex, a deploy that overwrites robots.txt. This script checks the 5 points that would make a review land on a broken site: the homepage answers over https, the ad snippet is in the HTML, no noindex on the homepage, no group in robots.txt that disallows everything for Googlebot, the AdSense crawler or all crawlers, and a certificate with at least 14 days left. It needs Node 18 or later and no dependencies, prints one line per check and exits with 1 if any fails, so a scheduler can alert you on that exit code.
// check-site.mjs: run it daily while an AdSense review is pending (Node 18+, no dependencies).
// Usage: node check-site.mjs https://example.com
import tls from 'node:tls';
const base = new URL(process.argv[2] || 'https://example.com');
const rows = [];
const check = (name, ok, detail = '') => rows.push({ name, ok, detail });
// 1. Homepage: status, final URL, snippet, noindex
const home = await fetch(base, { redirect: 'follow' });
const html = await home.text();
check('homepage answers 200 over https', home.status === 200 && home.url.startsWith('https://'), `${home.status} ${home.url}`);
const id = html.match(/adsbygoogle\.js\?client=(ca-pub-\d{16})/);
check('AdSense snippet is in the HTML', Boolean(id), id ? id[1] : 'not found');
const metaNoindex = /<meta[^>]+name=["']robots["'][^>]*noindex/i.test(html);
const headerNoindex = /noindex/i.test(home.headers.get('x-robots-tag') || '');
check('homepage carries no noindex', !metaNoindex && !headerNoindex, metaNoindex ? 'meta tag' : headerNoindex ? 'X-Robots-Tag header' : '');
// 2. robots.txt: any group for *, Googlebot or Mediapartners-Google that disallows everything
const res = await fetch(new URL('/robots.txt', base));
const txt = res.ok ? await res.text() : '';
const groups = [];
let current = null;
for (const raw of txt.split(/\r?\n/)) {
const line = raw.replace(/#.*/, '').trim();
const m = line.match(/^([A-Za-z-]+)\s*:\s*(.*)$/);
if (!m) continue;
const field = m[1].toLowerCase();
if (field === 'user-agent') {
if (!current || current.rules.length) groups.push(current = { agents: [], rules: [] });
current.agents.push(m[2].toLowerCase());
} else if (current && (field === 'allow' || field === 'disallow')) {
current.rules.push([field, m[2]]);
}
}
const watched = ['*', 'googlebot', 'mediapartners-google'];
const blocking = groups.filter((g) => g.agents.some((a) => watched.includes(a)) && g.rules.some(([f, v]) => f === 'disallow' && v === '/'));
check('robots.txt does not disallow everything for the crawlers that matter', blocking.length === 0, blocking.map((g) => g.agents.join('+')).join('; '));
// 3. Certificate: days left
const days = await new Promise((resolve) => {
const socket = tls.connect({ host: base.hostname, port: 443, servername: base.hostname }, () => {
const cert = socket.getPeerCertificate();
socket.end();
resolve(Math.floor((new Date(cert.valid_to) - Date.now()) / 86400000));
});
socket.on('error', () => resolve(-1));
});
check('certificate has at least 14 days left', days >= 14, `${days} days`);
for (const r of rows) console.log(`${r.ok ? 'ok ' : 'FAIL'} ${r.name}${r.detail ? ' (' + r.detail + ')' : ''}`);
process.exitCode = rows.every((r) => r.ok) ? 0 : 1;
The 14-day margin and the choice of checks are ours. Run it once by hand today, then schedule it for as long as the review is open.
When 4 weeks have passed
The 4-week mark is the edge of the range Google states, so a review that has run past it deserves a look from your side before you contact anyone. Run the daily check above by hand and read every line. It confirms that the ad code is still in the page, that the site answers over https without a password prompt, that nothing has added a noindex, and that robots.txt has not changed under you.
Then open the policy center in your account and read every message in it, since that is where Google’s help page tells you to resolve violations. If all of that is clean, use the help channels Google provides in the AdSense help center to ask about the status of your review. We cannot tell you what they will answer, and Google does not publish a response time. In the meantime the requirements checklist is the right place to confirm that nothing on your side has drifted, and the AdSense eligibility checker will tell you in a few minutes whether the site still passes what a fetch can measure.
Quick answers
Does a second review take as long as the first?
Google gives the same range after you request a new review: usually a few days, and in some cases 2 to 4 weeks. It does not say that a second review is faster, so plan for the full range.
Does more traffic make the review faster?
Google does not link traffic to review time, and it publishes no minimum traffic for eligibility. We found nothing in its documentation suggesting that a higher visitor count speeds a review up.