Linkedin Reply Detection
Linkedin Inbox Scraper
Description
Detect replies to Linkedin messages, turn off future replies and push leads into the CRM
Platform
Parabola.io
Workflow
Schedule/Trigger
6 am daily
1. Enrich and Join the Phantombuster Data
We start the Linkedin Inbox Scraper workflow by joining the Session Cookie tab and the Phantombuster ID tab of the Session Cookie Rotation Sheet. Next we use the Phantombuster IDs and the file names to enrich Phantombuster's API three times 1. To see who we sent a connection request to 2. To see who accepted our connection request 3. To see a list of the latest messages in our inbox. We do this using API Enrichment
steps.
We start by renaming the columns to the standardized headers. Then we create a unique message column by merging the Linkedin (written) column with the Message column. There may be multiple messages from one person, so de-duping by message would combine people who went through the same sequence and had the same first name, but weren't the same person. Removing duplicate rows by the Linkedin (written) column would result in only one message per person, cutting off any time multiple messages happen. Creating a UniqueMessages column that merges the Message column and the Linkedin (written) column and then de-duping gives us each unique message for each unique person.

Next we Join
the data from the three API Enrichment
steps together, allowing us to put the message responses and the detailed contact fields such as skills, Linkedin company pages, websites, emails, etc into a single table.
Then we Compare dates
of the Last Message Date column with the current timestamp and use a Row filter
for responses that happened in the last 24 hours. Since the workflow runs once per day, we get all the people since the last time it ran each time.
2. Join the Message Sender Data to the Phantombuster Data

We import the Linkedin Message Follow Up Rotation Sheet, keep the relevant historical message data, and check it against the Contacts Extractor data.

We then join the message history data from the Linkedin Message Sender Follow Up Rotation Sheet with the contact, company, and reply data from the Phantombuster enrichment in step 1.
3. Reply Detection
After joining the Phantombuster data with the Message Sender Follow Up data we will use an If/Else
step to say that if the is Last Message From Me column contains false, create a column called If/Else
and put an "X" in the column.
Next we use a row filter to keep rows where the If/Else
column contains X. This effectively removes messages we sent from the inbox scraper and only receives messages we didn't send.

Next we add the Reply Step column. The Linkedin Message Sender workflow supports up to 3 follow ups after connecting. The Linkedin Message Sender Follow Up Rotation Sheet updates each message column every time a new message is sent. IE: After Message3 is sent the Message3 column in that Sheet will be filled in with the message that was sent. Prior to it being sent the Message3 column would be blank.
We use a Find and Replace
step to find blank spaces in each of the Message columns and replace it with "|||."
Not using a Find/Replace step on blanks will cause false positives for column is blank. Every column will pass the filter. By adding a Find/Replace step for blank spaces to become ||| allows us to then filter for rows that do not contain ||| without these false positives.


Next we apply the Reply ID using an If/Else
step. This gives a unique identifier with the platform name, the campaign name, the filter Id, the outreach stage, if they were in A/B, and what step of the sequence they replied on.
Reply ID: {Platform}-{Campaign Name}-{Filter ID}{Stage}{A/B}{Reply Step}
Then we remove the current Replied column and add a new Replied column with an "X" in it. This is used to turn off future messages after they reply. We also add a Reply Date column with the current date.

4. Determine if the Contact Already Exists
We push contacts who replied into the CRM. To do this we must determine if they already exist in the CRM. We're using monday.com as a CRM, but powering the integrations with Hubspot since they have a two way sync and Hubspot has a powerful integration library. This sync lets me get the features and visual aspects I want from monday.com, while being able to access all the integrations.

