In a time when e-mail prospection has become the norm for any B2B business, personalization is the name of the game. Tools like LGM, Lemlist, or Woodpecker for example allow you to use custom variables to set company names, personalized catchphrases, or any other text of your e-mail.

But there is something that is rarely touched on and can make a huge difference in your e-mail prospection strategy: Personalized images. An image often speaks a lot more than words and this is also true for your e-mail outreach campaigns.

In our case, we are a SaaS company targeting growth marketing agencies. We’re offering a visual marketing automation tool so we want to showcase what our tool is capable of to our potential new users.

In this article, I’ll show in great detail a workflow we’re using here at Abyssale for our B2B e-mail outreach. We will cover how to :

  • Create a template using Abyssale
  • Scrape the necessary data with Phantom buster
  • Use Abyssale’s Personalized images feature to personalize our template for each contact
  • Input an image URL as a custom variable in Lemlist and use it in an e-mail template

As it is one of the most popular cold e-mailing tools out there, this article focuses on Lemlist to make use of the visuals created. However, this tutorial applies to any outreach tool that lets you use a URL to insert an image inside your content.

Are you ready? Let’s grab a coffee and get to it right away 😉

#1 Create a template using Abyssale’s powerful editor

Once you’ve created an account, simply go to your Dashboard and click on "Create New Template". Once inside the builder, you can choose a template from our template library to speed things up a bit.

For this tutorial, I won’t go into every feature of the editor but you can check the “Templates & Banners” section of our help center.

Here is what my template looks like and how it breaks down :

Abyssale cold email template
Abyssale cold email template
  • A background image showcasing what you can do with Abyssale
  • A Memoji to bring a bit of fun. Check out this article to know how to export a Memoji as png
  • A fixed text layer saying “Hello”
  • A dynamic text layer with our contact’s first name
  • A fixed paragraph layer with an empty line break to leave space for the company name
  • A dynamic text layer on top of it with the contact’s company name
  • A fixed call to action
  • A dynamic image layer to feature our contact’s company logo

Once you’ve created your template, make sure your layers are properly named, and just click on “save” to lock in your template.

#2 Scrape the necessary data with Phantom buster

First of all, let’s recap what data we need to collect to customize our template :

  • First Name
  • Company Name
  • Company logo

I’ll assume you already have your contact’s first name, Company Name, and e-mail address. To get the company logo’s image URL we’ll use Phantom buster. The process is simple: First, we have to get every company’s LinkedIn page URL, and then scrape that page to get the profile picture’s URL. To access that data, we’ll have to use 2 Phantoms :

2.1 Get our contact’s company LinkedIn page URL

Once your PhantomBuster account is created, if you are on the free plan you’ll have the ability to add one Phantom to your account at a time and run it for 10 minutes a day.

To scrape our contact’s company URL we’ll use the “Linkedin company URL finder” phantom available here.

Before setting it up, you’ll have to input your data inside a public Google sheet containing all the names of the companies you want to scrape. In the “Companies to find” tab, copy and paste the link of your public google sheets. In the “Settings tab” think of selecting notifications in case of error to receive an alert by e-mail if something went wrong at some point.

PhantomBuster • Linkedin company URL finder set-up
PhantomBuster • Linkedin company URL finder set-up
Small tip: If you have let’s say 300 contacts across 60 companies: sort your contacts by company from A to Z and keep the 300 lines in your CSV before importing it into PhantomBuster. This will save you a lot of time later. PhantomBuster will process the duplicates and output 300 lines as a result which means you won’t have to manually duplicate the data collected for each company on every contact of your list.

Once set up, simply launch your phantom and all the data collected will be available inside a . CSV file ready for Download. Here is what it will look like :

PhantomBuster • Company URL finder results
PhantomBuster • Company URL finder results

Have a quick look around to see if your data looks right and maybe manually search for the companies PhantomBuster has gotten wrong.

2.2 Get the company page profile picture URL

Great! We now have the LinkedIn page URL of every company we want to target! For the next step, we’ll just ask PhantomBuster to scrape every page and get the profile picture image URL. For this, we’re gonna use the Linkedin companies info Phantom.

The set-up process is the same except that you’re gonna have to give your LinkedIn session cookie for PhantomBuster to scrape Linkedin using your account. You can download PhantomBuster’s Google Chrome extension to get it in one click.

Next, use the URL of the CSV file we downloaded after completing the previous step and indicate in which column PhantomBuster can get the LinkedIn page URLs.

In the behavior tab, there are a few things you need to know :

  • If you don’t have a sales navigator account, limit yourself to 80 results to scrape per day, otherwise, you might get blocked by Linkedin so be careful
  • Leave at least a 10 seconds delay between each search. Don’t worry it won’t affect your run time consumption. PhantomBuster recommends only 2 but if I have learned one thing using Linkedin automations it’s caution 😂.
  • Don’t check the option of downloading a .jpeg for each company logo. We’re only interested in the image URL

Your set-up should look just like this :

PhantomBuster • Linkedin companies info set-up
PhantomBuster • Linkedin companies info set-up

Once you’re all set up, the process is the same as in the previous step. Just launch your Phantom and wait for it to be done to download your result file. It should look just like this:

PhantomBuster • Linkedin companies info results
PhantomBuster • Linkedin companies info results

Now that we have collected everything we need, we just have to consolidate our data inside a single Google Sheets. Let’s use our main contacts list as the base for the next steps to keep things tidy. You just have to add the “logo URL” column and you are done. Simply copy and paste the “column C” of the step 2.2’s result file.

Main contact list
Main contact list

