Infusionsoft by Keap

Infusionsoft sales and marketing automation software is built exclusively for small business success. The Infusionsoft/Grow integration helps you focus your marketing and sales efforts in your business, allowing you to focus on streamlining the customer lifecycle and manage customer relations.

Infusionsoft is on the Grow Datawarehouse, which we highly recommend you use. Here is the link to the Data Warehouse Help Article.

Warehousing Tables

We pull in all the main tables from the Infusionsoft API.

These tables include:

  1. Appointments
  2. Campaigns
  3. Commissions
  4. Companies
  5. Contacts
  6. Emails
  7. Notes
  8. Opportunities
  9. Orders
  10. Products
  11. Subscriptions
  12. Tags
  13. Tasks
  14. Transactions
  15. Users

These 15 Infusionsoft API tables power 22 Derived Tables which are available in Grow:

Connecting to Infusionsoft

Before you get started you will need to obtain your Infusionsoft username and password.

Here are the steps to connect your Infusionsoft account to Grow:

  1. Click on the Data tab at the top left of the global navigation. Then click on Connections in the Data Library section.
  2. Click on the blue + Connect button and search for Infusionsoft.
  3. Click on the Infusionsoft logo.

    Infusionsoft only supports having 1 connection per InfusionSoft account. If someone in your organization has already authorized InfusionSoft using 1 account, do not authorize it again using that same account. Doing so will cause multiple issues.

  4. Fill out your Infusionsoft username and password and click Log In.


You can access your Infusionsoft data in one of two ways, through saved reports or table queries.

Saved Report/Search are saved reports you have created on your account, with the associated fields are available in Grow. This is the most popular and easiest option for most clients, as it organizes your data exactly as you need it.

To see the saved search in Grow, it needs to be shared with Everyone, or at least the person who connected their Infusionsoft account to Grow.

The Infusionsoft API can be strict about pulling complex Saved Searches through the API and in some cases will return an error message that reads "[Unexpected] Unable to get saved search results". You can read more about this and their recommendations if you encounter this error message here.

