diff --git a/packages/backend/src/apps/mailchimp/dynamic-data/index.js b/packages/backend/src/apps/mailchimp/dynamic-data/index.js index 8ec6b75b..c9fd2e79 100644 --- a/packages/backend/src/apps/mailchimp/dynamic-data/index.js +++ b/packages/backend/src/apps/mailchimp/dynamic-data/index.js @@ -1,3 +1,4 @@ import listAudiences from './list-audiences/index.js'; +import listCampaigns from './list-campaigns/index.js'; -export default [listAudiences]; +export default [listAudiences, listCampaigns]; diff --git a/packages/backend/src/apps/mailchimp/dynamic-data/list-campaigns/index.js b/packages/backend/src/apps/mailchimp/dynamic-data/list-campaigns/index.js new file mode 100644 index 00000000..ca3f49c2 --- /dev/null +++ b/packages/backend/src/apps/mailchimp/dynamic-data/list-campaigns/index.js @@ -0,0 +1,42 @@ +export default { + name: 'List campaigns', + key: 'listCampaigns', + + async run($) { + const campaigns = { + data: [], + }; + let hasMore = false; + const audienceId = $.step.parameters.audienceId; + + const params = { + list_id: audienceId, + sort_field: 'create_time', + sort_dir: 'DESC', + count: 1000, + offset: 0, + }; + + do { + const { data } = await $.http.get('/3.0/campaigns', { params }); + params.offset = params.offset + params.count; + + if (data?.campaigns) { + for (const campaign of data.campaigns) { + campaigns.data.push({ + value: campaign.id, + name: campaign.settings.title || campaign.settings.subject_line, + }); + } + } + + if (data.total_items > params.offset) { + hasMore = true; + } else { + hasMore = false; + } + } while (hasMore); + + return campaigns; + }, +}; diff --git a/packages/backend/src/apps/mailchimp/triggers/email-opened/index.js b/packages/backend/src/apps/mailchimp/triggers/email-opened/index.js new file mode 100644 index 00000000..16fc4a5c --- /dev/null +++ b/packages/backend/src/apps/mailchimp/triggers/email-opened/index.js @@ -0,0 +1,101 @@ +import defineTrigger from '../../../../helpers/define-trigger.js'; + +export default defineTrigger({ + name: 'Email opened', + key: 'emailOpened', + pollInterval: 15, + description: + 'Triggers when a recipient opens an email as part of a particular campaign.', + arguments: [ + { + label: 'Audience', + key: 'audienceId', + type: 'dropdown', + required: true, + description: '', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listAudiences', + }, + ], + }, + }, + { + label: 'Campaign Type', + key: 'campaignType', + type: 'dropdown', + required: true, + description: '', + variables: true, + options: [ + { + label: 'Campaign', + value: 'campaign', + }, + ], + }, + { + label: 'Campaign', + key: 'campaignId', + type: 'dropdown', + required: true, + dependsOn: ['parameters.audienceId'], + description: '', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listCampaigns', + }, + { + name: 'parameters.audienceId', + value: '{parameters.audienceId}', + }, + ], + }, + }, + ], + + async run($) { + const campaignId = $.step.parameters.campaignId; + let hasMore = false; + + const params = { + count: 1000, + offset: 0, + }; + + do { + const { data } = await $.http.get( + `/3.0/reports/${campaignId}/open-details`, + { params } + ); + params.offset = params.offset + params.count; + + if (data.members?.length) { + for (const member of data.members) { + $.pushTriggerItem({ + raw: member, + meta: { + internalId: member.email_id, + }, + }); + } + } + + if (data.total_items > params.offset) { + hasMore = true; + } else { + hasMore = false; + } + } while (hasMore); + }, +}); diff --git a/packages/backend/src/apps/mailchimp/triggers/index.js b/packages/backend/src/apps/mailchimp/triggers/index.js index ec7f4fa0..d659e315 100644 --- a/packages/backend/src/apps/mailchimp/triggers/index.js +++ b/packages/backend/src/apps/mailchimp/triggers/index.js @@ -1,4 +1,5 @@ +import emailOpened from './email-opened/index.js'; import newSubscribers from './new-subscribers/index.js'; import newUnsubscribers from './new-unsubscribers/index.js'; -export default [newSubscribers, newUnsubscribers]; +export default [emailOpened, newSubscribers, newUnsubscribers]; diff --git a/packages/docs/pages/apps/mailchimp/triggers.md b/packages/docs/pages/apps/mailchimp/triggers.md index 54ceb6ca..cf303bfe 100644 --- a/packages/docs/pages/apps/mailchimp/triggers.md +++ b/packages/docs/pages/apps/mailchimp/triggers.md @@ -1,6 +1,8 @@ --- favicon: /favicons/mailchimp.svg items: + - name: Email opened + desc: Triggers when a recipient opens an email as part of a particular campaign. - name: New subscribers desc: Triggers when a new subscriber is appended to an audience. - name: New unsubscribers