Workflow n8n

Automatisation n8n : importation de notes Productboard dans Snowflake

  • Ce workflow n8n a pour objectif d'automatiser l'importation des notes, entreprises et fonctionnalités depuis Productboard vers Snowflake. Dans un contexte où la gestion des données est cruciale pour les équipes produit, ce processus permet de centraliser les informations et d'améliorer la prise de décision. Les entreprises qui utilisent Productboard pour la gestion de leurs fonctionnalités peuvent ainsi bénéficier d'une synchronisation fluide avec leur entrepôt de données Snowflake, facilitant l'analyse et le reporting.
  • Le déroulé du workflow commence par une récupération des données via des requêtes HTTP pour obtenir les entreprises et les notes de Productboard. Ensuite, des étapes de mappage manuel permettent d'ajuster les données avant leur traitement. Les fonctionnalités sont ensuite extraites et combinées avec les notes correspondantes. Les données sont ensuite mises à jour dans Snowflake à travers plusieurs opérations de création et de mise à jour, garantissant que l'entrepôt de données est toujours à jour. Les étapes de nettoyage des tables précédentes assurent que seules les données pertinentes sont conservées.
  • En mettant en place ce workflow, les entreprises peuvent réduire le temps consacré à la gestion manuelle des données, minimiser les erreurs et garantir une meilleure intégrité des informations. Cela permet également d'accélérer le processus de prise de décision en fournissant des données à jour et fiables aux équipes concernées.
Tags clés :automatisationProductboardSnowflakedata integrationworkflow
Catégorie: Manual · Tags: automatisation, Productboard, Snowflake, data integration, workflow0

Workflow n8n Productboard, Snowflake, data integration : vue d'ensemble

Schéma des nœuds et connexions de ce workflow n8n, généré à partir du JSON n8n.

Workflow n8n Productboard, Snowflake, data integration : détail des nœuds

  • Sticky Note1

    Ce noeud crée une note autocollante avec des paramètres de couleur, de taille et de contenu.

  • Manual mapping feature

    Ce noeud permet de définir manuellement des mappages de champs pour le traitement des données.

  • get productboard companies

    Ce noeud effectue une requête HTTP pour récupérer les entreprises de Productboard.

  • Manual mapping companies

    Ce noeud permet de définir manuellement des mappages de champs pour les entreprises.

  • get productboard notes

    Ce noeud effectue une requête HTTP pour récupérer les notes de Productboard.

  • Manual mapping notes

    Ce noeud permet de définir manuellement des mappages de champs pour les notes.

  • Split features

    Ce noeud divise les données en fonction d'un champ spécifié.

  • Split companies

    Ce noeud divise les données des entreprises en fonction d'un champ spécifié.

  • Split notes

    Ce noeud divise les notes en fonction d'un champ spécifié.

  • Split features in notes

    Ce noeud divise les fonctionnalités dans les notes selon des critères définis.

  • Combine Feature ID + Note ID

    Ce noeud permet de combiner les identifiants de fonctionnalités et de notes.

  • get productboard features

    Ce noeud effectue une requête HTTP pour récupérer les fonctionnalités de Productboard.

  • Update Productboard Notes

    Ce noeud met à jour les notes dans la base de données Snowflake.

  • Empty Table Productboard Notes

    Ce noeud vide la table des notes dans la base de données Snowflake.

  • [CREATE] PRODUCTBOARD_NOTES

    Ce noeud crée de nouvelles notes dans la base de données Snowflake.

  • [CREATE] PRODUCTBOARD_COMPANIES

    Ce noeud crée de nouvelles entreprises dans la base de données Snowflake.

  • Update Productboard Companies

    Ce noeud met à jour les entreprises dans la base de données Snowflake.

  • Manual mapping companies db

    Ce noeud permet de définir manuellement des mappages de champs pour les entreprises dans la base de données.

  • Manual mapping notes db

    Ce noeud permet de définir manuellement des mappages de champs pour les notes dans la base de données.

  • Empty Table Productboard Companies

    Ce noeud vide la table des entreprises dans la base de données Snowflake.

  • [CREATE] PRODUCTBOARD_NOTES_FEATURES

    Ce noeud crée de nouvelles associations entre notes et fonctionnalités dans la base de données Snowflake.

  • Manual mapping feature note IDs db

    Ce noeud permet de définir manuellement des mappages d'identifiants de notes et de fonctionnalités dans la base de données.

  • Update Productboard Note and Feature IDs

    Ce noeud met à jour les identifiants de notes et de fonctionnalités dans la base de données Snowflake.

  • Empty Table Productboard Note and Feature IDs

    Ce noeud vide la table des identifiants de notes et de fonctionnalités dans la base de données Snowflake.

  • Loop Over Items notes

    Ce noeud permet de traiter les notes en les divisant en lots.

  • Loop Over Items features notes

    Ce noeud permet de traiter les fonctionnalités en les divisant en lots.

  • [CREATE] PRODUCTBOARD_FEATURES

    Ce noeud crée de nouvelles fonctionnalités dans la base de données Snowflake.

  • Empty Table Productboard Features

    Ce noeud vide la table des fonctionnalités dans la base de données Snowflake.

  • Loop Over Items features

    Ce noeud permet de traiter les fonctionnalités en les divisant en lots.

  • Manual mapping features db

    Ce noeud permet de définir manuellement des mappages de champs pour les fonctionnalités dans la base de données.

  • Update Productboard Features

    Ce noeud met à jour les fonctionnalités dans la base de données Snowflake.

  • Schedule Trigger

    Ce noeud déclenche le workflow selon un calendrier défini.

  • Slack

    Ce noeud envoie un message sur Slack avec le contenu spécifié.

  • Count Notes Last 7 days and Unprocessed

    Ce noeud exécute une requête pour compter les notes des 7 derniers jours et celles non traitées.

  • Sticky Note2

    Ce noeud crée une seconde note autocollante avec des paramètres de couleur, de taille et de contenu.