Table Queries are reports with defined fields already created. Below is a list of the tables and the most relevant fields that go with each one.

  • ActionSequence: TemplateName, VisibleToTheseUsers
  • AffResource: Title, ResourceType, ResourceOrder, ResourceHTML, ResourceHREF, Notes, ProgramIds
  • Affiliate: ContactId, ParentId, LeadAmt, LeadPercent, SaleAmt, SalePercent, PayoutType, DefCommissionType, Status, AffName
  • CCharge: CCId, PaymentId, MerchantId, OrderNum, RefNum, ApprCode, Amt
  • CProgram: ProgramName, DefaultPrice, DefaultCycle, DefaultFrequency, Sku, ShortDescription, BillingType, Description, HideInStore, Status, Active
  • Campaign: Name, Status
  • CampaignStep: CampaignId, TemplateId, StepStatus, StepTitle
  • Campaignee: CampaignId, Status, Campaign, ContactId
  • Company: Addresses, Billing Information, Company and Account IDs, Email Addresses, Fax Numbers, Names, Phone Numbers, Website for companies
  • Contact: Addresses, Contact Notes, Company and Account IDs, Email Addresses, Fax Numbers, Names, Lead Source, Phone Numbers, Website for contacts
  • ContactAction: ContactId, OpportunityId, ActionType, ActionDescription, CreationDate, CreationNotes, CompletionDate, ActionDate, EndDate, PopupDate, UserID, Accepted, CreatedBy, LastUpdated, LastUpdatedBy, Priority, IsAppointment
  • ContactGroup: GroupName, GroupCategoryId, GroupDescription
  • ContactGroupAssign: Contact Group and ID, then Contact Name, Addresses, Phones, Emails, and Website by Contact Group. Includes Contact Custom Fields
  • ContactGroupCategory: ID, CategoryName, CategoryDescription
  • CreditCard: ContactId, Billing Name, Email, and Address, Company Name and Address, Name on Card, Expiration Date, Card Type, Card Number, CVV
  • DataFormField: DataType, Id, FormId, GroupId, Name, Label, DefaultValue, Values, ListRows
  • DataFormGroup: Id, TabId, Name
  • DataFormTab: Id, FormId, TabName
  • Expense: ContactId, ExpenseType, TypeId, ExpenseAmt, DateIncurred
  • FileBox: FileName, Extension, FileSize, ContactId, Public
  • GroupAssign: UserId, GroupId, Admin
  • Invoice: ContactId, JobId, DateCreated, InvoiceTotal, TotalPaid, TotalDue, PayStatus, CreditStatus, RefundStatus, PayPlanStatus, AffiliateId, LeadAffiliateId, PromoCode, InvoiceType, Description, ProductSold, Synced
  • InvoiceItem: InvoiceId, OrderItemId, InvoiceAmt, Discount, DateCreated, Description, CommissionStatus
  • InvoicePayment: InvoiceId, Amt, PayDate, PayStatus, PaymentId, SkipCommission
  • Job: JobTitle, ContactId, StartDate, DueDate, JobNotes, ProductId, JobStatus, DateCreated, JobRecurringId, OrderType, OrderStatus, ShipFirstName, ShipMiddleName, ShipLastName, ShipCompany, ShipPhone, ShipStreet1, ShipStreet2, ShipCity, ShipState, ShipZip, ShipCountry
  • JobRecurringInstance: RecurringId, InvoiceItemId, Status, AutoCharge, StartDate, EndDate, DateCreated, Description
  • Leads: OpportunityTitle, ContactID, AffiliateId, UserID, StageID, StatusID, Leadsource, Objection, ProjectedRevenueLow, ProjectedRevenueHigh, OpportunityNotes, DateCreated, LastUpdated, LastUpdatedBy, CreatedBy, EstimatedCloseDate, NextActionDate, NextActionNotes
  • LeadSource: Name, Description, StartDate, EndDate, CostPerLead, Vendor, Medium, Message, LeadSourceCategoryId, Status
  • LeadSourceCategory: Id, Name, Description
  • LeadSourceExpense: LeadSourceRecurringExpenseId, LeadSourceId, Title, Notes, Amount, DateIncurred
  • LeadSourceRecurringExpense: LeadSourceId, Title, Notes, Amount, StartDate, EndDate, NextExpenseDate
  • MtgLead: Dates for AppraisalOrdered, AppraisalDone, Appraisal Received, Title Ordered, Title Received, Rate Locked, Rate Lock Expires, Credit Report, Application, Actual Close, and Funding
  • OrderItem: OrderId, ProductId, SubscriptionPlanId, ItemName, Qty, CPU, PPU, ItemDescription, ItemType, Notes
  • PayPlan: InvoiceId, DateDue, AmtDue, Type, InitDate, StartDate, FirstPayAmt
  • PayPlanItem: PayPlanId, DateDue, AmtDue, Status, AmtPaid
  • Payment: PayDate, UserId, PayAmt, PayType, ContactId, PayNote, InvoiceId, RefundId, ChargeId, Commission, Synced
  • Product: ProductName, ProductPrice, Sku, ShortDescription, Taxable, CountryTaxable, StateTaxable, CityTaxable, Weight, IsPackage, NeedsDigitalDelivery, Description, HideInStore, Status, TopHTML, BottomHTML, ShippingTime, LargeImage, InventoryNotifiee, InventoryLimit, Shippable
  • ProductCategory: CategoryDisplayName, CategoryImage, CategoryOrder, ParentId
  • ProductCategoryAssign: ProductId, ProductCategoryId
  • ProductInterest: ObjectId, ObjType, ProductId, ProductType, Qty, DiscountPercent
  • ProductInterestBundle: BundleName, Description
  • ProductOptValue: ProductOptionId, Label, Sku, IsDefault, Name, OptionIndex, PriceAdjustment
  • ProductOption: ProductId, Label, IsRequired, Order, Name, MaxChars, CanEndWith, MinChars, AllowSpaces, TextMessage, OptionType, CanContain, CanStartWith
  • RecurringOrder: IDs for Contact, Originating Order, Program, Subscription Plan, Product; Start, End, Last Bill, Next Bill, and Paid Thru Dates; BillingCycle; Frequency; BillingAmt; Status; ReasonStopped; AutoCharge; CC1; CC2; NumDaysBetweenRetry; MaxRetry; MerchantAccountId; AffiliateId; PromoCode; LeadAffiliateId; Qty; ShippingOptionId
  • Recurring Order With Contact: RecurringOrderId, ContactId, ProgramId, SubscriptionPlanId, ProductId, StartDate, EndDate, LastBillDate, NextBillDate, PaidThruDate, BillingCycle, Frequency, BillingAmt, Status, ReasonStopped, AutoCharge, CC1, CC2, NumDaysBetweenRetry, MaxRetry, MerchantAccountId, AffiliateId, PromoCode, LeadAffiliateId, Qty, City, Email Addresses, Name(s) Phone Numbers, Signature
  • Referral: ContactId, AffiliateId, DateSet, DateExpires, IPAddress, Source, Info, Type
  • SavedFilter: FilterName, ReportStoredName, UserId
  • Stage: StageName, StageOrder, TargetNumDays
  • StageMove: OpportunityId, MoveDate, MoveToStage, MoveFromStage, PrevStageMoveDate, CreatedBy, DateCreated, UserId
  • Status: StatusName, StatusOrder, TargetNumDays
  • SubscriptionPlan: ProductId, Cycle, Frequency, PreAuthorizeAmount, Prorate, Active, PlanPrice
  • Template: PieceType, PieceTitle, Categories
  • Ticket: IssueId; ContactId; UserId; DevId; Ticket Title, Application, Category, and Type; Summary; Stage; Priority; Ordering; Created, Updated, and Close Dates and people; TargetCompletionDate; DateInStage; TimeSpent; HasCustomerCalled
  • TicketStage: Id, StageName
  • TicketType: Id, CategoryId, Label
  • User: Email Addresses, Name, Phone, Addresses
  • UserGroup: Id, Name, OwnerId

