If you have a memberium wordpress site and suddenly get a white screen when you add or edit a post or blog it’s because you have to reach out to Memberium support and get them to send you an updated file that you need to put into your memberium2/js folder. The latest version of WordPress has caused this Memberium issue. Once you add this file, the issue will be resolved.

I am half writing this for myself for the future in case I forget the exact syntax. If you want to update a custom field for a contact inside Keap but don’t want to create your own API, there is an easy way to do it. For this scenario below I am using make.com which is a zapier alternative.

In the URL you are going to want /v1/contacts/contact ID. The contact you can dynamically map in make.com. For this example, I am testing on my own contact record, so I have hard coded the KEAP contact ID.

keap api

 

Make sure the method = patch as we are updating a contact record and not creating from new.

 

I am updating custom field ID 784956. I am inputting the number 7 into this field as it is a numeric field only,

 

That is the syntax needed to update a custom field via REST API in Keap. Works for max, max classic and pro.

 

The Data Hydration Failure – some fields may be missing message error looks something like this screenshot below.

zapier error message

This can occur from time to time if you’re unlucky when you have recently deleted custom fields inside your Keap/Infusionsoft CRM. The strange part about this is that it can still occur even though you don’t use any of these custom fields with your Zapier automations.

It is a well known bug that people within the Keap community are aware of. I have spoken to many people that say they are too afraid to delete any custom fields in fear that it might break all their Zapier automations.

Solution #1

Add the fields back that you deleted. Many have claimed that adding the recently deleted fields using the same field name in KEAP miraculously made their Zapier data hydration failure message go away.

Solution #2

Reach out to Zapier support and report your error. I recently had the Zapier data hydration failure message and this was Zapier’s response to me. Pasted below.

I’ve had a look into the errored run for you and it looks like you’re running into a bug here. I’ve found a very similar bug report raised with our Product team and I’ve now added you to the list of affected users to ensure that you’ll be notified as soon as there’s an update.

 While I can’t provide a timeline for when this bug will be resolved, we’ll be sure to be in touch with you as soon as we have any updates. From the report I can see that in some cases Infusionsoft will return the contact details as hydration as opposed to the expected JSON format which causes the trigger to fail: 

Update – Solution #3

I have some extra information since I wrote this blog. I have spoken to a few people at Zapier and have since experienced this a few times first hand. Solution option #3 is to simply wait. The reason you’re getting the data hydration failure message in Zapier is because Zapier’s cache hasn’t updated yet. Say for example you went from 150 custom fields to 149. That is enough for Zapier to get confused and bail out. Sounds crazy right? You have to wait until Zapier automatically updates its cache. This can range from 2 to 24 hours depending where you are in the cycle. Once Zapier recognizes how many custom fields you have, all will be good again and your Zaps will be up and running.

My advice to ensure this doesn’t happen again is to max out all your custom fields. Even if you have no need to, create fields like empty1, empty2, empty3 and when you get the need to use a new field, just replace empty1 with the new field name. That way the amount of custom fields you have doesn’t ever deviate and won’t expose you to the risk of getting the dreaded hydration error message. If you are really desperate and can’t wait hours or days for this error to correct itself I would advise you to contact Zapier and ask that they give you priority and have your account cache refresh.

Hope this helps and gives a bit of transparency into the issue.

 

We recently received the following message from Keap in regards to our integration with Zapier.

It looks like Zapier has been consistently sending ~10k DataSeervice.query calls per hour every hour to your application over the past seven days. This consistent calling to the application over that time is odd and seems excessive. It may not have caused an issue over the past week as other apps may have had low usage on the server block during that time, but if another app or apps began utilizing the server block normally it would then cause the large consistent amounts of calls we’re seeing here to cause server stability issues which triggered alerts for our Site Reliability Engineering team.

The reason for this issue is because we had too many Zaps running. If you have more than 50+ Zaps in Zapier then you may be running the risk of being banned from Keap.

Even when a zap doesn’t fire. It is still constantly polling and checking every contact in your database to see if any new tags have been banned. You can imagine how demanding this can become if you have thousands of contact records. 

You have two solutions to fix this issue. The first possible solution is the reduce the amount of zaps you have in Zapier.

The second possible solution is to remove your tag triggers and replace them with HTTP posts from within your campaign builder. Using this to trigger a zap will eliminate Zapier’s thirsty need of checking every single contact every few seconds to see if a new tag has been added.

I hope this helps! I have also heard of people complaining to Zapier and Zapier admitting that it has started to become an issue since they upgraded their UI. Some people I have know have also asked that Zapier put them back into their old UI which fixed the problem.

The answer is no. There is no way that you can use an order form, payment link, quote to have the form detect that the person is from Ontario, Alberta etc and charge the appropriate provincial tax. The only way to get tax is after the purchase has been made which is undesirable.

If you want to charge tax at the point of sale and for the form to adjust the tax in real time when the purchase is being made, you will have to use Max Classic which has this ability.

If you are looking for a native way to connect two Keap applications together in order to share contacts, it unfortunately can not be done. This feature has been disabled for all versions of Keap. The only way to make this possible is via 3rd party integrations such as Zapier/Integromat etc.

