diff --git a/packages/backend/src/apps/surveymonkey/dynamic-data/index.js b/packages/backend/src/apps/surveymonkey/dynamic-data/index.js
new file mode 100644
index 00000000..5082bd6e
--- /dev/null
+++ b/packages/backend/src/apps/surveymonkey/dynamic-data/index.js
@@ -0,0 +1,3 @@
+import listSurveys from './list-surveys/index.js';
+
+export default [listSurveys];
diff --git a/packages/backend/src/apps/surveymonkey/dynamic-data/list-surveys/index.js b/packages/backend/src/apps/surveymonkey/dynamic-data/list-surveys/index.js
new file mode 100644
index 00000000..5f67dbed
--- /dev/null
+++ b/packages/backend/src/apps/surveymonkey/dynamic-data/list-surveys/index.js
@@ -0,0 +1,38 @@
+export default {
+ name: 'List surveys',
+ key: 'listSurveys',
+
+ async run($) {
+ const surveys = {
+ data: [],
+ };
+
+ const params = {
+ page: 1,
+ per_page: 100,
+ sort_by: 'date_modified',
+ sort_order: 'DESC',
+ };
+
+ let fetchedSum = 0;
+ let total;
+ do {
+ const { data } = await $.http.get(`/v3/surveys`, { params });
+
+ params.page = params.page + 1;
+ fetchedSum = fetchedSum + params.per_page;
+ total = data.total;
+
+ if (data.data) {
+ for (const survey of data.data) {
+ surveys.data.push({
+ value: survey.id,
+ name: survey.title,
+ });
+ }
+ }
+ } while (fetchedSum <= total);
+
+ return surveys;
+ },
+};
diff --git a/packages/backend/src/apps/surveymonkey/index.js b/packages/backend/src/apps/surveymonkey/index.js
index 25292244..6c6f3bf0 100644
--- a/packages/backend/src/apps/surveymonkey/index.js
+++ b/packages/backend/src/apps/surveymonkey/index.js
@@ -2,6 +2,8 @@ import defineApp from '../../helpers/define-app.js';
import addAuthHeader from './common/add-auth-header.js';
import auth from './auth/index.js';
import setBaseUrl from './common/set-base-url.js';
+import triggers from './triggers/index.js';
+import dynamicData from './dynamic-data/index.js';
export default defineApp({
name: 'SurveyMonkey',
@@ -14,4 +16,6 @@ export default defineApp({
supportsConnections: true,
beforeRequest: [setBaseUrl, addAuthHeader],
auth,
+ triggers,
+ dynamicData,
});
diff --git a/packages/backend/src/apps/surveymonkey/triggers/index.js b/packages/backend/src/apps/surveymonkey/triggers/index.js
new file mode 100644
index 00000000..2cdfa99b
--- /dev/null
+++ b/packages/backend/src/apps/surveymonkey/triggers/index.js
@@ -0,0 +1,3 @@
+import newResponseNotification from './new-response-notification/index.js';
+
+export default [newResponseNotification];
diff --git a/packages/backend/src/apps/surveymonkey/triggers/new-response-notification/index.js b/packages/backend/src/apps/surveymonkey/triggers/new-response-notification/index.js
new file mode 100644
index 00000000..92e2ba3b
--- /dev/null
+++ b/packages/backend/src/apps/surveymonkey/triggers/new-response-notification/index.js
@@ -0,0 +1,78 @@
+import Crypto from 'crypto';
+import isEmpty from 'lodash/isEmpty.js';
+import defineTrigger from '../../../../helpers/define-trigger.js';
+
+export default defineTrigger({
+ name: 'New response notification',
+ key: 'newResponseNotification',
+ type: 'webhook',
+ description: 'Triggers a notification upon the completion of your survey.',
+ arguments: [
+ {
+ label: 'Survey',
+ key: 'surveyId',
+ type: 'dropdown',
+ required: true,
+ description: '',
+ variables: true,
+ source: {
+ type: 'query',
+ name: 'getDynamicData',
+ arguments: [
+ {
+ name: 'key',
+ value: 'listSurveys',
+ },
+ ],
+ },
+ },
+ ],
+
+ async run($) {
+ const dataItem = {
+ raw: $.request.body,
+ meta: {
+ internalId: Crypto.randomUUID(),
+ },
+ };
+
+ $.pushTriggerItem(dataItem);
+ },
+
+ async testRun($) {
+ const lastExecutionStep = await $.getLastExecutionStep();
+
+ if (!isEmpty(lastExecutionStep?.dataOut)) {
+ $.pushTriggerItem({
+ raw: lastExecutionStep.dataOut,
+ meta: {
+ internalId: '',
+ },
+ });
+ }
+ },
+
+ async registerHook($) {
+ const surveyId = $.step.parameters.surveyId;
+
+ const body = JSON.stringify({
+ name: $.flow.id,
+ subscription_url: $.webhookUrl,
+ event_type: 'response_completed',
+ object_type: 'survey',
+ object_ids: [surveyId],
+ });
+
+ const { data } = await $.http.post('/v3/webhooks?bypass_ping=true', body, {
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+
+ await $.flow.setRemoteWebhookId(data.id);
+ },
+
+ async unregisterHook($) {
+ await $.http.delete(`/v3/webhooks/${$.flow.remoteWebhookId}`);
+ },
+});
diff --git a/packages/docs/pages/apps/surveymonkey/triggers.md b/packages/docs/pages/apps/surveymonkey/triggers.md
new file mode 100644
index 00000000..71f8f422
--- /dev/null
+++ b/packages/docs/pages/apps/surveymonkey/triggers.md
@@ -0,0 +1,12 @@
+---
+favicon: /favicons/surveymonkey.svg
+items:
+ - name: New response notification
+ desc: Triggers a notification upon the completion of your survey.
+---
+
+
+
+
diff --git a/packages/docs/pages/guide/available-apps.md b/packages/docs/pages/guide/available-apps.md
index ad2b4c0c..502df55c 100644
--- a/packages/docs/pages/guide/available-apps.md
+++ b/packages/docs/pages/guide/available-apps.md
@@ -46,6 +46,7 @@ The following integrations are currently supported by Automatisch.
- [Spotify](/apps/spotify/actions)
- [Strava](/apps/strava/actions)
- [Stripe](/apps/stripe/triggers)
+- [SurveyMonkey](/apps/surveymonkey/triggers)
- [Telegram](/apps/telegram-bot/actions)
- [Todoist](/apps/todoist/triggers)
- [Trello](/apps/trello/actions)