#3 Use Abyssale’s Dynamic image feature to personalize our template for each contact

Now that we have our template created and all the data we need, it’s time to wonder how we’re gonna put it together into a personalized image for your e-mail prospection.

For this, we’re gonna use the dynamic image feature of Abyssale. Basically, it allows you to generate variations of a template from it’s URL. Your image is hosted on our server and we generate a new version of it every time you make a new request with different settings in the URL. You can know everything about the Dynamic image feature in our help center.

#3.1 Format our data and URL encode it

Here are the formatting steps you need to follow :

1 : Remember the first step of this tutorial. In the “company-name” layer of our template, we added an ‘s at the end of the company name. To make things easier, we’ll add these characters directly in our Google Sheets. For this, create a new column next to the “company name” column.

2 : Add an 's in every cell of this column. Use the following formula to be able to display an in your column: =("'s")

3 : Create a new column and use the =CONCATENATE to aggregate the company name and the ‘s. Let’s name it “Company name ok”.

4 : Once this is done, we just have to create a new column and URL encode our “Company name ok” to remove any spaces or unsupported characters. For this, simply use the =ENCODEURL formula. For example, “AdQuality's” turns into “AdQuality%27s” once URL encoded.

5 : We also have to encode our company logo URL, so create a new column next to logo URL and use the =ENCODEURL formula once again. You should be left with this :

Data formatting and URL encoding
Data formatting and URL encoding

#3.2 Setup our Dynamic image Url in Abyssale

Now, we’re getting to the good stuff!🔥 To get the dynamic image URL of your Abyssale template, you’ll have to go back to the Abyssale app inside your template’s overview. Go to the “Dynamic image” tab and create a new dynamic image. Your Dynamic image link should pop up instantly.

Dynamic image settings
Dynamic image settings

#3.3 Build our Dynamic URL image inside Google sheets

Once our dynamic image link is created inside Abyssale, we’ll copy it, go back to our base google sheets, create a new “Dynamic image” column and paste our link inside of it. If you paste it inside a new browser tab, you should see it load with the same content as inside the editor.

Dynamic image browser preview
Dynamic image browser preview

The Dynamic image feature uses the query string method to update the template content based on its URL. For each type of data we want to update, there is a specific expression to use. For this tutorial, we only want to update texts and images. Those have different commands.

If you want to edit text, use : your-layer-name.payload=yourcontent

If you want to edit an image, use : your-layer-name.image_url=https://your-image-url

For this tutorial, we want to update 3 layers with our contact information. So we will have to create 3 columns (one for each layer we want to update), and fill them with the matching command.

To start a query string, you have to add a ? at the end of your URL. So we’ll add an ? at the beginning of our first expression.

To update multiple layers, you have to add an & between each expression. So we’ll add an & at the beginning of our second and third expressions. The content of each column should look like that :

  • First Name layer : ?name.payload=
  • Company Name layer : &company-name.payload=
  • Company logo layer : &company-logo.image_url=
dynamci image query string commands
Query string commands

Next, we’ll just create a new column and name it “Final dynamic image URL”. Use the =CONCATENATE formula to piece our URL together. Your formula should look like this :

=CONCATENATE (‘Dynamic image URL’,’*First Name layer*’,’Contact First Name’,’Company Name layer’,’Company Name URL encoded’,’Company logo layer’,’company logo url encoded’)

Build your final dynamic image URL
Build your final dynamic image URL

Tadaaaa ! You should now have your complete Dynamic Image URL with all your contact’s data updating each of our 3 layers. Here a few variations to feast your eyes on :

Dynamic image variations
Dynamic image variations

#4 Input an image URL as a custom variable in Lemlist and use it in an e-mail template

Ok, so now that we have created a personalized image for each of our contacts, we just have to import all our data and get to writing our e-mail inside Lemlist.

#4.1 Import our contacts and set-up a custom variable

First of all, to be able to test our e-mail later, we must create a row with some test data at the top of our Google Sheets. Once it’s done, let’s carry on.

You will have to download a .CSV file from our base Google Sheet containing all our data to import your contacts. Go to “File” -> “Download” -> Comma-separated values (.csv, current sheet)

Download a csv from your base google sheet
Download a csv from your base google sheet

Then let’s go to our Lemlist account, create a new campaign and import a new contact list. We’ll use the .csv method. Then match the columns you want to import with the custom variable option. Here is what it should look like :

Lemlist contact import using a .csv file
Lemlist contact import using a .csv file

#4.2 Write our template and insert our dynamic image URL

For the sake of this tutorial, we’ll use one of Lemlist’s available templates. We’ll use the "#4 Get new clients for your agency". You should have something like this :

Lemlist #4 template
Lemlist #4 template

We’ll just delete the image already in the template and add our own. To do so, add an image from a URL custom variable. Choose the “Final dynamic image URL” variable at the bottom of the list.

add an image from a URL custom variable
add an image from a URL custom variable

When your image is added, you should see it appear inside your e-mail’s content like so :

Your Abyssale dynamic image inside your Lemlist template
Your Abyssale dynamic image inside your Lemlist template

As you should always do, we’ll send ourselves a little test e-mail to make sure everything is going according to plan. To do so, click on the eye icon inside the toolbar, fill in some test data and a random dynamic image URL. You should see the image updating right away with the correct data in each layer!

Lemlist e-mail preview with an abyssale dynamic image
Lemlist e-mail preview with an abyssale dynamic image

And voilà !!!!!! 🎉🎉🎉  You’re now ready to take your e-mail prospection to the next level with personalized images! You just have to review your leads and launch your campaign!