How to Send Birthday Campaigns with Pardot (Account Engagement)

Share this article...

Birthday campaigns touch prospects on their special day – a simple greeting, perhaps with a discount. This personal, and unexpected interaction gets your brand noticed. Even in B2B marketing it’s a worthwhile exercise, after all, business buyers are human, too.

How can you fully automate birthday campaigns using Pardot (Account Engagement)? This guide will teach you how to get data into the correct format, and build the Pardot (Account Engagement) automation that will deliver this moment of celebration.

Step 1: Transform Birthdate to Birthday

Note: There’s an assumption that you have a birthdate field in Salesforce already set up, and populated to some extent.

Birthdate is a standard field on the Salesforce Contact object. We’ll use Salesforce Flow to turn the birthdate into their birthday: The actual day they were born → the day and month, this year.

  • Create a new custom field on the Contact object, named ‘Birthday’ or ‘Next Birthday’. This custom field needs to have a field type of “date”.

On Step 4 of the field setup, you decide which page layouts this field should appear on. While testing, keep these selected. You can come back later to deselect all the page layouts listed because this is only an operational field (for behind the scenes work).

Note on Leads: Remember I said Birthdate is a standard field on Contacts? If you want to roll this campaign out to your Leads too, then create a custom Birthdate field for Leads, and repeat Step 1 for Leads.

Step 2: Configure the Flow Start

Before we go any further, if you are not the Salesforce Admin, check in with your admin about creating this process. Automation should be combined into a set of Flows for each object; you don’t want multiple processes firing at once, potentially clashing with each other or erroring out.

Note: The tutorials we are showcasing are built in developer edition orgs with limited data and only a few custom automations. Ensure that you evaluate your existing processes properly before building new ones, including both declarative automations and custom Apex. For Flow specifically, consider the recommended best practices when it comes to the number of record-triggered flows per object.

Now that we’re past the initial steps, navigate to Setup and into Flows. I will create a new Record-Triggered Flow for this example. We will choose Contact as the object triggering the automation, but keep in mind that you could also do this with Leads, or even Person Accounts, if required.

Make sure to set the entry criteria and logic correctly, as that will determine if the record being created or updated will make the automation run or not.

Since we are using information from the Contact record to update another field on the same record, thus the Flow will be optimized for Fast Field Updates and will run before the record is saved.

Step 3: Update Records Element

The next step is to update the custom Birthday field which we just created on the Contact, and for this an Update Records element will do the trick.

As you can see below, as the Flow runs before the record is saved, updating the triggering record is the only option, and it is automatically selected.

As far as the value goes, we need to use a formula which can’t simply be pasted in the Value field. A Resource needs to be created, and we can directly do so from this screen, by clicking on the Value field, then on “+ New Resource”.

The resource should be created as below, with the resource type being formula. Supposing you are using the Birthdate field, you can use the same formula as well:

IF (AND(MONTH({!$Record.Birthdate})= 2,DAY({!$Record.Birthdate})== 29),
 IF (OR(MOD( YEAR(TODAY()), 400 ) = 0,AND(MOD( YEAR(TODAY()), 4 ) == 0, MOD( YEAR(TODAY()), 100 ) <> 0)),
  IF (DATE(YEAR(TODAY()), 2, 29) > TODAY(),
   DATE(YEAR(TODAY()), 2, 29),
   DATE(YEAR(TODAY())+1, 2, 28)
  IF (DATE(YEAR(TODAY()), 2, 28) > TODAY(),
   DATE(YEAR(TODAY()), 2, 28),
   IF (OR(MOD( YEAR(TODAY())+1, 400 ) == 0,AND(MOD( YEAR(TODAY())+1, 4 ) == 0, MOD( YEAR(TODAY())+1, 100 ) <> 0)),
    DATE(YEAR(TODAY())+1, 2, 29),
    DATE(YEAR(TODAY())+1, 2, 28)
 IF (
  DATE(YEAR(TODAY()), MONTH({!$Record.Birthdate}),DAY({!$Record.Birthdate})) > TODAY(),
  DATE(YEAR(TODAY()), MONTH({!$Record.Birthdate}),DAY({!$Record.Birthdate})),
  DATE(YEAR(TODAY())+1, MONTH({!$Record.Birthdate}),DAY({!$Record.Birthdate}))

In the end, the Update Element and the Flow should look like below. Let’s activate the Flow and see it in action!

Note: Within the Update Records Element, you need to add the name of your custom field to be updated, which may be different to mine. Search for your field name by clicking on the field, then Record >, then select the field.

Step 4: Test the Birthdate to Birthday Automation

Either create or just navigate to an already existing test record, insert or change the standard Birthdate, and watch the Birthday field populate. As expected, either upon Contact creation or Birthdate field update, the Birthday is properly populated either with this year’s birthday if the date is in the future, or next year’s if this year’s has already passed.

Alternative Option: Create a Formula field

You can also opt to build a formula field that will show the same result instead of a Flow, directly on your Contact object as well, which will be calculated after the record is saved. The advantage of the formula field approach is definitely the fact that the data will be historically filled in as well, based on Birthdate, as soon as the field is created.

Of course, the formula we used above in the Flow resource will need to be adapted to be used in the formula field, by replacing {!$Record.Birthdate} with just Birthdate.

IF (AND(MONTH(Birthdate)= 2,DAY(Birthdate)== 29),
IF (OR(MOD( YEAR(TODAY()), 400 ) = 0,AND(MOD( YEAR(TODAY()), 4 ) == 0, MOD( YEAR(TODAY()), 100 ) <> 0)),
IF (DATE(YEAR(TODAY()), 2, 29) > TODAY(),
DATE(YEAR(TODAY()), 2, 29),
DATE(YEAR(TODAY())+1, 2, 28)
IF (DATE(YEAR(TODAY()), 2, 28) > TODAY(),
DATE(YEAR(TODAY()), 2, 28),
IF (OR(MOD( YEAR(TODAY())+1, 400 ) == 0,AND(MOD( YEAR(TODAY())+1, 4 ) == 0, MOD( YEAR(TODAY())+1, 100 ) <> 0)),
DATE(YEAR(TODAY())+1, 2, 29),
DATE(YEAR(TODAY())+1, 2, 28)
IF (
DATE(YEAR(TODAY()), MONTH(Birthdate),DAY(Birthdate )) > TODAY(),
DATE(YEAR(TODAY()), MONTH(Birthdate),DAY(Birthdate )),
DATE(YEAR(TODAY())+1, MONTH(Birthdate),DAY(Birthdate ))
READ MORE: Formula Fields + Pardot: The Problem and How to Solve It

Step 5: Create the Pardot Custom Field

  1. In Pardot, create a prospect custom field, named ‘Birthday’/‘Next Birthday’ (same as the field you created earlier in Salesforce).
  2. Map the prospect field to your Salesforce Birthday field.
  3. Sync Behavior, chose “If Pardot and Salesforce values differ when data sync occurs: Use Salesforce’s value”; this is because the Salesforce formula will be responsible for changing the birthday date, year by year.
  4. Select the Date field type. This will give you the correct Pardot automation choices in the next step.

Step 6: Generate the Segment

By using an Automation Rule, you can single out anyone with a birthday today (the criteria), and send them the birthday email (the action).

An Automation Rule (vs Dynamic List) is my preferred option because in one place, you can set the criteria (which prospects to include) and the action (what Pardot should do). Here is the criteria (Match All):

  • Prospect custom field — [Birthday] — days ago greater than or equal to — 0
  • Prospect custom field — [Birthday] — days in future less than or equal to — 0

This is telling Pardot to include anyone whose birthday is today (less than one day away, and less than one day ago).

Step 7: Add the Email Automation

On the Automation Rule, the next section is the Action section. For this one-shot email, we can use the ‘Send prospect email’ action. Note that your email has to be an email template, otherwise it will not show up to select.


Birthday campaigns are great to include in all your marketing communications to touch prospects on their special day.

This guide has taken you through how to automate a birthday campaign in Pardot (Account Engagement) with support from Salesforce’s more advanced data transformation tools.

Credit to Lara Black for her answer on the Pardot B2B Marketing Automation Trailblazer Community Group, which inspired this post.

10 thoughts on “How to Send Birthday Campaigns with Pardot (Account Engagement)

  1. Sébastien de Heaulme


    Thank you for this complete post. I have read it more than 10 times but there is still something I don’t undersand. A process builder is launched when a record is created or modified. Thus in you post the Birthday will be calculated at the creation. But it won’t work more than once. If there is no modification in the contact record for 1 year, i will miss next birthday.

    1. Hi Sebastien, thanks for pointing that out – I’ve updated the post with steps 6 & 7 to ensure the date is reset to the next birthday. Let me know your thoughts!

  2. Copy/pasting the formula you have into the Process Builder yields a syntax error.

    The formula expression is invalid: Syntax error. Missing ‘=’

    I have no idea where it is. Could you provide a corrected formula?


    1. Hi Matt, thanks for letting me know – I repasted the formula that I have working in my org. Do you mind trying again please?

  3. Hi,

    I’ve followed your step by step for adding Birthday date on Salesforce, adapted the fields to our owns in the formula. It should be working, but it’s not…The record itself is a person account, working with contact fields and the contact record on the process builder should not be an issue in itself no?

    Looking forward to solving this with your help if possible !


    1. Hi Pierre, thanks for your comment, and what a challenge to be confronted with! Let me take this away and have a look into it…person accounts are a weird object 🙂

      1. Hi Lucy, I’ve decided to go with a formula field instead, the only thing is that the birthday year will be updated only once per year for every record on January 1st with the YEAR(TODAY()) change. But that will still work just fine for us -> and much easier to implement since the formula is basically one line 🙂

        1. Hi Lucy and Pierre!

          This is a super helpful article, however like Pierre I am using PersonAccounts and not just contacts. Did you find a solution Lucy?

          Also Pierre, are you able to share the workaround you came up with?

          Many thanks in advance

  4. Thank you for providing these steps! This is so incredibly helpful. One question and one fix to an error.

    1. How do you update all current records in bulk now that we have the process builder set up?

    2. Under step 1, you state:

    Once you have returned to the main screen, select the following:

    Next to Birthdate: ‘Is null’ — Boolean — True
    Click ‘Find a field’, and select the ‘Birthday’ or ‘Next Birthday’ field you created earlier.
    Next to Birthday/Next Birthday: ‘Is null’ — Boolean — True
    ‘Find a field’, and select the ‘Birthdate’ once again.
    Next to Birthdate: ‘Is changed’ — Boolean — True

    The first “Boolean — True” should be “Boolean — False” I believe.

    Thanks so much!

    1. Hi Laura,

      1. very good question! How you should do this is:
      -create a temporary checkbox field (on Contact and Lead)
      -Export all the Contact/Lead records (including the Contact/Lead IDs)
      -Use Dataloader to do mass update and check the temporary checkbox on all those records.
      -Salesforce will consider this record as edited, so will trigger your process and updates old records

      2. Oh, double negatives make my head spin sometimes. Thank I will take a closer look at this.


Add Comment