Exporting campaign account CSVs from VTiger using SQL
Update: Related post for exporting contacts instead of accounts
Although VTiger works great as CRM, its campaign management feature is missing one of most important features: It doesn’t support exporting
This post aims to provide technically oriented users a guide on how to use SQL queries to perform that task. We assume basic knowledge of SQL syntax, MySQL and PHPMyAdmin.
The goal for our example is to export a table of Account name and E-Mail. For the email, the primary email will be used, unless it’s empty in which case the secondary email is used.
The input for the query is the campaign name (in our example, this will be MyCampaign
).
Querying the campaign number
The campaign number is a string, e.g. CAM4
or CAM9
which is stored in vtiger_campaign
.
SELECT campaign_no FROM vtiger_campaign WHERE `campaignname` = "MyCampaign"
Finding the campaign record ID
In the campaign account relations n-to-n relations table, the campaign number is not used directly - instead, the campaign record ID is used. We need to query that from vtiger_modtracker_detail
, which contain metadata key-value-data about the campaigns (among other things). One of the K-V pairs contain the campaign identifier (key campaign_no
) whereas another one contains the record ID (key record_id
).
SELECT postvalue FROM `vtiger_modtracker_detail` WHERE `id` = (SELECT `id` FROM `vtiger_modtracker_detail` WHERE postvalue = <<campaign number>> and fieldname = "campaign_no") AND fieldname = "record_id"
Full query:
SELECT postvalue FROM `vtiger_modtracker_detail` WHERE `id` = (SELECT `id` FROM `vtiger_modtracker_detail` WHERE postvalue = (SELECT campaign_no FROM vtiger_campaign WHERE `campaignname` = "MyCampaign") and fieldname = "campaign_no") AND fieldname = "record_id"
The result of this query is the numeric campaign record ID, e.g. 315
.
Querying campaign-to-account relations
We can now use the campaign record ID to query the n-to-n table vtiger_campaignaccountrel
. There are other, similar tables for leads (vtiger_campaignleadrel
) and contacts (vtiger_campaigncontrel
).
SELECT accountid FROM vtiger_campaignaccountrel WHERE `campaignid` = <<campaign record ID>>
Full query:
SELECT accountid FROM vtiger_campaignaccountrel WHERE `campaignid` = (SELECT postvalue FROM `vtiger_modtracker_detail` WHERE fieldname = "record_id" AND `id` = (SELECT `id` FROM `vtiger_modtracker_detail` WHERE postvalue = (SELECT campaign_no FROM vtiger_campaign WHERE `campaignname` = "MyCampaign") and fieldname = "campaign_no"))
The result of this query is a list of account IDs related to the campaign. The order is usually the same as displayed in VTiger.
Querying account information
Using the list of account IDs, we can JOIN
on vtiger_account
to query the account details. Note that you need to use the appropriate table for leads or contacts if you used an alternative relations table in the previous step.
SELECT acc.accountname AS "Name", COALESCE(acc.email1, acc.email2) AS "EMail" FROM vtiger_campaignaccountrel AS car JOIN vtiger_account acc ON (acc.accountid = car.accountid) WHERE `campaignid` =(SELECT postvalue FROM `vtiger_modtracker_detail` WHERE fieldname = "record_id" AND `id` = (SELECT `id` FROM `vtiger_modtracker_detail` WHERE postvalue = (SELECT campaign_no FROM vtiger_campaign WHERE `campaignname` = "MyCampaign") and fieldname = "campaign_no")) AND (acc.email1 <> '' OR acc.email2 <> '')
Note that besides the SELECT
column list there are some aspects which are specific to the Name and Email query:
COALESCE(acc.email1, acc.email2)
usesemail2
ifemail1
is emptyAND (email1 <> '' OR email2 <> '')
ignores accounts that have neitheremail1
noremail2
set
If you want a custom list of columns, you need to modify that appropriately.
Exporting CSV
When entering the query into a tool like PHPMyAdmin, you can click the Export button in order to export the result to different formats, including CSV and Excel.
While this might not be the most convenient option, it’s a very flexible way of generating and exporting the data. Any more convenient ways are likely to be less flexible.