diff --git a/packages/backend/src/apps/mailchimp/dynamic-data/index.js b/packages/backend/src/apps/mailchimp/dynamic-data/index.js
new file mode 100644
index 00000000..8ec6b75b
--- /dev/null
+++ b/packages/backend/src/apps/mailchimp/dynamic-data/index.js
@@ -0,0 +1,3 @@
+import listAudiences from './list-audiences/index.js';
+
+export default [listAudiences];
diff --git a/packages/backend/src/apps/mailchimp/dynamic-data/list-audiences/index.js b/packages/backend/src/apps/mailchimp/dynamic-data/list-audiences/index.js
new file mode 100644
index 00000000..05646057
--- /dev/null
+++ b/packages/backend/src/apps/mailchimp/dynamic-data/list-audiences/index.js
@@ -0,0 +1,40 @@
+export default {
+ name: 'List audiences',
+ key: 'listAudiences',
+
+ async run($) {
+ const audiences = {
+ data: [],
+ };
+ let hasMore = false;
+
+ const params = {
+ sort_field: 'date_created',
+ sort_dir: 'DESC',
+ count: 1000,
+ offset: 0,
+ };
+
+ do {
+ const { data } = await $.http.get('/3.0/lists', { params });
+ params.offset = params.offset + params.count;
+
+ if (data?.lists) {
+ for (const audience of data.lists) {
+ audiences.data.push({
+ value: audience.id,
+ name: audience.name,
+ });
+ }
+ }
+
+ if (data.total_items > params.offset) {
+ hasMore = true;
+ } else {
+ hasMore = false;
+ }
+ } while (hasMore);
+
+ return audiences;
+ },
+};
diff --git a/packages/backend/src/apps/mailchimp/index.js b/packages/backend/src/apps/mailchimp/index.js
index 170b3e95..9dd8a71e 100644
--- a/packages/backend/src/apps/mailchimp/index.js
+++ b/packages/backend/src/apps/mailchimp/index.js
@@ -2,6 +2,8 @@ import defineApp from '../../helpers/define-app.js';
import addAuthHeader from './common/add-auth-header.js';
import setBaseUrl from './common/set-base-url.js';
import auth from './auth/index.js';
+import triggers from './triggers/index.js';
+import dynamicData from './dynamic-data/index.js';
export default defineApp({
name: 'Mailchimp',
@@ -14,4 +16,6 @@ export default defineApp({
supportsConnections: true,
beforeRequest: [setBaseUrl, addAuthHeader],
auth,
+ triggers,
+ dynamicData,
});
diff --git a/packages/backend/src/apps/mailchimp/triggers/index.js b/packages/backend/src/apps/mailchimp/triggers/index.js
new file mode 100644
index 00000000..97173907
--- /dev/null
+++ b/packages/backend/src/apps/mailchimp/triggers/index.js
@@ -0,0 +1,3 @@
+import newSubscribers from './new-subscribers/index.js';
+
+export default [newSubscribers];
diff --git a/packages/backend/src/apps/mailchimp/triggers/new-subscribers/index.js b/packages/backend/src/apps/mailchimp/triggers/new-subscribers/index.js
new file mode 100644
index 00000000..9455373b
--- /dev/null
+++ b/packages/backend/src/apps/mailchimp/triggers/new-subscribers/index.js
@@ -0,0 +1,105 @@
+import Crypto from 'crypto';
+import defineTrigger from '../../../../helpers/define-trigger.js';
+
+export default defineTrigger({
+ name: 'New subscribers',
+ key: 'newSubscribers',
+ type: 'webhook',
+ description: 'Triggers when a new subscriber is appended to an audience.',
+ arguments: [
+ {
+ label: 'Audience',
+ key: 'audienceId',
+ type: 'dropdown',
+ required: true,
+ description: '',
+ variables: true,
+ source: {
+ type: 'query',
+ name: 'getDynamicData',
+ arguments: [
+ {
+ name: 'key',
+ value: 'listAudiences',
+ },
+ ],
+ },
+ },
+ ],
+
+ async run($) {
+ const dataItem = {
+ raw: $.request.body,
+ meta: {
+ internalId: Crypto.randomUUID(),
+ },
+ };
+
+ $.pushTriggerItem(dataItem);
+ },
+
+ async testRun($) {
+ const audienceId = $.step.parameters.audienceId;
+
+ const computedWebhookEvent = {
+ data: {
+ id: Crypto.randomUUID(),
+ email: 'user@automatisch.io',
+ ip_opt: '127.0.0.1',
+ merges: {
+ EMAIL: 'user@automatisch.io',
+ FNAME: 'FNAME',
+ LNAME: 'LNAME',
+ PHONE: '',
+ ADDRESS: '',
+ BIRTHDAY: '',
+ },
+ web_id: Crypto.randomUUID(),
+ list_id: audienceId,
+ email_type: 'html',
+ },
+ type: 'subscribe',
+ fired_at: new Date().toLocaleString(),
+ };
+
+ const dataItem = {
+ raw: computedWebhookEvent,
+ meta: {
+ internalId: computedWebhookEvent.id,
+ },
+ };
+
+ $.pushTriggerItem(dataItem);
+ },
+
+ async registerHook($) {
+ const audienceId = $.step.parameters.audienceId;
+
+ const payload = {
+ url: $.webhookUrl,
+ events: {
+ subscribe: true,
+ },
+ sources: {
+ user: true,
+ admin: true,
+ api: true,
+ },
+ };
+
+ const response = await $.http.post(
+ `/3.0/lists/${audienceId}/webhooks`,
+ payload
+ );
+
+ await $.flow.setRemoteWebhookId(response.data.id);
+ },
+
+ async unregisterHook($) {
+ const audienceId = $.step.parameters.audienceId;
+
+ await $.http.delete(
+ `/3.0/lists/${audienceId}/webhooks/${$.flow.remoteWebhookId}`
+ );
+ },
+});
diff --git a/packages/docs/pages/apps/mailchimp/triggers.md b/packages/docs/pages/apps/mailchimp/triggers.md
new file mode 100644
index 00000000..3b3530c2
--- /dev/null
+++ b/packages/docs/pages/apps/mailchimp/triggers.md
@@ -0,0 +1,12 @@
+---
+favicon: /favicons/mailchimp.svg
+items:
+ - name: New subscribers
+ desc: Triggers when a new subscriber is appended to an audience.
+---
+
+
+
+
diff --git a/packages/docs/pages/guide/available-apps.md b/packages/docs/pages/guide/available-apps.md
index 60be7318..e2ace1b9 100644
--- a/packages/docs/pages/guide/available-apps.md
+++ b/packages/docs/pages/guide/available-apps.md
@@ -25,6 +25,7 @@ The following integrations are currently supported by Automatisch.
- [HTTP Request](/apps/http-request/actions)
- [HubSpot](/apps/hubspot/actions)
- [Invoice Ninja](/apps/invoice-ninja/triggers)
+- [Mailchimp](/apps/mailchimp/triggers)
- [MailerLite](/apps/mailerlite/triggers)
- [Mattermost](/apps/mattermost/actions)
- [Miro](/apps/miro/actions)