Repurposing content is a great way for creators to save time. And from different sides I have heard a similar requests over and over again over the last few weeks: "How can I use posts from my Ghost blog as newsletters in ConvertKit?"

Here's a quick guide on how to accomplish that. All without code – just one little helper:

The setup

For this demonstration, there are a few assumptions:

  • You have your Ghost blog set up
  • You have an existing ConvertKit account (free version is sufficient)
  • You have created an account at, a platform we are going to use to automate the entire process.

Additionally, I assume that your Ghost blog will have two different collections:

  • one for general blog posts
  • one for newsletter issues

In Ghost, the first tag entered is considered the most important – and is referred to as "primary tag". We are going to use this to differentiate between normal blog posts and newsletters. If you want every post pushed to ConvertKit, you can also do that – just keep on reading.

In ConvertKit we don't need to setup anything specific. 

For both systems, however, you will need access to the API keys. They are like passwords – and give another application (in our case access.

API keys & settings in Ghost

To retrieve your API key from Ghost, log in to your admin panel.

Within your admin panel, go to settings and click on "Integrations". You'll see a green button at the bottom of the page with the label "Add custom integration". That's what we want – so click on it.

Give this custom integration a name – for example "Push posts to ConvertKit".

Now you should see an overview of your new integration. On the top, you see the API keys. In our case, the "Admin API key" is important. We'll need that in a bit.

API keys and settings in ConvertKit

Now we'll need to retrieve something similar from ConvertKit.

Log in to ConvertKit and go to Settings. In the menu on the left, click on "Advanced".

In the middle of the page, you'll see a section labelled "API" with two fields – your API key and your API secret. The API secret should be hidden – which is good. Anybody with access to that has full control over your ConvertKit account. So make sure not to share that in public.

Since we'll need the API Secret for the connection with Ghost, click on the "Show" button, so you'll have it ready.

Making the connection happen

Now, let's make the connection happen.

Log in to your account. On the dashboard, there should be a big purple button on the top right: "Create a new scenario" – that's what we want to do, so click on it.

Now, on the new screen, you'll see an empty canvas. This is where we are going to build the connection between your Ghost blog and ConvertKit. I have prepared a blueprint for you, that you just need to import, since some of the ConvertKit features we are using for this are so new, that hasn't had a chance to put it into their visual builder.

Download this .json-file (right-click on the link – and select "Save link as..."). Then import it in your scenario, as shown below.

Once you have imported the blueprint, you should see the following:

Let me quickly explain what's happening here.

On the left, we have a Ghost blog. "watches" the posts in your blog – and when something happens (which we'll set up in a second), it triggers this automation.

In the middle of the screen, you see a small filter icon. Here, we make sure that only posts with the correct primary tag within Ghost are considered – everything else is discarded.

And on the right we have ConvertKit. This little ball makes sure that the posts we have filtered end up in ConvertKit – but it will not send anything to your subscribers. It will just create the draft of a broadcast. This way you can still make changes, select who you want to send it to, schedule it, etc – all within ConvertKit.

There are a few things we need to adapt in this blueprint:

Add your Ghost credentials

  1. Click on the Ghost integration
  2. We'll need to select a webhook – but we haven't connected the Ghost blog yet, so click the "Add" button
  3. Another window opens where you can select a connection – if you haven't used Ghost within before, this should be empty. Press the "Add" button here as well.
  4. Now you see a window with the title "Create a connection".
  5. You can give it any name you want.
  6. Now go back to your Ghost admin panel, where you have the settings for your custom integration.
  7. Copy the API URL into the field within
  8. Do the same with your Admin API key
  9. The Integration Id is a bit hidden. You can find that in the URL of your Ghost admin panel and should look like this (note the "INTEGRATION_ID" at the end of the example). Copy this into the field in Make.

Now hit "Save". A new field should be visible in the window now: "Event". Select "Post published" and click Save. will do some magic in the back – and you can click "OK" in the window that is left. Now, will react to any new post you publish within your Ghost blog.

Adapting the filter to your needs

The filter in the middle acts as a "safe guard" of sorts. As mentioned above, it makes sure that only specific posts – those that match a specific primary tag – are used in our automation.

In my blueprint, I have set this up to filter for posts with the primary tag "Newsletter". If you want to use the same tag, you can leave everything as it is.

If you want to adapt the name of the primary tag – or filter based on different information – just click on the filter.

You can adapt these settings to your needs. If you just want to filter based on a different primary tag, just change "Newsletter" to whatever your primary tag is called.

Add your ConvertKit credentials

Last, but not least, we need to add your ConvertKit credentials.

To do this, click on the ConvertKit integration on the right. All you need to do is enter your API secret from your ConvertKit dashboard.

Once you have added this, will expand the window and show you lots of settings – you can ignore that. It's all set up for you. However, if you want to dig through the individual settings there, you can find the documentation of ConvertKit's API here.

Final steps

Congratulations! You have now connected your Ghost blog and ConvertKit to – and instructed to push new posts with a certain primary tag to ConvertKit.

Click on the "Run once" button in the bottom left to test it. Now go to your Ghost blog and set up a new post with the correct primary tag.

Once the post is published, you should see some things moving in – and hopefully everything is green. If not, there is probably a connection error and you have entered the wrong credentials. Drop me a quick DM on Instagram or Twitter and I'll be happy to help out.

Now, let's have a look what happened in ConvertKit.

Head over to your dashboard and click on "Grow -> Broadcasts". You should see the blog post you have just published as a draft 🎉

To prepare for sending, click on "Edit Broadcast" and you can do anything you would do with a manually created broadcast as well: change the text, format it, select who you want to send it to, schedule it, etc.

Now, there is only one step left to do: set your automation live. To do so, go back to your canvas.

Make sure that the scheduling setting is set to "immediately as data arrives" – this makes sure that there is no delay between publishing and importing your post into ConvertKit.

Now you can flick the switch in the bottom left corner – and set everything live 🎉

Last thoughts from my side

This integration isn't perfect. If you are somebody who has used Ghost's native newsletter feature before, you'll immediately notice that there is no "feedback". You will not see any analytics and statistics within Ghost.

This automation is really meant for those of you who already use ConvertKit. If you are setting up a new Ghost blog and don't have an email provider yet, it might just be easier to use Ghost's native email functionality – albeit, with less features than ConvertKit has.

Additionally, I want to mention that this, unfortunately, does not work the other way around (e.g. create the newsletter within ConvertKit and have it published in Ghost) – well, it does, but not quite as easily.

As you have noticed, we are using webhooks to inform that there is a new blog post in Ghost. In order to turn this automation around, we'd need a similar webhook in ConvertKit. But that doesn't exist.

A potential workaround: we could call the ConvertKit API periodically (e.g. once every hour), store the result, and then do some business logic to compare these entries to what we have in Ghost.

But using these advanced features within comes at a price – and at that point, I'd argue that there are better solutions (though they'd need some coding).

I am potentially thinking of setting up a (pretty cheap) tool to do all of that for you – so if you are looking for something like this, please let me know at