Add Google AdSense to your Next.js app.
This package is deeply inspired by nextjs-google-adsense.
Why I don't use nextjs-google-adsense directly? Because it only support Auto Ads and Responsive Display Ad. I want to use In-article Ads. So I decided to create a new package. (read πΎ Why next-google-adsense? for more details)
Give me a β if you like it.
- Support SSR (Server-Side Rendering), SSG (Static Site Generation) and CSR (Client-Side Rendering)
- Support TypeScript
- Zero Dependencies
- Theoretically support all AdSense AD types (see π¨ Create a custom layout for more details)
- Create
ads.txt
automatically (see Initialization / Verification for more details)
- πΎ Why next-google-adsense?
- π¦ Requirements
- π Getting Started
- π API Reference
- π¨ Create a custom layout
- π Known Issues
- β TODO
- π€ Contributing
- π License
- β Donation
next-google-adsense (this) | nextjs-google-adsense | |
---|---|---|
TypeScript | β | β |
Support Auto Ads | β | β |
Support Display Ad | β | β |
Support In-feed Ad | β | β |
Support In-article Ad | β | β |
Support Matched Content Ad | β | β |
Dynamic ads.txt |
β | β |
Multiple ADs on one page | β |
*1: According to the their documentation seems it is ok to use multiple ADs on one page. But I found that it will cause an error.
- Next.js 11.0.0 or higher.
- React 17.0.0 or higher.
npm install next-google-adsense
Visit the npm page.
There are two ways to verify your site (of course you can implement both):
-
AdSense code snippet
// pages/_app.tsx // import the module import { GoogleAdSense } from "next-google-adsense"; const App = ({ Component, pageProps }) => { return ( <> <GoogleAdSense publisherId="pub-XXXXXXXXXXXXXXXX" /> {/* π 16 digits */} {/* or */} <GoogleAdSense /> {/* if NEXT_PUBLIC_ADSENSE_PUBLISHER_ID is set */} <Component {...pageProps} /> </> ); }; export default App;
You can also add the
publisherId
as environment variable asNEXT_PUBLIC_ADSENSE_PUBLISHER_ID
. The environment variable will override the prop if both are set. -
Ads.txt snippet
// package.json // ... "scripts": { "build": "next build && create-ads-txt", // π if you want to create ads.txt automatically, recommended "create-ads-txt": "create-ads-txt" // π if you want to create ads.txt manually }, // ...
β οΈ Your oldads.txt
will be overwritten during the generation process.You must set
NEXT_PUBLIC_ADSENSE_PUBLISHER_ID
as environment variable. The environment variable will be used to generate theads.txt
.
If you decide to use Auto Ads, you are good to go. The ads will be automatically displayed on your page. (Setup Auto Ads)
import { AdUnit } from "next-google-adsense";
const Page = () => {
return (
<>
<AdUnit
publisherId="pub-XXXXXXXXXXXXXXXX" {/* π 16 digits */}
slotId="XXXXXXXXXX" {/* π 10 digits */}
layout="display" {/* See the API Reference for more options */}
/>
{/* or */}
<AdUnit {/* if NEXT_PUBLIC_ADSENSE_PUBLISHER_ID is set */}
slotId="XXXXXXXXXX"
layout="display"
/>
<YourContent />
</>
);
};
export default Page;
<GoogleAdSense publisherId={string}>
Parameter | Optional | Type | Default | Description |
---|---|---|---|---|
publisherId | Yes | string | n/a | You can skip this parameter if you set the environment variable NEXT_PUBLIC_ADSENSE_PUBLISHER_ID . |
<AdUnit publisherId={string} slotId={string} layout={"display" | "in-article" | "custom"} customLayout={JSX.Element}>
Parameter | Optional | Type | Default | Description |
---|---|---|---|---|
publisherId | Yes | string | n/a | You can skip this parameter if you set the environment variable NEXT_PUBLIC_ADSENSE_PUBLISHER_ID . |
slotId | No | string | n/a | Google AdSense Slot ID. |
layout | Yes | "display" | "in-article" | "custom" | "display" | The layout of the AD. |
customLayout | Yes | JSX.Element | n/a | The custom layout of the AD. This parameter is required if layout is set to "custom". |
No layout fits your needs? Let's create a custom layout.
Sample custom layout:
export const InFeedAd = () => {
return (
<ins
className="adsbygoogle"
style={{ display: "block" }}
data-ad-format="fluid"
data-ad-layout-key="<AD_LAYOUT_KEY>"
data-ad-client="ca-pub-XXXXXXXXXXXXXXXX"
data-ad-slot="XXXXXXXXXX"
/>
);
};
Example (provided by Google AdSense):
<script
async
src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-XXXXXXXXXXXXXXXX"
crossorigin="anonymous"
></script>
<ins
class="adsbygoogle"
style="display:block"
data-ad-format="fluid"
data-ad-layout-key="<AD_LAYOUT_KEY>"
data-ad-client="ca-pub-XXXXXXXXXXXXXXXX"
data-ad-slot="XXXXXXXXXX"
></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
-
Remove all the
<script>
tags. -
You will get the following html:
<ins class="adsbygoogle" style="display:block" data-ad-format="fluid" data-ad-layout-key="<AD_LAYOUT_KEY>" data-ad-client="ca-pub-XXXXXXXXXXXXXXXX" data-ad-slot="XXXXXXXXXX" > </ins>
-
Convert the html to JSX:
export const InFeedAd = () => { return ( <ins className="adsbygoogle" style={{ display: "block" }} data-ad-format="fluid" data-ad-layout-key="<AD_LAYOUT_KEY>" data-ad-client="ca-pub-XXXXXXXXXXXXXXXX" data-ad-slot="XXXXXXXXXX" /> ); };
-
Done! You can now use the custom layout in your app.
<AdUnit publisherId="<your-publisher-id>" slotId="<your-slot-id>" layout="custom" customLayout={InFeedAd}>
Full Code:
import { AdUnit } from "next-google-adsense";
export const InFeedAd = () => {
return (
<ins
className="adsbygoogle"
style={{ display: "block" }}
data-ad-format="fluid"
data-ad-layout-key="<AD_LAYOUT_KEY>"
data-ad-client="ca-pub-XXXXXXXXXXXXXXXX"
data-ad-slot="XXXXXXXXXX"
/>
);
};
const Page = () => {
return (
<>
<AdUnit
publisherId="pub-XXXXXXXXXXXXXXXX" {/* π 16 digits */}
slotId="XXXXXXXXXX" {/* π 10 digits */}
layout="custom"
customLayout={InFeedAd}
/>
<YourContent />
</>
);
};
- Waiting for your report.
- Add custom layout validation.
Contributions are welcome! If you find a bug or have a feature request, please open an issue. If you want to contribute code, please fork the repository and submit a pull request.
Before you open a pull request, please make sure that you run npm run dev:test
to make sure the code run as expected.
This project is licensed under the MIT License - see the LICENSE file for details
Love it? Consider a donation to support my work.