This feature used to be possible but looks like it was fazed out when Max and Pro came about. 

Keeps is an all-in-one accounting software package. You can connect Keeps to QuickBooks, so that when you generate reports in Keeps it can send them to QuickBooks for you to keep track of all your data in one place. You can even connect your bank accounts to Keeps.

How does Keeps integrate with QuickBooks?

Keeps is a web-based application that automatically uploads invoices and receipts to QuickBooks Online, seamlessly eliminating the time-consuming process of data entry. Keeps integrates with QuickBooks Online by automatically uploading invoices and receipts, saving time and effort for companies that use both tools. Users simply log into their Keap account and select the Quicken tab to see all data uploaded.

If you’re reading this blog it’s probably because you’re trying to create some kind of scenario in integromat that can gain access to a custom field in Keap, Infusionsoft Max Classic. 

For this example we are going to create a scenario where the tag is the trigger. Once triggered integromat will retrieve a contact and add a row to Google sheets that includes a custom field value.

integromat scenario example

The first step is just to make it do anything. You will have to setup the trigger tag and then run the scenario once. This will prompt integromat to capture the custom field arrays which we will be able to check in step 2 which is the “retrieve a contact” step.

This should bring up something that looks like this below. You are going to want to expand the custom field array.

custom field array

Here comes the not so fun part. You are going to have to collapse all of the arrays until you find the custom field that you are looking to access. In my example it was array 53 which contained custom field ID 319 that I was looking to access. This is the biggest mistake people make when trying to access custom fields in integromat. You want to reference the array not the custom field ID.

infusionsoft array

If you want to follow along with this example and add a field to a google sheet row then look for custom field [ ] and select “content”.

Once you have added this you need to double click inside the green box to insert your array row id (not your custom field ID). See screenshot below.

That is how you go about adding content from an Infusionsoft/Keap/Max Classic custom field to Google sheets using integromat.

If you are trying to create a Keap order via the API and wondering how to add taxes to the order because taxes aren’t being added automatically at the Infusionsoft/Keap/Max site, then look no further.

This can be done by adding a tax line item (ItemType: 2 on the OrderItem table) and setting the value upon creation. You should be using the tax amount presented to your customer through your storefront or point of sale, as to make sure the correct/expected amount is being charged. If you are not collecting these orders through a storefront, you will want to have something built into your integration to calculate the tax amounts during the integration step before the data is passed to Infusionsoft/Keap via the API.

Hope that helps someone trying to figure out why there is no documentation on creating orders with tax (not subscriptions).

We have all ran into the problem of existing contacts in your Keap/Infusionsoft account who suddenly decide to use new order information when completing a purchase which then creates a new contact record. I personally use 5 different email addresses at any given time which means this would create 5 new contact records.

To stop people from changing their email address. Add the following code to the custom footer code in your Keap/Infusionsoft order form. 

<script>
jQuery(document).ready(function() {
function getUrlVar(key){
var result = new RegExp(key + “=([^&]*)”, “i”).exec(window.location.search);
if (result != null) {
if (result[1].substring(0,1) != “+”) {
result[1] = result[1].replace(/\+/g,” “);
} else {
result[1] = “+” + result[1].substring(1).replace(/\+/g,” “);
}
}
return result && result[1] || “”;
}
jQuery(‘#firstName’).val(decodeURIComponent(getUrlVar(‘FirstName’)));
jQuery(‘#lastName’).val(decodeURIComponent(getUrlVar(‘LastName’)));
jQuery(‘#zipCode’).val(decodeURIComponent(getUrlVar(‘PostalCode’)));
jQuery(‘#country’).val(decodeURIComponent(getUrlVar(‘Country’)));
jQuery(‘#phoneNumber’).val(decodeURIComponent(getUrlVar(‘PhoneNumber’)));
jQuery(‘#addressLine1’).val(decodeURIComponent(getUrlVar(‘StreetAddress1’)));
jQuery(‘#addressLine2’).val(decodeURIComponent(getUrlVar(‘StreetAddress2’)));
jQuery(‘#city’).val(decodeURIComponent(getUrlVar(‘City’)));
jQuery(‘#state’).val(decodeURIComponent(getUrlVar(‘State’)));
jQuery(‘#emailAddress’).val(decodeURIComponent(getUrlVar(‘Email’)));
jQuery(‘#promoCode’).val(decodeURIComponent(getUrlVar(‘promoCode’)));
});

jQuery(‘#emailAddress’).attr(‘readonly’, true);
</script>

When you send you contact records an email. You will want to link to the form like this example https://cu128.infusionsoft.com/app/orderForms/b1941e1d-d9b1-47a6-8711-684d94d95063?FirstName=~Contact.FirstName~&amp;LastName=~Contact.LastName~&amp;Email=~Contact.Email~

Notice the first name, last name and email address are all contained in the URL’s UTMs?

This will auto fill the first, last and email on the form.

To make first name and last name non editable, just add the following code to the above code on this page.

jQuery(‘#FirstName’).attr(‘readonly’, true);

jQuery(‘#LastName’).attr(‘readonly’, true);