We are going to search Hubspot using an API Enrichment
step to find a person by their name. The Full Name column in the workflow can include middle names/initials, which can create problems when searching Hubspot. To get around this issue, we are going to split the Full Name column twice using a Text Extract
step. First we're extracting all the characters before the first space (first name) and then a second Text Extract
step on all characters after the last space (last name). Then we use a Column Merge
step to combine the first name and last name columns we just created into a Full Name Short column that does not have any middle names/initials.
We can then remove the extra columns created by the Text Extract
and use an API Enrichment
to search Hubspot by the Full Name Short Column. We then will use a JSON Flattener
on the results to make them readable. We rename the api.contacts.properties.pulse_id.value to Pulse ID. Contacts with a Pulse ID already exist in the CRM, while contacts without a Pulse ID do not yet exist in the CRM.
5. Sentiment Analysis
We're next going to figure out if their reply was a positive or negative reply. We'll run a Sentiment analysis
on the Message column that will read the text and determine how positive or negative it was based on a scale of -100 to 100.

Next we'll use an If/Else
step to create the Sentiment column. Any scores higher than -15, messages containing @ or questions get labeled as positive and all other replies get labeled as negative.

6. Prepare Data for Export
We'll import the Email Campaign IDs tab and the monday Type Statuses tab of the Session Cookie Rotation Sheet and import the Search Links Sheet and join them together and then join them with the main table by Query / Search URL This gives us all the contact data and additional information like which Mailshake campaign they are in.

Then we will use the Magic Cleaner
to remove invisible characters that can break importing into third party apps. Next we will split the Email column into a Personal Email and Business Email column using If/Else
steps.
We'll use an Insert Static Columns
to add potentially missing columns if the workflow runs with blank data and then Rename
the unique Hubspot ID as VID. We will then assign the Pipeline column using an If/Else
step. Similarly we create a DM column for decision maker using an If/Else
step where if their Seniority Level is CXO, Director VP, or Owner then DM is "Yes," if their Seniority Level is Manager then DM is "Likely / Influencer," if their Seniority level is intern then DM is "No," and if Seniority Level is Senior then DM is "Unknown."
We create an Interest Level column using an If/Else
step, where if the Sentiment analysis is less than 20 it is set to "Low," 20 to 50 is set as "Medium" and over 50 is set as "High."
7. Export Reply Detection Results to Sheets
All people who replied now have an X in their Replied column. When the Message Sender workflow runs, this X is used to filter out contacts who shouldn't be messaged.

We'll use a Stack Tables
to merge the old Linkedin Message Follow Up Rotation Sheet with the new replies coming in. We'll use a row filter on the old data to clear all the data from the table and then stack the tables in this order:
Row filter with blank data to keep structure of the Message Follow Up Rotation Sheet.
New replies coming in
Message Sender Follow Up Rotation Sheet
This allows us to keep the structure of the old table, while prioritizing new data in the de-duplication process. To learn more read the "Maintaining the Format of One Table, While Needing the Opposite Table to be Stacked First" in the Stack Tables guide for Parabola.
Then we Remove Duplicate Rows
and export back to the Message Sender Follow Up Sheet. This accomplishes two things:
Records replies
Adds a filter to prevent future messages
8. Remove Replied Contacts from Message Sender Sheets
We will check each of the individual Message Sender Sheets against the people who replied. The previous step prevented new messages from going out to future people. This step removes existing messages that were scheduled to someone who replied.

9. Export Contact and Company Data to CRM
We will filter for contacts who did not previously exist using a Row Filter
step to remove anybody that has a Pulse ID.

Next we use a Row Filter
on the Sentiment column to filter for positive replies. Those replies and the contact and company information associated with them is sent to Zapier to create a new contact using an API Export
. This contact is then synced to monday.com.
10. Update Parvenu Inbox Scraper
We use a List Contains
step to check the new data against the Parvenu Inbox Scraper Sheet to find that that wasn't already in the Sheet. Then we Rename
UniqueMessages as Filter, use a Stack Tables
and De-Dupe
steps before Sheets Export
back to the Parvenu Inbox Scraper.

.
Last updated
Was this helpful?