Inscris-toi pour voir l'intégralité du workflow

Inscription gratuite

S'inscrire gratuitementBesoin d'aide ?
{
  "meta": {
    "instanceId": "21b41c2deb1c9e3f543253a0aa6a6e2c7bd7ef6bab90ffd478aa947c17d3b352",
    "templateCredsSetupCompleted": true
  },
  "name": "Import Productboard Notes, Companies and Features into Snowflake",
  "tags": [
    {
      "id": "6Ek7V8f4xbM9vWLj",
      "name": "linear",
      "createdAt": "2024-11-08T12:12:15.330Z",
      "updatedAt": "2024-11-08T12:12:15.330Z"
    },
    {
      "id": "XpcIJ8IHNenz3bWz",
      "name": "productboard",
      "createdAt": "2024-11-08T12:12:17.249Z",
      "updatedAt": "2024-11-08T12:12:17.249Z"
    },
    {
      "id": "17",
      "name": "snowflake",
      "createdAt": "2023-09-18T17:05:02.756Z",
      "updatedAt": "2023-09-18T17:05:02.756Z"
    }
  ],
  "nodes": [
    {
      "id": "adcb71e4-880b-4c19-acbb-0708ae4af95f",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        5620,
        1440
      ],
      "parameters": {
        "color": 5,
        "width": 442.66083354762577,
        "height": 155.09952210536395,
        "content": "## Preview Slack Message\n:productboard: Weekly Update in :snowflake_logo: Completed\n27 new insights added in the last 7 days.\n88 insights remain unprocessed.\nYou can view the updated :metabase: dashboard below:\n<link metabase>\n"
      },
      "typeVersion": 1
    },
    {
      "id": "8a590e59-cbcd-43f3-a0de-7c1391661fcf",
      "name": "Manual mapping feature",
      "type": "n8n-nodes-base.set",
      "position": [
        4380,
        -180
      ],
      "parameters": {
        "fields": {
          "values": [
            {
              "name": "feature_id",
              "stringValue": "={{ $json.id }}"
            },
            {
              "name": "feature_name",
              "stringValue": "={{ $json.name }}"
            },
            {
              "name": "feature_status",
              "stringValue": "={{ $json.status.name }}"
            },
            {
              "name": "feature_start_date",
              "stringValue": "={{ $json.timeframe.startDate }}"
            },
            {
              "name": "feature_end_date",
              "stringValue": "={{ $json.timeframe.endDate }}"
            },
            {
              "name": "feature_owner",
              "stringValue": "={{ $json.owner.email }}"
            },
            {
              "name": "feature_created_at",
              "stringValue": "={{ $json.createdAt }}"
            }
          ]
        },
        "include": "none",
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "ca339c8f-71c0-432f-88ef-595b9bc24b98",
      "name": "get productboard companies",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        4060,
        220
      ],
      "parameters": {
        "url": "https://api.productboard.com/companies",
        "options": {
          "pagination": {
            "pagination": {
              "nextURL": "={{ $response.body[\"links\"][\"next\"] }}",
              "paginationMode": "responseContainsNextURL",
              "requestInterval": 2000,
              "completeExpression": "={{ $response.body[\"links\"][\"next\"] === null }}",
              "paginationCompleteWhen": "other"
            }
          }
        },
        "sendHeaders": true,
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            },
            {
              "name": "X-Version",
              "value": "1"
            }
          ]
        }
      },
      "credentials": {
        "httpHeaderAuth": {
          "id": "Z0ptr85smbBZBIYx",
          "name": "Productboard"
        }
      },
      "typeVersion": 4.1,
      "alwaysOutputData": true
    },
    {
      "id": "ba15244b-4311-4045-8087-47f05bea427e",
      "name": "Manual mapping companies",
      "type": "n8n-nodes-base.set",
      "position": [
        4760,
        220
      ],
      "parameters": {
        "fields": {
          "values": [
            {
              "name": "company_id",
              "stringValue": "={{ $json.id }}"
            },
            {
              "name": "company_name",
              "stringValue": "={{ $json.name }}"
            },
            {
              "name": "company_domain",
              "stringValue": "={{ $json.domain }}"
            }
          ]
        },
        "include": "none",
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "d7c491cf-6545-40e1-9ee5-429e4f6b8cb4",
      "name": "get productboard notes",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        4500,
        640
      ],
      "parameters": {
        "url": " https://api.productboard.com/notes",
        "options": {
          "pagination": {
            "pagination": {
              "parameters": {
                "parameters": [
                  {
                    "name": "pageCursor",
                    "value": "={{ $response.body.pageCursor }}"
                  }
                ]
              },
              "requestInterval": 2000,
              "completeExpression": "={{ $response.body.pageCursor === null }}",
              "paginationCompleteWhen": "other"
            }
          }
        },
        "sendHeaders": true,
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            },
            {
              "name": "X-Version",
              "value": "1"
            }
          ]
        }
      },
      "credentials": {
        "httpHeaderAuth": {
          "id": "Z0ptr85smbBZBIYx",
          "name": "Productboard"
        }
      },
      "typeVersion": 4.1
    },
    {
      "id": "beeb2cfc-c017-4691-b92f-ee10b943b08d",
      "name": "Manual mapping notes",
      "type": "n8n-nodes-base.set",
      "position": [
        5200,
        640
      ],
      "parameters": {
        "fields": {
          "values": [
            {
              "name": "note_id",
              "stringValue": "={{ $json.id }}"
            },
            {
              "name": "note_title",
              "stringValue": "={{ $json.title }}"
            },
            {
              "name": "note_state",
              "stringValue": "={{ $json.state }}"
            },
            {
              "name": "note_company_id",
              "stringValue": "={{ $json.company.id }}"
            },
            {
              "name": "note_source",
              "stringValue": "={{ $json.source.origin }}"
            },
            {
              "name": "note_content",
              "stringValue": "={{ $json.content }}"
            },
            {
              "name": "note_created_at",
              "stringValue": "={{ $json.createdAt }}"
            },
            {
              "name": "note_created_by",
              "stringValue": "={{ $json.createdBy.name }}"
            },
            {
              "name": "note_owner",
              "stringValue": "={{ $json.owner.name }}"
            },
            {
              "name": "note_url",
              "stringValue": "={{ $json.displayUrl }}"
            }
          ]
        },
        "include": "none",
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "770df012-b5a0-49f9-9614-8988c2436c34",
      "name": "Split features",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        3920,
        -180
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "data"
      },
      "typeVersion": 1
    },
    {
      "id": "910e27f0-b910-415e-a171-5c6cfce07dc4",
      "name": "Split companies",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        4300,
        220
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "data"
      },
      "typeVersion": 1
    },
    {
      "id": "f57f3865-8970-4771-aee6-2e656215b13e",
      "name": "Split notes",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        4740,
        640
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "data"
      },
      "typeVersion": 1
    },
    {
      "id": "d3939c15-9523-49c1-93ba-7942d37a0ec0",
      "name": "Split features in notes",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        5400,
        900
      ],
      "parameters": {
        "include": "selectedOtherFields",
        "options": {},
        "fieldToSplitOut": "features",
        "fieldsToInclude": "id"
      },
      "typeVersion": 1
    },
    {
      "id": "bde6dc0c-6104-4b84-8c09-33dbe0cfe69f",
      "name": "Combine Feature ID + Note ID",
      "type": "n8n-nodes-base.set",
      "position": [
        5640,
        900
      ],
      "parameters": {
        "fields": {
          "values": [
            {
              "name": "note_id",
              "stringValue": "={{ $json.id }}"
            },
            {
              "name": "feature_id",
              "stringValue": "={{ $json.features.id }}"
            }
          ]
        },
        "include": "none",
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "b47db956-ec4f-4342-b973-aa3277e397f2",
      "name": "get productboard features",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        3680,
        -180
      ],
      "parameters": {
        "url": "https://api.productboard.com/features",
        "options": {
          "pagination": {
            "pagination": {
              "nextURL": "={{ $response.body[\"links\"][\"next\"] }}",
              "paginationMode": "responseContainsNextURL",
              "requestInterval": 3000,
              "completeExpression": "={{ $response.body[\"links\"][\"next\"] === null }}",
              "paginationCompleteWhen": "other"
            }
          }
        },
        "sendHeaders": true,
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            },
            {
              "name": "X-Version",
              "value": "1"
            }
          ]
        }
      },
      "credentials": {
        "httpHeaderAuth": {
          "id": "Z0ptr85smbBZBIYx",
          "name": "Productboard"
        }
      },
      "typeVersion": 4.1
    },
    {
      "id": "ef3cd766-3887-4d6b-981b-d8e72a06a655",
      "name": "Update Productboard Notes",
      "type": "n8n-nodes-base.snowflake",
      "position": [
        5940,
        660
      ],
      "parameters": {
        "table": "PRODUCTBOARD_NOTES",
        "columns": "NOTE_ID,NOTE_TITLE,NOTE_STATE,NOTE_COMPANY_ID,NOTE_SOURCE,NOTE_CONTENT,NOTE_CREATED_BY,NOTE_OWNER,NOTE_CREATED_AT,NOTE_URL"
      },
      "credentials": {
        "snowflake": {
          "id": "81",
          "name": "Snowflake"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "8dc03797-1ac9-47a8-8e4c-e85e9539b091",
      "name": "Empty Table Productboard Notes",
      "type": "n8n-nodes-base.snowflake",
      "position": [
        4260,
        640
      ],
      "parameters": {
        "query": "TRUNCATE TABLE PRODUCTBOARD_NOTES;",
        "operation": "executeQuery"
      },
      "credentials": {
        "snowflake": {
          "id": "81",
          "name": "Snowflake"
        }
      },
      "executeOnce": true,
      "typeVersion": 1
    },
    {
      "id": "9d5a6d6f-a672-48b0-baf8-67b608690d28",
      "name": "[CREATE] PRODUCTBOARD_NOTES",
      "type": "n8n-nodes-base.snowflake",
      "position": [
        3280,
        1140
      ],
      "parameters": {
        "query": "CREATE OR REPLACE TABLE PRODUCTBOARD_NOTES (\n    note_id STRING NOT NULL,\n    note_title STRING,\n    note_state STRING,\n    note_company_id STRING,\n    note_source STRING,\n    note_content STRING,\n    note_created_by STRING,\n    note_owner STRING,\n    note_url STRING,\n    note_created_at TIMESTAMP_NTZ\n);",
        "operation": "executeQuery"
      },
      "credentials": {
        "snowflake": {
          "id": "81",
          "name": "Snowflake"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "ea27f38b-3199-46aa-959f-9c1502898696",
      "name": "[CREATE] PRODUCTBOARD_COMPANIES",
      "type": "n8n-nodes-base.snowflake",
      "position": [
        3520,
        1140
      ],
      "parameters": {
        "query": "CREATE OR REPLACE TABLE PRODUCTBOARD_COMPANIES (\n    company_id STRING NOT NULL,\n    company_name STRING,\n    company_domain STRING\n);",
        "operation": "executeQuery"
      },
      "credentials": {
        "snowflake": {
          "id": "81",
          "name": "Snowflake"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "7bb94678-d106-4b77-8a96-4c598b057d09",
      "name": "Update Productboard Companies",
      "type": "n8n-nodes-base.snowflake",
      "position": [
        5280,
        220
      ],
      "parameters": {
        "table": "PRODUCTBOARD_COMPANIES",
        "columns": "COMPANY_ID,COMPANY_NAME,COMPANY_DOMAIN"
      },
      "credentials": {
        "snowflake": {
          "id": "81",
          "name": "Snowflake"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "86128f9b-8b16-4dc0-bdf5-1bab946716e2",
      "name": "Manual mapping companies db",
      "type": "n8n-nodes-base.set",
      "position": [
        5020,
        220
      ],
      "parameters": {
        "fields": {
          "values": [
            {
              "name": "COMPANY_ID",
              "stringValue": "={{ $json.company_id }}"
            },
            {
              "name": "COMPANY_NAME",
              "stringValue": "={{ $json.company_name }}"
            },
            {
              "name": "COMPANY_DOMAIN",
              "stringValue": "={{ $json.company_domain }}"
            }
          ]
        },
        "include": "none",
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "dd2a3264-4171-43af-9409-ad2e79091bfb",
      "name": "Manual mapping notes db",
      "type": "n8n-nodes-base.set",
      "position": [
        5720,
        660
      ],
      "parameters": {
        "fields": {
          "values": [
            {
              "name": "NOTE_ID",
              "stringValue": "={{ $json.note_id }}"
            },
            {
              "name": "NOTE_TITLE",
              "stringValue": "={{ $json.note_title }}"
            },
            {
              "name": "NOTE_STATE",
              "stringValue": "={{ $json.note_state }}"
            },
            {
              "name": "NOTE_COMPANY_ID",
              "stringValue": "={{ $json.note_company_id }}"
            },
            {
              "name": "NOTE_CONTENT",
              "stringValue": "={{ $json.note_content }}"
            },
            {
              "name": "NOTE_CREATED_BY",
              "stringValue": "={{ $json.note_created_by }}"
            },
            {
              "name": "NOTE_CREATED_AT",
              "stringValue": "={{ $json.note_created_at }}"
            },
            {
              "name": "NOTE_SOURCE",
              "stringValue": "={{ $json.note_source }}"
            },
            {
              "name": "NOTE_OWNER",
              "stringValue": "={{ $json.note_owner }}"
            },
            {
              "name": "NOTE_URL",
              "stringValue": "={{ $json.note_url }}"
            }
          ]
        },
        "include": "none",
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "d163879a-6020-4ace-b3ea-36c3d7b3675a",
      "name": "Empty Table Productboard Companies",
      "type": "n8n-nodes-base.snowflake",
      "position": [
        3820,
        220
      ],
      "parameters": {
        "query": "TRUNCATE TABLE PRODUCTBOARD_COMPANIES;",
        "operation": "executeQuery"
      },
      "credentials": {
        "snowflake": {
          "id": "81",
          "name": "Snowflake"
        }
      },
      "executeOnce": true,
      "typeVersion": 1
    },
    {
      "id": "0dbf1a3c-ae8b-4e7b-afb5-d1363d3d7634",
      "name": "[CREATE] PRODUCTBOARD_NOTES_FEATURES",
      "type": "n8n-nodes-base.snowflake",
      "position": [
        3760,
        1140
      ],
      "parameters": {
        "query": "CREATE OR REPLACE TABLE PRODUCTBOARD_NOTES_FEATURES (\n    note_id STRING NOT NULL,\n    feature_id STRING\n)",
        "operation": "executeQuery"
      },
      "credentials": {
        "snowflake": {
          "id": "81",
          "name": "Snowflake"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "fa9e8744-c348-481c-a6f9-083689ee8ea9",
      "name": "Manual mapping feature note IDs db",
      "type": "n8n-nodes-base.set",
      "position": [
        6160,
        920
      ],
      "parameters": {
        "fields": {
          "values": [
            {
              "name": "NOTE_ID",
              "stringValue": "={{ $json.note_id }}"
            },
            {
              "name": "FEATURE_ID",
              "stringValue": "={{ $json.feature_id }}"
            }
          ]
        },
        "include": "none",
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "718f041a-dd02-4331-a704-fd1aa809212b",
      "name": "Update Productboard Note and Feature IDs",
      "type": "n8n-nodes-base.snowflake",
      "position": [
        6380,
        920
      ],
      "parameters": {
        "table": "PRODUCTBOARD_NOTES_FEATURES",
        "columns": "NOTE_ID,FEATURE_ID"
      },
      "credentials": {
        "snowflake": {
          "id": "81",
          "name": "Snowflake"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "51430e95-1eb9-4c47-a0cf-e05708e6d41b",
      "name": "Empty Table Productboard Note and Feature IDs",
      "type": "n8n-nodes-base.snowflake",
      "position": [
        4040,
        640
      ],
      "parameters": {
        "query": "TRUNCATE TABLE PRODUCTBOARD_NOTES_FEATURES;",
        "operation": "executeQuery"
      },
      "credentials": {
        "snowflake": {
          "id": "81",
          "name": "Snowflake"
        }
      },
      "executeOnce": true,
      "typeVersion": 1
    },
    {
      "id": "8c03178f-baf1-4ed8-94d8-91e90ef5cd26",
      "name": "Loop Over Items notes",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        5460,
        640
      ],
      "parameters": {
        "options": {},
        "batchSize": 100
      },
      "typeVersion": 3
    },
    {
      "id": "0c6a787f-48da-479c-b45a-8122b8fada3f",
      "name": "Loop Over Items features notes",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        5900,
        900
      ],
      "parameters": {
        "options": {},
        "batchSize": 100
      },
      "typeVersion": 3
    },
    {
      "id": "1adb9ff0-be18-4ceb-aae0-62186e75668f",
      "name": "[CREATE] PRODUCTBOARD_FEATURES",
      "type": "n8n-nodes-base.snowflake",
      "position": [
        3040,
        1140
      ],
      "parameters": {
        "query": "CREATE OR REPLACE TABLE PRODUCTBOARD_FEATURES (\n    feature_id STRING NOT NULL,\n    feature_name STRING,\n    feature_status STRING,\n    feature_start_date STRING,\n    feature_end_date STRING,\n    feature_owner STRING,\n    feature_created_at STRING\n);",
        "operation": "executeQuery"
      },
      "credentials": {
        "snowflake": {
          "id": "81",
          "name": "Snowflake"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "0357ba46-4934-4c3f-8f0a-676496a6eee6",
      "name": "Empty Table Productboard Features",
      "type": "n8n-nodes-base.snowflake",
      "position": [
        3440,
        -180
      ],
      "parameters": {
        "query": "TRUNCATE TABLE PRODUCTBOARD_FEATURES;",
        "operation": "executeQuery"
      },
      "credentials": {
        "snowflake": {
          "id": "81",
          "name": "Snowflake"
        }
      },
      "executeOnce": true,
      "typeVersion": 1
    },
    {
      "id": "df076304-ce27-4801-8e0f-c268b313ef4e",
      "name": "Loop Over Items features",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        4640,
        -180
      ],
      "parameters": {
        "options": {},
        "batchSize": 100
      },
      "typeVersion": 3
    },
    {
      "id": "40732e40-5ff2-4b1f-b300-b6b734e31637",
      "name": "Manual mapping features db",
      "type": "n8n-nodes-base.set",
      "position": [
        4900,
        -160
      ],
      "parameters": {
        "fields": {
          "values": [
            {
              "name": "FEATURE_ID",
              "stringValue": "={{ $json.feature_id }}"
            },
            {
              "name": "FEATURE_NAME",
              "stringValue": "={{ $json.feature_name }}"
            },
            {
              "name": "FEATURE_STATUS",
              "stringValue": "={{ $json.feature_status }}"
            },
            {
              "name": "FEATURE_START_DATE",
              "stringValue": "={{ $json.feature_start_date }}"
            },
            {
              "name": "FEATURE_END_DATE",
              "stringValue": "={{ $json.feature_end_date }}"
            },
            {
              "name": "FEATURE_OWNER",
              "stringValue": "={{ $json.feature_owner }}"
            },
            {
              "name": "FEATURE_CREATED_AT",
              "stringValue": "={{ $json.feature_created_at }}"
            }
          ]
        },
        "include": "none",
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "59a838c4-fef0-4902-b6d6-418934ac986f",
      "name": "Update Productboard Features",
      "type": "n8n-nodes-base.snowflake",
      "position": [
        5140,
        -160
      ],
      "parameters": {
        "table": "PRODUCTBOARD_FEATURES",
        "columns": "FEATURE_ID,FEATURE_NAME,FEATURE_STATUS,FEATURE_START_DATE,FEATURE_END_DATE,FEATURE_OWNER,FEATURE_CREATED_AT"
      },
      "credentials": {
        "snowflake": {
          "id": "81",
          "name": "Snowflake"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "110ebd3a-50ac-4e9f-9297-f64759dfdd18",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        2980,
        -180
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtDay": [
                1
              ],
              "triggerAtHour": 8
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "3eb88f88-8fad-4aaf-b6f9-6f7d87e30018",
      "name": "Slack",
      "type": "n8n-nodes-base.slack",
      "onError": "continueRegularOutput",
      "position": [
        5900,
        1220
      ],
      "parameters": {
        "text": "=",
        "select": "channel",
        "blocksUi": "={\n  \"blocks\": [\n    {\n      \"type\": \"section\",\n      \"text\": {\n        \"type\": \"mrkdwn\",\n        \"text\": \":productboard: Weekly Update in :snowflake_logo: Completed\\n\\n*{{ $json.NOTES_7_DAYS }}* new insights added in the last 7 days.\\n\\n*{{ $json.NOTES_UNPROCESSED }}* insights remain unprocessed.\\n\\nYou can view the updated :metabase: dashboard below:\"\n      }\n    },\n    {\n      \"type\": \"actions\",\n      \"elements\": [\n        {\n          \"type\": \"button\",\n          \"text\": {\n            \"type\": \"plain_text\",\n            \"text\": \"Open Dashboard\",\n            \"emoji\": true\n          },\n          \"url\": \"https://metabase.com\"\n        }\n      ]\n    }\n  ]\n}",
        "channelId": {
          "__rl": true,
          "mode": "name",
          "value": "#product-notifications"
        },
        "messageType": "block",
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "id": "SG3oDwwLGpxwoJSO",
          "name": "Gardien Slack bot"
        }
      },
      "executeOnce": true,
      "retryOnFail": false,
      "typeVersion": 2.1
    },
    {
      "id": "3a16d947-a218-4ec2-8081-19b676bb51c3",
      "name": "Count Notes Last 7 days and Unprocessed",
      "type": "n8n-nodes-base.snowflake",
      "position": [
        5660,
        1220
      ],
      "parameters": {
        "query": "SELECT\n    COUNT(DISTINCT CASE \n        WHEN DATEDIFF(DAY, NOTE_CREATED_AT, CURRENT_DATE()) <= 7 THEN note_id \n    END) AS notes_7_days,\n    COUNT(DISTINCT CASE \n        WHEN NOTE_STATE = 'unprocessed' THEN note_id \n    END) AS notes_unprocessed\nFROM PRODUCTBOARD_NOTES;\n",
        "operation": "executeQuery"
      },
      "credentials": {
        "snowflake": {
          "id": "81",
          "name": "Snowflake"
        }
      },
      "executeOnce": true,
      "typeVersion": 1
    },
    {
      "id": "2bdfb96c-1c38-444d-9507-ab74f3572129",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2980,
        1060
      ],
      "parameters": {
        "color": 5,
        "width": 983.4896175671602,
        "height": 314.88047081122676,
        "content": "## Setup snowflake tables"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "",
  "connections": {
    "Split notes": {
      "main": [
        [
          {
            "node": "Manual mapping notes",
            "type": "main",
            "index": 0
          },
          {
            "node": "Split features in notes",
            "type": "main",
            "index": 0
          },
          {
            "node": "Count Notes Last 7 days and Unprocessed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split features": {
      "main": [
        [
          {
            "node": "Manual mapping feature",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split companies": {
      "main": [
        [
          {
            "node": "Manual mapping companies",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Empty Table Productboard Features",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Manual mapping notes": {
      "main": [
        [
          {
            "node": "Loop Over Items notes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items notes": {
      "main": [
        [],
        [
          {
            "node": "Manual mapping notes db",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Manual mapping feature": {
      "main": [
        [
          {
            "node": "Loop Over Items features",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "get productboard notes": {
      "main": [
        [
          {
            "node": "Split notes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Manual mapping notes db": {
      "main": [
        [
          {
            "node": "Update Productboard Notes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split features in notes": {
      "main": [
        [
          {
            "node": "Combine Feature ID + Note ID",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items features": {
      "main": [
        [
          {
            "node": "Empty Table Productboard Companies",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Manual mapping features db",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Manual mapping companies": {
      "main": [
        [
          {
            "node": "Manual mapping companies db",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Productboard Notes": {
      "main": [
        [
          {
            "node": "Loop Over Items notes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "get productboard features": {
      "main": [
        [
          {
            "node": "Split features",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Manual mapping features db": {
      "main": [
        [
          {
            "node": "Update Productboard Features",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "get productboard companies": {
      "main": [
        [
          {
            "node": "Split companies",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Manual mapping companies db": {
      "main": [
        [
          {
            "node": "Update Productboard Companies",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Combine Feature ID + Note ID": {
      "main": [
        [
          {
            "node": "Loop Over Items features notes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Productboard Features": {
      "main": [
        [
          {
            "node": "Loop Over Items features",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Productboard Companies": {
      "main": [
        [
          {
            "node": "Empty Table Productboard Note and Feature IDs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Empty Table Productboard Notes": {
      "main": [
        [
          {
            "node": "get productboard notes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items features notes": {
      "main": [
        [],
        [
          {
            "node": "Manual mapping feature note IDs db",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Empty Table Productboard Features": {
      "main": [
        [
          {
            "node": "get productboard features",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Empty Table Productboard Companies": {
      "main": [
        [
          {
            "node": "get productboard companies",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Manual mapping feature note IDs db": {
      "main": [
        [
          {
            "node": "Update Productboard Note and Feature IDs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Count Notes Last 7 days and Unprocessed": {
      "main": [
        [
          {
            "node": "Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Productboard Note and Feature IDs": {
      "main": [
        [
          {
            "node": "Loop Over Items features notes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Empty Table Productboard Note and Feature IDs": {
      "main": [
        [
          {
            "node": "Empty Table Productboard Notes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Workflow n8n Productboard, Snowflake, data integration : pour qui est ce workflow ?

Ce workflow s'adresse aux équipes produit et aux data analysts des entreprises utilisant Productboard et Snowflake. Il est idéal pour les organisations de taille moyenne à grande qui cherchent à automatiser la gestion de leurs données et à améliorer leur efficacité opérationnelle. Un niveau technique intermédiaire est recommandé pour la personnalisation du workflow.

Workflow n8n Productboard, Snowflake, data integration : problème résolu

Ce workflow résout le problème de la gestion manuelle des données entre Productboard et Snowflake, qui peut être chronophage et sujet à des erreurs. En automatisant ce processus, les utilisateurs éliminent les frustrations liées à la saisie manuelle et à la synchronisation des données. Ils obtiennent ainsi un flux de données continu et fiable, ce qui leur permet de se concentrer sur des tâches à plus forte valeur ajoutée et d'améliorer leur efficacité globale.

Workflow n8n Productboard, Snowflake, data integration : étapes du workflow

Étape 1 : Récupération des entreprises et des notes depuis Productboard via des requêtes HTTP.

  • Étape 1 : Mappage manuel des données pour ajuster les champs nécessaires.
  • Étape 2 : Extraction et traitement des fonctionnalités, avec des étapes de séparation pour chaque type de données.
  • Étape 3 : Mise à jour des tables dans Snowflake, y compris la création de nouvelles entrées et le nettoyage des anciennes données.
  • Étape 4 : Finalisation du workflow avec des opérations de mise à jour pour assurer l'intégrité des données dans l'entrepôt.

Workflow n8n Productboard, Snowflake, data integration : guide de personnalisation

Pour personnaliser ce workflow, commencez par ajuster les paramètres des requêtes HTTP pour correspondre à votre instance Productboard. Modifiez les mappages manuels pour inclure ou exclure des champs selon vos besoins. Vous pouvez également changer les opérations de création et de mise à jour dans Snowflake pour s'adapter à votre structure de données. Assurez-vous de sécuriser vos connexions et de monitorer le flux pour garantir une intégration fluide et sans erreur.