Infusionsoft API Docs!/Account_Info/getAccountProfileUsingGET

You shouldn't need to look at these docs very often.

FAQs + Tips and Tricks

Using Infusionsoft Tags in Grow

There are 2 parts to this. You first have to find the Tag ID in Infusionsoft, and then use that to filter on your metric in Grow. To find the Tag ID, log in to your Infusionsoft account and navigate to the settings tab. On this page, there should be a menu on the left-hand side. Under the heading Contact & Company Settings, click on Tags. Here you will find a list of all the tags you have created or imported. Next to the name of the tag will be the Tag ID. If you want to filter your metrics in Grow based on a specific tag, you'll want to take note of the ID for that specific tag, as that is how Grow pulls tags into your metrics.

In order to filter by Tag ID, log in to Grow and add a new metric. Make sure the column Groups shows up with the tag ID numbers. To filter only the ones that have a specific tag, click on Grow's filter button. In the Column field, select Groups. Set Contains as the operator, then enter the ID value in the Value field. Click Done when you are done. Be careful not to use the operator Equals if you have assigned multiple tags to a contact or other property in Infusionsoft. This will show the properties that only have the one tag (but none others).

Create and Connect to Saved Searches

Log in to your InfusionSoft account and open up the report that you want to use. Under the Options button, click Add to User Home.

Now that it is saved to your user home, go to your InfusionSoft dashboard and find that specific saved report. Once you have found it, select View All Results.

Once you have selected to view the results, you will need to find the Filter ID in the URL. This is the ID you are going to use within the Grow platform to pull this exact report.

