diff --git a/packages/backend/src/apps/asana/dynamic-data/index.js b/packages/backend/src/apps/asana/dynamic-data/index.js
new file mode 100644
index 00000000..749767f2
--- /dev/null
+++ b/packages/backend/src/apps/asana/dynamic-data/index.js
@@ -0,0 +1,3 @@
+import listWorkspaces from './list-workspaces/index.js';
+
+export default [listWorkspaces];
diff --git a/packages/backend/src/apps/asana/dynamic-data/list-workspaces/index.js b/packages/backend/src/apps/asana/dynamic-data/list-workspaces/index.js
new file mode 100644
index 00000000..0a6e2923
--- /dev/null
+++ b/packages/backend/src/apps/asana/dynamic-data/list-workspaces/index.js
@@ -0,0 +1,34 @@
+export default {
+ name: 'List workspaces',
+ key: 'listWorkspaces',
+
+ async run($) {
+ const workspaces = {
+ data: [],
+ };
+
+ const params = {
+ limit: 100,
+ offset: undefined,
+ };
+
+ do {
+ const {
+ data: { data, next_page },
+ } = await $.http.get('/1.0/workspaces', { params });
+
+ params.offset = next_page?.offset;
+
+ if (data) {
+ for (const workspace of data) {
+ workspaces.data.push({
+ value: workspace.gid,
+ name: workspace.name,
+ });
+ }
+ }
+ } while (params.offset);
+
+ return workspaces;
+ },
+};
diff --git a/packages/backend/src/apps/asana/index.js b/packages/backend/src/apps/asana/index.js
index 3e287342..ca4f41ca 100644
--- a/packages/backend/src/apps/asana/index.js
+++ b/packages/backend/src/apps/asana/index.js
@@ -1,6 +1,8 @@
import defineApp from '../../helpers/define-app.js';
import addAuthHeader from './common/add-auth-header.js';
import auth from './auth/index.js';
+import dynamicData from './dynamic-data/index.js';
+import triggers from './triggers/index.js';
export default defineApp({
name: 'Asana',
@@ -13,4 +15,6 @@ export default defineApp({
supportsConnections: true,
beforeRequest: [addAuthHeader],
auth,
+ dynamicData,
+ triggers,
});
diff --git a/packages/backend/src/apps/asana/triggers/index.js b/packages/backend/src/apps/asana/triggers/index.js
new file mode 100644
index 00000000..e8bf262f
--- /dev/null
+++ b/packages/backend/src/apps/asana/triggers/index.js
@@ -0,0 +1,3 @@
+import newProjects from './new-projects/index.js';
+
+export default [newProjects];
diff --git a/packages/backend/src/apps/asana/triggers/new-projects/index.js b/packages/backend/src/apps/asana/triggers/new-projects/index.js
new file mode 100644
index 00000000..1ef025f5
--- /dev/null
+++ b/packages/backend/src/apps/asana/triggers/new-projects/index.js
@@ -0,0 +1,59 @@
+import defineTrigger from '../../../../helpers/define-trigger.js';
+
+export default defineTrigger({
+ name: 'New projects',
+ key: 'newProjects',
+ pollInterval: 15,
+ description: 'Triggers when a new project is created.',
+ arguments: [
+ {
+ label: 'Workspace',
+ key: 'workspaceId',
+ type: 'dropdown',
+ required: true,
+ description: '',
+ variables: true,
+ source: {
+ type: 'query',
+ name: 'getDynamicData',
+ arguments: [
+ {
+ name: 'key',
+ value: 'listWorkspaces',
+ },
+ ],
+ },
+ },
+ ],
+
+ async run($) {
+ const workspaceId = $.step.parameters.workspaceId;
+
+ const params = {
+ limit: 100,
+ offset: undefined,
+ workspace: workspaceId,
+ };
+
+ do {
+ const {
+ data: { data, next_page },
+ } = await $.http.get('/1.0/projects', {
+ params,
+ });
+
+ params.offset = next_page?.offset;
+
+ if (data) {
+ for (const project of data) {
+ $.pushTriggerItem({
+ raw: project,
+ meta: {
+ internalId: project.gid,
+ },
+ });
+ }
+ }
+ } while (params.offset);
+ },
+});
diff --git a/packages/docs/pages/apps/asana/triggers.md b/packages/docs/pages/apps/asana/triggers.md
new file mode 100644
index 00000000..8c8b7aba
--- /dev/null
+++ b/packages/docs/pages/apps/asana/triggers.md
@@ -0,0 +1,12 @@
+---
+favicon: /favicons/asana.svg
+items:
+ - name: New projects
+ desc: Triggers when a new project is created.
+---
+
+
+
+
diff --git a/packages/docs/pages/guide/available-apps.md b/packages/docs/pages/guide/available-apps.md
index ad2b4c0c..09ac4e59 100644
--- a/packages/docs/pages/guide/available-apps.md
+++ b/packages/docs/pages/guide/available-apps.md
@@ -4,6 +4,7 @@ The following integrations are currently supported by Automatisch.
- [Airtable](/apps/airtable/actions)
- [Appwrite](/apps/appwrite/triggers)
+- [Asana](/apps/asana/triggers)
- [Carbone](/apps/carbone/actions)
- [Datastore](/apps/datastore/actions)
- [DeepL](/apps/deepl/actions)