Associate ConvertKit Subs with their CRM IDs

Use case:
you’ve recently implemented a new CRM
some of your existing email subs are in it while others aren’t
you want all subs to have their CRM ID in their record in your email system
this might help you!

In my case, the email program is ConvertKit and the CRM is build in ClickUp, but this could apply to any apps. Here’s what each module number does:
8. We first list subs, returning a bundle for each
20. Each sub bundle triggers a list filtered tasks module filtered on the sub’s email (which is a custom field in ClickUp; you need to know your custom field IDs if you are using this setup, which you can get using the list accessible custom fields module in Make (I keep all mine in a spreadsheet, however, since I use them so much).

16. If the number of bundles from the list filtered tasks equals 0 (meaning there’s no ClickUp task with that email), the top route will pass and
14. create a task , then
19. set a variable containing that new task’s ID.
The lower, unfiltered route will first get variable to grab that new task ID, then if the sub’s crm_id custom field in ConvertKit is not set, it will pass the filter to
13. update a subscriber

If module 20 returned >0 bundles, i.e. if ClickUp already had a task with that email address, then we take the ID from that task. Else, we take the variable that was gotten from the top route, containing the newly created task’s ID. As I discovered, it’s important to do it in this order. I initially had ifempty({{18.crm_id}};{{}}) but this caused issues because the variable set in the top route would not in fact be empty just because no new task had been created for that contact. It would persist from the last bundle where a new task had been created, so New Contact’s task ID would get mapped to Existing Contact’s subscriber profile. Using the {{if(20.__IMTLENGTH__ > 0;; 18.crm_id)}} syntax in the screenshot solved this problem.

Here’s the blueprint if you want to mod and implement it:
Update existint ConvertKit subs with their CRM ID.json (122.8 KB)

Would love to hear any feedback, questions or suggestions!

1 Like

Heya @Robert_McKay happy Friday :sunny:

I have to say that you’re bringing some seriously great stuff into #showcase :clap:

Thank you very much for taking the time to share this incredibly helpful walkthrough with all of us. Syncing data between CRMs and email lists is, indeed, a crucial task.

Super valuable and 100% appreciated. Thanks for keeping the community in mind and keep up the awesome work :muscle:

1 Like

One area I’d love input on is how to use the “ANY” operator in the list filtered tasks module to cut operations. You could just aggregate all the emails from list subscribers into an array and map it to the value of the email custom field to filter tasks. However, I can’t seem to get the array into a format ClickUp likes, even though their API docs suggest an array should look like “[value1,value2]”

I also tried the array aggregator instead of text aggregator, and got the same results when mapping either {{25.array[].email_address}} or just {{25.array}}.
Evidently it doesn’t like any of these as it’s still returning all the subs instead of the two whose emails I mapped. Is there some function I’m not familiar with for turning a comma-separated string into an array?

Thank you! You’re very kind to an upstart.

1 Like

Another improvement I’m working on now:

My CRM has a list for each role of contacts I work with (parent, student, tutor, etc.), and at first I was just dumping those new CRM records into a “Needs a Role” list for manual sorting later.

I’m now trying to select the list automatically based on subscriber tags. On that top route, I’ve added a get subscriber tags module and replaced create task with create task (advanced) so I can (theoretically) map the list ID based on any tags the sub may have. I’m having trouble with the function, which keeps returning “not a valid string”:

If there are no tags (number of bundles from module 41=0), we put the task in the “Needs a Role” list (that first long number is the list ID). Else, I attempted to use switch() to output the proper list ID for each tag name. However, I think my first argument may be the issue; I always get confused with arrays and what you can and can’t do with them in functions. I think the expression argument on switch() needs to be a string, not an array.

So I tried using a bunch of nested if(contains())functions to check if the array aggregated from the list subscriber tags module contains any of the tag names. Again, I’m checking if there were no tags first, then the else argument on that outermost wrapper if() function is all the other functions:

But this is still throwing the “invalid string” error, so now I’m thinking I just might not have access to that first 41.__IMTLENGTH__ (number of bundles) argument because the aggregator is in the way. I couldn’t get the pill to pop up so I tried hard-coding it, but it comes up as “Empty” not “0” in the execution, and that would explain why a test record with no tags is failing to create a task in the “Needs a Role” list as it ought.

Any thoughts? Much appreciated!

Thanks for this thread! Selecting the right CRM implementation partner is paramount in order to reap the many advantages of investing in a comprehensive customer relationship management (CRM) system. Management must ensure that the partner they select can provide not just technical expertise but also support for operational, strategic and business objectives. In evaluating potential candidates, decision-makers should have an understanding of their options in terms of services provided, cost breakdowns and experience. With such information, organizations can create a well informed selection process that will lead them to the most suitable CRM implementation partner. I recommend reading more here:

By the way I finally managed to templatize my custom ClickUp CRM if anyone’s interested. ClickUp

Voila! ClickUp relational CRM! For an ed-tech use case with a Barbie theme, can be customized however you want. Would love any feedback as I plan to productize this soon. Free for now! Also if folks want more insight into how I implement this with other apps in Make, just holler!