Why is my report is returning Error Code 4?

Certain columns will randomly fail to pull in from a saved search. This is an error on the InfusionSoft API that has been broken in InfusionSoft since 2014.

Long story short, there is no fix until InfusionSoft fixes their API. You can get around it by using a different column or trying to create a new saved search with the same parameters. Sometimes when using saved searches from InfusionSoft, certain columns will cause the report data to fail with this error:

faultCode4faultString[DatabaseError]Column not found in resultset:_Return 

or it might look like this:

<?xml version="1.0" encoding="UTF-8"?><methodResponse><fault><value><struct><member><name>faultCode</name><value><i4>4</i4></value></member><member><name>faultString</name><value>[DatabaseError]Column not found in resultset:_Return</value></member></struct></value></fault></methodResponse>

The most important parts of this error are the #4, and the result: [DatabaseError]Column not found in resultset. This is a super frustrating bug because there is nothing that Grow can do about it at the moment. InfusionSoft has bugs in their API, where certain columns will cause data to not return, and fail with this error. Here is a post in the InfusionSoft development forum from 2014 where the suggested solution is to not use the specific column that caused the error. Not a great solution. And here is a forum post from 2015 where it is suggested that you can only modify each saved search once.

There are a few things you can try. You can get around it by using a different column, or pulling in a second report and joining using SQLite. Or you can try creating a new saved search with the same parameters and try that new Id.

We recognize that this is incredibly frustrating. We would encourage you to reach out to InfusionSoft support about this. You can post in their forum here - InfusionSoft Forum

Using Date Parameters with Table Queries

When querying an Infusionsoft table in Grow, you have to do a little work to specify a date range. Once you have selected to use the table query, go ahead and use the Select Columns section to decide what columns to show. You do not need the dates column in order to use the date interpolator. Check the Use Custom SQL Clauses box. Here you will need to add a Where Clause. The Where Clause has two fields: the Column and the Value. A where clause is essentially a filter where x = value. In the Column field, select whichever column has the dates.

The Value portion works very similarly to the date interpolator, with some exceptions:

  • The entire value portion needs to be surrounded in single apostrophes.
  • The operator is surrounded by tildes.
  • The time value includes seconds, in addition to minutes and hours.

For example, to get anything within the last month, I would make this the value:

'~>~ {{date('-1months','YYYY-MM-DD 00:00:00')}}'

This value includes single apostrophes surrounding the entire value ' ' , the greater than operator > surrounded by tildes, and the time in HH:MM:SS format.

Infusionsoft also describes on their documentation what parameters are available for querying.

What is "Error - [DatabaseError]Query took too long and was canceled" error, and how can I address it?

The "Error - [DatabaseError]Query took too long and was canceled" is an error specific to the Infusionsoft API, indicating that the time limit for executing a request has been exceeded. This error occurs when the complexity of the saved query being executed is high. By simplifying and optimizing your queries, you can reduce the likelihood of encountering this error and improve the efficiency of your Infusionsoft API requests.

To address this error, you can follow these steps:

  • Simplify your query: Start with a single condition for your query and test its execution. If it works successfully, gradually add more conditions one by one until you reach a point where the query execution time exceeds the server's time limit.
  • Determine the threshold: When you add and test conditions incrementally, you can identify the complexity level that your search parameters can accommodate while staying within the server's time limits.
  • Optimize your query: Find the balance between query complexity and the desired outcome. Keep track of the execution time for different query configurations and prioritize the most important conditions.
  • Consider alternative approaches: If your query still exceeds the time limit even with optimized conditions, you may need to explore alternative strategies. This could involve breaking down the query into multiple smaller queries, or using different APIs or methods to retrieve the desired information.

Note that after several retries on this error, InfusionSoft temporarily blocks requests related to this saved search by throwing the error "[DatabaseError]Too many consecutive failures. This saved search is temporarily blocked".

Was this article helpful?