{"componentChunkName":"component---src-templates-blog-post-js","path":"/blog/how-to-import-mailchimp-campaigns-as-a-gatsby-source/","webpackCompilationHash":"c6b5b6157647393bc037","result":{"data":{"site":{"siteMetadata":{"title":"Deployment previews for UI/UX teams · FeaturePeek","siteUrl":"https://featurepeek.com"}},"markdownRemark":{"id":"d0ab119a-f5b0-5eb5-b1ca-41ce20c70ada","excerpt":"Publishing your marketing newsletters on your website is a great way to increase the amount of content available on your domain automatically. We do this here…","html":"<p>Publishing your marketing newsletters on your website is a great way to increase the amount of content available on your domain automatically. We do this here at <a href=\"https://featurepeek.com\">FeaturePeek</a> – we publish our Product Update newsletter publicly so that each campaign can be forever preserved in the archives (<a href=\"https://featurepeek.com/product-updates/0f4fe58662\">here’s an example</a>). We’ll show you how to do the same in this article.</p>\n<p>The content is already written – <em>don’t let it only be accessible via email inbox!</em> The good news is that this is fairly trivial to set up if you’re building a static site with <a href=\"http://gatsbyjs.org\">Gatsby</a>.</p>\n<p>Immediate benefits:</p>\n<ul>\n<li><strong>Improve SEO</strong>: Importing from Mailchimp as a source means that the content lives on your domain (we’re not talking about just embedding an iframe) so you can get all the SEO juice for the keywords you use in your email marketing.</li>\n<li><strong>Reduce newsletter churn</strong>: Give your readers an opportunity to preview the content of the newsletter they’re signing up for by having the content available to read on your website. Your subscribers will be less likely to unsubscribe when they can see samples of what you’ve sent out in the past.</li>\n</ul>\n<blockquote>\n<p><strong>Code sample:</strong> Our entire marketing site is open source, so you can see this code in action by <a href=\"http://github.com/featurepeek/marketing-website\">visiting our repo</a>.</p>\n</blockquote>\n<h2 id=\"install-dependencies\" style=\"position:relative;\"><a href=\"#install-dependencies\" aria-label=\"install dependencies permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Install dependencies</h2>\n<p>We’ll be adding the <a href=\"https://www.gatsbyjs.org/packages/gatsby-source-mailchimp\">gatsby-source-mailchimp</a> build-time dependency to do most of the heavy lifting for us here.</p>\n<p>Since we only want a subset of each campaign’s HTML source (we don’t need the <code class=\"language-text\">&lt;head&gt;</code> tags from Mailchimp, for example), we’ll also need a DOM parsing library. We’ll be using <a href=\"https://www.npmjs.com/package/cheerio\">cheerio</a> in this article, but you can swap it out for another if you’d like, as long as it’s compatible with Node.js (the native <a href=\"https://caniuse.com/#feat=xml-serializer\">DOMParser</a> would be ideal, but it’s only available to browsers).</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">yarn</span> <span class=\"token function\">add</span> gatsby-source-mailchimp cheerio</code></pre></div>\n<h2 id=\"create-a-mailchimp-api-key\" style=\"position:relative;\"><a href=\"#create-a-mailchimp-api-key\" aria-label=\"create a mailchimp api key permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Create a Mailchimp API key</h2>\n<p>After logging in to <a href=\"https://login.mailchimp.com/\">Mailchimp</a>, click your avatar in the top right and then click Account in the resulting dropdown menu. From there, click on Extras > API keys.</p>\n<p>Click the “Create A Key” button to generate a new API key.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 590px;\"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 26.709573612228482%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAyklEQVQY051PywrCMBDs//+QCF48KPgRgnhoa5ukMdk8bNqOm5SCenRhyGaYnZ2tnnqA7DtGj2maVqT03c8zlmVBru39rExtfNUNGrWUqIWAJYL3Ds45BO9L77mnGIspfsyW1enrXwkl8eCElIcZelBsSIgxIKc3RrPpuoisgRCsJcsaW3SCZxXr7m2D1yuiSnxSYHEMoWwIwfMAYRzHwlljikHMKacEpVSB1hqBucScJIfj9baefDmfcNjv0DY1BiXQd21J8k/lQG+8uYQbFqK4tQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"New API key\"\n        title=\"New API key\"\n        src=\"/static/c4417d76abe55cec57df9da95c31183b/e1e83/new-api-key.png\"\n        srcset=\"/static/c4417d76abe55cec57df9da95c31183b/00a32/new-api-key.png 148w,\n/static/c4417d76abe55cec57df9da95c31183b/abe81/new-api-key.png 295w,\n/static/c4417d76abe55cec57df9da95c31183b/e1e83/new-api-key.png 590w,\n/static/c4417d76abe55cec57df9da95c31183b/702f0/new-api-key.png 885w,\n/static/c4417d76abe55cec57df9da95c31183b/48347/new-api-key.png 1180w,\n/static/c4417d76abe55cec57df9da95c31183b/09920/new-api-key.png 2486w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>You should rename the Label while you’re at it so that you and your teammates know what the key is correlated with – we named ours <code class=\"language-text\">gatsby-source-mailchimp</code>.</p>\n<h2 id=\"save-the-mailchimp-api-key-as-an-environment-variable\" style=\"position:relative;\"><a href=\"#save-the-mailchimp-api-key-as-an-environment-variable\" aria-label=\"save the mailchimp api key as an environment variable permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Save the Mailchimp API key as an environment variable</h2>\n<p>We’ll want to save the API key as an environment variable so that we don’t check the value into version control. Anyone can read or write data to/from your Mailchimp account with this API key, so you want to make sure that you’re careful with it.</p>\n<p>You probably have a <code class=\"language-text\">.env.development</code> and/or <code class=\"language-text\">.env.production</code> files in your project root if you initially followed <a href=\"https://www.gatsbyjs.org/docs/environment-variables/#defining-environment-variables\">Gatsby’s docs</a> – these gitignore’d files contain your project’s environment variables. Save a new line in them with the following:</p>\n<div class=\"gatsby-highlight\" data-language=\"raw\"><pre class=\"language-raw\"><code class=\"language-raw\">MAILCHIMP_API_KEY=&lt;YOUR_KEY_GOES_HERE&gt;</code></pre></div>\n<p>Don’t forget to add this value to your servers and continuous integration platforms, as your build won’t build correctly without it.</p>\n<h2 id=\"configure-the-gatsby-plugin\" style=\"position:relative;\"><a href=\"#configure-the-gatsby-plugin\" aria-label=\"configure the gatsby plugin permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Configure the Gatsby plugin</h2>\n<p>Tell Gatsby that you’d like to use the <code class=\"language-text\">gatsby-source-mailchimp</code> plugin in your <code class=\"language-text\">gatsby-config.js</code> file. This will read from the <code class=\"language-text\">MAILCHIMP_API_KEY</code> environment variable that you defined earlier.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// gatsby-config.js</span>\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  plugins<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token comment\">// ...</span>\n    <span class=\"token punctuation\">{</span>\n      resolve<span class=\"token operator\">:</span> <span class=\"token string\">\"gatsby-source-mailchimp\"</span><span class=\"token punctuation\">,</span>\n      options<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        key<span class=\"token operator\">:</span> process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">MAILCHIMP_API_KEY</span><span class=\"token punctuation\">,</span>\n        <span class=\"token comment\">// replace `us20` with the value in your Mailchimp dashboard URL</span>\n        rootURL<span class=\"token operator\">:</span> <span class=\"token string\">\"https://us20.api.mailchimp.com/3.0\"</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token comment\">// ...</span>\n  <span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"create-the-campaignpost-template-component\" style=\"position:relative;\"><a href=\"#create-the-campaignpost-template-component\" aria-label=\"create the campaignpost template component permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Create the CampaignPost template component</h2>\n<p>This component will be what renders when someone loads an individual campaign post page. You might recognize the format of this component if you followed any of the Gatsby blog starters – it’s very <a href=\"https://github.com/DSchau/gatsby-blog-starter-kit/blob/master/src/templates/blog-post.js\">similar to the BlogPost template component</a>. </p>\n<p>We’ll be checking that <code class=\"language-text\">status === &#39;sent&#39;</code> and <code class=\"language-text\">post.send_time !== &#39;Invalid date&#39;</code> in order to prevent accidentally publishing draft campaigns that haven’t been sent out yet.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// src/templates/CampaignPost.js</span>\n<span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">\"react\"</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> graphql<span class=\"token punctuation\">,</span> Link <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"gatsby\"</span>\n<span class=\"token keyword\">import</span> cheerio <span class=\"token keyword\">from</span> <span class=\"token string\">\"cheerio\"</span>\n\n<span class=\"token keyword\">import</span> Layout <span class=\"token keyword\">from</span> <span class=\"token string\">\"components/Layout\"</span>\n<span class=\"token keyword\">import</span> <span class=\"token constant\">SEO</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"components/Seo\"</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">CampaignPost</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> post <span class=\"token operator\">=</span> props<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">.</span>mailchimpCampaign\n  <span class=\"token keyword\">const</span> siteTitle <span class=\"token operator\">=</span> props<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">.</span>site<span class=\"token punctuation\">.</span>siteMetadata<span class=\"token punctuation\">.</span>title\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> previous<span class=\"token punctuation\">,</span> next <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> props<span class=\"token punctuation\">.</span>pageContext\n\n  <span class=\"token comment\">// we don't want the full post.html -- just what is in the body container</span>\n  \n  <span class=\"token keyword\">const</span> $ <span class=\"token operator\">=</span> cheerio<span class=\"token punctuation\">.</span><span class=\"token function\">load</span><span class=\"token punctuation\">(</span>post<span class=\"token punctuation\">.</span>html<span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">const</span> bodyTable <span class=\"token operator\">=</span> <span class=\"token function\">$</span><span class=\"token punctuation\">(</span><span class=\"token string\">'.bodyContainer'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">html</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Layout</span></span> <span class=\"token attr-name\">title</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>siteTitle<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">SEO</span></span>\n        <span class=\"token attr-name\">title</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>post<span class=\"token punctuation\">.</span>settings<span class=\"token punctuation\">.</span>title<span class=\"token punctuation\">}</span></span>\n        <span class=\"token attr-name\">description</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>post<span class=\"token punctuation\">.</span>settings<span class=\"token punctuation\">.</span>preview_text<span class=\"token punctuation\">}</span></span>\n      <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">style</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span> margin<span class=\"token operator\">:</span> <span class=\"token string\">'auto'</span><span class=\"token punctuation\">,</span> maxWidth<span class=\"token operator\">:</span> <span class=\"token number\">600</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Link</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>/product-updates<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">← All product updates</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Link</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>h1</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span>post<span class=\"token punctuation\">.</span>settings<span class=\"token punctuation\">.</span>title<span class=\"token punctuation\">}</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>h1</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token punctuation\">{</span>post<span class=\"token punctuation\">.</span>send_time <span class=\"token operator\">!==</span> <span class=\"token string\">'Invalid date'</span> <span class=\"token operator\">&amp;&amp;</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span>post<span class=\"token punctuation\">.</span>send_time<span class=\"token punctuation\">}</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>campaign<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">dangerouslySetInnerHTML</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span> __html<span class=\"token operator\">:</span> bodyTable <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>ul</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token punctuation\">{</span>previous <span class=\"token operator\">&amp;&amp;</span> previous<span class=\"token punctuation\">.</span>status <span class=\"token operator\">===</span> <span class=\"token string\">'sent'</span> <span class=\"token operator\">&amp;&amp;</span> previous<span class=\"token punctuation\">.</span>settings<span class=\"token punctuation\">.</span>title <span class=\"token operator\">&amp;&amp;</span> <span class=\"token punctuation\">(</span>\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Link</span></span> <span class=\"token attr-name\">href</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">/product-updates/</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>previous<span class=\"token punctuation\">.</span>campaignId<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>prev<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n              ← </span><span class=\"token punctuation\">{</span>previous<span class=\"token punctuation\">.</span>settings<span class=\"token punctuation\">.</span>title<span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n            </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Link</span></span><span class=\"token punctuation\">></span></span>\n          <span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token punctuation\">{</span>next <span class=\"token operator\">&amp;&amp;</span> next<span class=\"token punctuation\">.</span>status <span class=\"token operator\">===</span> <span class=\"token string\">'sent'</span> <span class=\"token operator\">&amp;&amp;</span> next<span class=\"token punctuation\">.</span>settings<span class=\"token punctuation\">.</span>title <span class=\"token operator\">&amp;&amp;</span> <span class=\"token punctuation\">(</span>\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Link</span></span> <span class=\"token attr-name\">href</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">/product-updates/</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>next<span class=\"token punctuation\">.</span>campaignId<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>next<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n              </span><span class=\"token punctuation\">{</span>next<span class=\"token punctuation\">.</span>settings<span class=\"token punctuation\">.</span>title<span class=\"token punctuation\">}</span><span class=\"token plain-text\"> →\n            </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Link</span></span><span class=\"token punctuation\">></span></span>\n          <span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>ul</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Layout</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> pageQuery <span class=\"token operator\">=</span> graphql<span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\n  query CampaignPostById($slug: String!) {\n    site {\n      siteMetadata {\n        title\n        author\n      }\n    }\n    mailchimpCampaign(campaignId: { eq: $slug }) {\n      html\n      settings {\n        preview_text\n        subject_line\n        title\n      }\n      campaignId\n      send_time(formatString: \"MMMM DD, YYYY\")\n      status\n    }\n  }\n</span><span class=\"token template-punctuation string\">`</span></span></code></pre></div>\n<h2 id=\"create-productupdates-page-component\" style=\"position:relative;\"><a href=\"#create-productupdates-page-component\" aria-label=\"create productupdates page component permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Create ProductUpdates page component</h2>\n<p>This page serves as the collection page for all of your campaigns. In this example, it’ll be served from the <code class=\"language-text\">/product-updates</code> route.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// src/pages/product-updates.js</span>\n<span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">\"react\"</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> graphql<span class=\"token punctuation\">,</span> Link <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"gatsby\"</span>\n\n<span class=\"token keyword\">import</span> Layout <span class=\"token keyword\">from</span> <span class=\"token string\">\"components/Layout\"</span>\n<span class=\"token keyword\">import</span> <span class=\"token constant\">SEO</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"components/Seo\"</span>\n<span class=\"token keyword\">import</span> JoinMailingList <span class=\"token keyword\">from</span> <span class=\"token string\">\"components/JoinMailingList\"</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">reverseChronologically</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">a<span class=\"token punctuation\">,</span> b</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> \n  <span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">.</span>node<span class=\"token punctuation\">.</span>send_time<span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span>b<span class=\"token punctuation\">.</span>node<span class=\"token punctuation\">.</span>send_time<span class=\"token punctuation\">)</span> <span class=\"token operator\">?</span> <span class=\"token number\">1</span> <span class=\"token operator\">:</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">ProductUpdates</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> data <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> props\n  <span class=\"token keyword\">const</span> siteTitle <span class=\"token operator\">=</span> data<span class=\"token punctuation\">.</span>site<span class=\"token punctuation\">.</span>siteMetadata<span class=\"token punctuation\">.</span>title\n  <span class=\"token keyword\">const</span> campaigns <span class=\"token operator\">=</span> data<span class=\"token punctuation\">.</span>allMailchimpCampaign<span class=\"token punctuation\">.</span>edges\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Layout</span></span> <span class=\"token attr-name\">title</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>siteTitle<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">SEO</span></span> <span class=\"token attr-name\">title</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>All product updates<span class=\"token punctuation\">\"</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>h1</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">FeaturePeek product updates</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>h1</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">JoinMailingList</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>h2</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Archive</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>h2</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token punctuation\">{</span>campaigns\n        <span class=\"token punctuation\">.</span><span class=\"token function\">sort</span><span class=\"token punctuation\">(</span>reverseChronologically<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> node <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n          <span class=\"token keyword\">const</span> title <span class=\"token operator\">=</span> node<span class=\"token punctuation\">.</span>settings<span class=\"token punctuation\">.</span>title\n          <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">key</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>node<span class=\"token punctuation\">.</span>campaignId<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n              </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>small</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span>node<span class=\"token punctuation\">.</span>send_time<span class=\"token punctuation\">}</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>small</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n              </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>h3</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n                </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Link</span></span> <span class=\"token attr-name\">href</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">/product-updates/</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>node<span class=\"token punctuation\">.</span>campaignId<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span>title<span class=\"token punctuation\">}</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Link</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n              </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>h3</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n              </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span>node<span class=\"token punctuation\">.</span>settings<span class=\"token punctuation\">.</span>preview_text<span class=\"token punctuation\">}</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n            </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n          <span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Layout</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> pageQuery <span class=\"token operator\">=</span> graphql<span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\n  query {\n    site {\n      siteMetadata {\n        title\n      }\n    }\n    allMailchimpCampaign(\n      filter: { \n        status: { eq: \"sent\" }, \n        settings: { \n          title: { ne: \"\" } \n        } \n      }\n    ) {\n      edges {\n        node {\n          settings {\n            preview_text\n            subject_line\n            title\n          }\n          campaignId\n          send_time(formatString: \"MMMM DD, YYYY\")\n          status\n        }\n      }\n    }\n  }\n</span><span class=\"token template-punctuation string\">`</span></span></code></pre></div>\n<h2 id=\"extend-createpages\" style=\"position:relative;\"><a href=\"#extend-createpages\" aria-label=\"extend createpages permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Extend createPages</h2>\n<p>Finally, we need to create the graphQL query to pull the data from the Mailchimp source.</p>\n<p>If your Gatsby project already contains a blog, your <code class=\"language-text\">createPages</code> method in <code class=\"language-text\">gatsby-node.js</code> is probably already in use. You’ll need to combine what you already have with what is written in detail below in order to iterate over both your blog posts and Mailchimp campaigns. </p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// gatsby-node.js</span>\nexports<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">createPages</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> graphql<span class=\"token punctuation\">,</span> actions <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> createPage <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> actions\n  <span class=\"token keyword\">const</span> CampaignPost <span class=\"token operator\">=</span> path<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">./src/templates/CampaignPost.js</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token function\">graphql</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\n    {\n      allMailchimpCampaign {\n        edges {\n          next {\n            campaignId\n            settings {\n              preview_text\n              subject_line\n              title\n            }\n            status\n          }\n          previous {\n            campaignId\n            settings {\n              preview_text\n              subject_line\n              title\n            }\n            status\n          }\n          node {\n            html\n            settings {\n              preview_text\n              subject_line\n              title\n            }\n            campaignId\n            send_time\n            status\n          }\n        }\n      }\n    }\n  </span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">result</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">.</span>errors<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">throw</span> result<span class=\"token punctuation\">.</span>errors\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// Create product update pages</span>\n    <span class=\"token keyword\">const</span> campaigns <span class=\"token operator\">=</span> result<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">.</span>allMailchimpCampaign<span class=\"token punctuation\">.</span>edges\n\n    campaigns<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">campaign<span class=\"token punctuation\">,</span> index</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">const</span> previous <span class=\"token operator\">=</span>\n        index <span class=\"token operator\">===</span> campaigns<span class=\"token punctuation\">.</span>length <span class=\"token operator\">-</span> <span class=\"token number\">1</span> <span class=\"token operator\">?</span> <span class=\"token keyword\">null</span> <span class=\"token operator\">:</span> campaigns<span class=\"token punctuation\">[</span>index <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>node\n      <span class=\"token keyword\">const</span> next <span class=\"token operator\">=</span> index <span class=\"token operator\">===</span> <span class=\"token number\">0</span> <span class=\"token operator\">?</span> <span class=\"token keyword\">null</span> <span class=\"token operator\">:</span> campaigns<span class=\"token punctuation\">[</span>index <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>node\n\n      <span class=\"token function\">createPage</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n        path<span class=\"token operator\">:</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">/product-updates/</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>campaign<span class=\"token punctuation\">.</span>node<span class=\"token punctuation\">.</span>campaignId<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span>\n        component<span class=\"token operator\">:</span> CampaignPost<span class=\"token punctuation\">,</span>\n        context<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n          slug<span class=\"token operator\">:</span> campaign<span class=\"token punctuation\">.</span>node<span class=\"token punctuation\">.</span>campaignId<span class=\"token punctuation\">,</span>\n          postPath<span class=\"token operator\">:</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">/product-updates/</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>campaign<span class=\"token punctuation\">.</span>node<span class=\"token punctuation\">.</span>campaignId<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span>\n          previous<span class=\"token punctuation\">,</span>\n          next<span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">}</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">null</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"rejoice-in-the-glory-of-automation\" style=\"position:relative;\"><a href=\"#rejoice-in-the-glory-of-automation\" aria-label=\"rejoice in the glory of automation permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Rejoice in the glory of automation</h2>\n<p>That’s all there is to it! Now the next time you rebuild your site, your campaigns will be pulled from Mailchimp and built as static HTML pages. You can <a href=\"https://featurepeek.com/product-updates\">check out how ours look here</a>.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 590px;\"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 58.20000000000001%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAABVElEQVQoz41Ta4+CMBDk//+u+6CRmGiCJhijUXkKKCqKR3Fup7Gk5yO6yWTbhR12psW53W5gMGdVhag6Izyfcahr/F6vqAVXZtkbKKW6HjszHLNpmgZjz8NPrwd3NII3nWIwGGAymWA2m6Hf72Mk9eFwiKIoOiKb7B8ho5IJy/0e1ekEJR9oZJK2bXWTuq+ZCZvMXjuvxraDzZyeeAx+wMRbws1mo6XN53NM77J934cndhCu62rZJ1HxykfHHpdTZFmGOI6R5zmSJNFgjSjLUtfp4SvZT4T0cLlcIk1TTWAySbfb7ZPkj4S8HoaEBATJWOM6iiLERBiilqv1kfByuehmSjKkNjmtyESynxdIjsf3Hsr2XmhxKOXlJO182+12Xe6kfitZqUamiLBYLLBarfSJE+v1WuejTMWDIej3V5ID8Ye+UZ45ZYNQngVBoH8/0/dI+AfiL56X4VF8rgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Result\"\n        title=\"Result\"\n        src=\"/static/d35760486b09bfa758376f09940afbc0/e1e83/result.png\"\n        srcset=\"/static/d35760486b09bfa758376f09940afbc0/00a32/result.png 148w,\n/static/d35760486b09bfa758376f09940afbc0/abe81/result.png 295w,\n/static/d35760486b09bfa758376f09940afbc0/e1e83/result.png 590w,\n/static/d35760486b09bfa758376f09940afbc0/702f0/result.png 885w,\n/static/d35760486b09bfa758376f09940afbc0/48347/result.png 1180w,\n/static/d35760486b09bfa758376f09940afbc0/660f4/result.png 2000w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>Remember, the source only gets queried at build time – so when you mail out a new newsletter, you’ll have to rebuild your Gatsby site to pick up the content and publish on your website.</p>\n<h2 id=\"thanks-for-following-along\" style=\"position:relative;\"><a href=\"#thanks-for-following-along\" aria-label=\"thanks for following along permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Thanks for following along!</h2>\n<p>One closing note: While I was writing this article, I verified that the code samples worked as expected by building the deployment preview of this blog post on <a href=\"https://featurepeek.com\">FeaturePeek</a>. It was super useful to confirm that the whole idea behind was behaving correctly on a server besides my local machine.</p>\n<p>We use FeaturePeek on featurepeek.com (meta) to iterate faster during development. Our blog (and entire marketing site for that matter) is open source on GitHub, so you can take a peek at the preview environments that deploy on <a href=\"https://github.com/featurepeek/marketing-website/pulls\">our open pull requests</a>. </p>","tableOfContents":"<ul>\n<li><a href=\"#install-dependencies\">Install dependencies</a></li>\n<li><a href=\"#create-a-mailchimp-api-key\">Create a Mailchimp API key</a></li>\n<li><a href=\"#save-the-mailchimp-api-key-as-an-environment-variable\">Save the Mailchimp API key as an environment variable</a></li>\n<li><a href=\"#configure-the-gatsby-plugin\">Configure the Gatsby plugin</a></li>\n<li><a href=\"#create-the-campaignpost-template-component\">Create the CampaignPost template component</a></li>\n<li><a href=\"#create-productupdates-page-component\">Create ProductUpdates page component</a></li>\n<li><a href=\"#extend-createpages\">Extend createPages</a></li>\n<li><a href=\"#rejoice-in-the-glory-of-automation\">Rejoice in the glory of automation</a></li>\n<li><a href=\"#thanks-for-following-along\">Thanks for following along!</a></li>\n</ul>","frontmatter":{"title":"How to import Mailchimp campaigns as a Gatsby source","date":"April 16, 2020","description":"Sync your Gatsby site with Mailchimp so that it fetches and renders your newsletter campaigns at build-time","author":"jasonbarry","hero":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAABxElEQVQoz2NIM56ZZgJGyAwwSjeZkag399wqp/+vRP7ek/3/QBoNMQAVpRrOSDGYkWo4M9lgegoIAbnT04xnpBjOzrWe/OG8xv8nEv/uy2DRDNSZZz+3IWZxnuOccs8lxa4LCxwWlLguyraalaAzrzOq5v9DKUxtUM1JetMrAxbP79xWG76kNWbdjNKdCxr3L2o5MDl/c7T6otWNCf9fC2N1M9TZ6aazCl3mZZjNzDCdlWUxO9NsVo713HyHeQk6c8+scMHlYahmIAL6E8QwmplqNCMVRE5P1p+ZazXl3VlNkIcfy/67L/33HgIBuQjNaCjddEaC7ry2iLr/D6X/PZR+fkry7xPp/69l/r+S+f9SBsR4JvP/Pg7NGWbTgR5eUZf4/5PIlrmijYW8l3aKbZ4rvGa60JZ5whtmC1/bK/7/qQwOm01ANp9Y4vb/o8jh1eJLJgje3i9+dK3o4dWipzaJHVwpems/Ls0mM1MMZ2VbTn1zWgvo4b+PZb7fkvr3VBrkYCB6ASaf4nA2yMM681pCG/4Cg/QhOGwegUg0hD3AgB6OUV+0si4JTyRBoyrdFEOz6fRYzQX7Z/j/fyP09y4ezTIAeOybNMVyhocAAAAASUVORK5CYII=","aspectRatio":1.4995640802092416,"src":"/static/2d1c5a0c00a10be0bdfaab2fbf1f7fa6/af144/hero.png","srcSet":"/static/2d1c5a0c00a10be0bdfaab2fbf1f7fa6/7c0ed/hero.png 200w,\n/static/2d1c5a0c00a10be0bdfaab2fbf1f7fa6/647de/hero.png 400w,\n/static/2d1c5a0c00a10be0bdfaab2fbf1f7fa6/af144/hero.png 800w,\n/static/2d1c5a0c00a10be0bdfaab2fbf1f7fa6/ba299/hero.png 1200w,\n/static/2d1c5a0c00a10be0bdfaab2fbf1f7fa6/9ecf6/hero.png 1600w,\n/static/2d1c5a0c00a10be0bdfaab2fbf1f7fa6/fbc9a/hero.png 1720w","sizes":"(max-width: 800px) 100vw, 800px"}}},"heroAttributionURL":null},"timeToRead":7}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/how-to-import-mailchimp-campaigns-as-a-gatsby-source/","postPath":"/blog/how-to-import-mailchimp-campaigns-as-a-gatsby-source/","previous":{"fields":{"slug":"/how-to-make-your-team-still-feel-like-a-team-while-being-remote/"},"frontmatter":{"title":"How to make your team still feel like a team while being remote"}},"next":{"fields":{"slug":"/featurepeek-raises-1-8m-in-seed-funding/"},"frontmatter":{"title":"FeaturePeek raises $1.8M in seed funding, announces FeaturePeek Indie"}}}}}