AutomationFlowsSocial Media › Automate Strapi Testimonials from Twitter

Automate Strapi Testimonials from Twitter

Original n8n title: Automate Testimonials in Strapi with N8n

Automate Testimonials In Strapi With N8N. Uses strapi, interval, twitter, googleCloudNaturalLanguage. Webhook trigger; 14 nodes.

Webhook trigger★★★★☆ complexity14 nodesStrapiTwitterGoogle Cloud Natural Language
Social Media Trigger: Webhook Nodes: 14 Complexity: ★★★★☆ Added:

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "nodes": [
    {
      "name": "Simplify Result",
      "type": "n8n-nodes-base.set",
      "position": [
        680,
        100
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "Content",
              "value": "={{$json[\"full_text\"].replace(/(?:https?|ftp):\\/\\/[\\n\\S]+/g, '')}}"
            },
            {
              "name": "Author",
              "value": "={{$json[\"user\"][\"name\"]}} (@{{$json[\"user\"][\"screen_name\"]}})"
            },
            {
              "name": "Created",
              "value": "={{new Date($json[\"created_at\"]).toISOString()}}"
            },
            {
              "name": "URL",
              "value": "=https://twitter.com/{{$json[\"user\"][\"screen_name\"]}}/status/{{$json[\"id_str\"]}}"
            }
          ]
        },
        "options": {},
        "keepOnlySet": true
      },
      "typeVersion": 1
    },
    {
      "name": "Store in Strapi",
      "type": "n8n-nodes-base.strapi",
      "position": [
        1780,
        100
      ],
      "parameters": {
        "columns": "Content,Author,Created,URL",
        "operation": "create",
        "contentType": "posts"
      },
      "credentials": {
        "strapiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "name": "Every 30 Minutes",
      "type": "n8n-nodes-base.interval",
      "position": [
        240,
        100
      ],
      "parameters": {
        "unit": "minutes",
        "interval": 30
      },
      "typeVersion": 1
    },
    {
      "name": "Is Retweet or Old?",
      "type": "n8n-nodes-base.if",
      "position": [
        900,
        100
      ],
      "parameters": {
        "conditions": {
          "string": [
            {
              "value1": "={{$json[\"Content\"]}}",
              "value2": "RT @",
              "operation": "startsWith"
            }
          ],
          "dateTime": [
            {
              "value1": "={{$json[\"Created\"]}}",
              "value2": "={{new Date(new Date().getTime() - 30 * 60 * 1000)}}",
              "operation": "before"
            }
          ]
        },
        "combineOperation": "any"
      },
      "typeVersion": 1
    },
    {
      "name": "Search Tweets",
      "type": "n8n-nodes-base.twitter",
      "position": [
        460,
        100
      ],
      "parameters": {
        "operation": "search",
        "searchText": "(strapi OR n8n.io) AND lang:en",
        "additionalFields": {
          "tweetMode": "extended",
          "resultType": "recent"
        }
      },
      "credentials": {
        "twitterOAuth1Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        240,
        -120
      ],
      "parameters": {
        "path": "6f833370-9068-44ef-8e56-4ceb563a851e",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 1
    },
    {
      "name": "Simplify Webhook Result",
      "type": "n8n-nodes-base.set",
      "position": [
        460,
        -120
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "Content",
              "value": "={{$json[\"body\"][\"data\"][\"fields\"][1][\"value\"]}}"
            },
            {
              "name": "Author",
              "value": "={{$json[\"body\"][\"data\"][\"fields\"][0][\"value\"]}}"
            },
            {
              "name": "Created",
              "value": "={{new Date().toISOString()}}"
            },
            {
              "name": "URL"
            }
          ]
        },
        "options": {},
        "keepOnlySet": true
      },
      "typeVersion": 1
    },
    {
      "name": "Analyze Form Submission",
      "type": "n8n-nodes-base.googleCloudNaturalLanguage",
      "position": [
        680,
        -220
      ],
      "parameters": {
        "content": "={{$json[\"Content\"]}}",
        "options": {}
      },
      "credentials": {
        "googleCloudNaturalLanguageOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "name": "Analyze Tweet",
      "type": "n8n-nodes-base.googleCloudNaturalLanguage",
      "position": [
        1120,
        200
      ],
      "parameters": {
        "content": "={{$json[\"Content\"]}}",
        "options": {}
      },
      "credentials": {
        "googleCloudNaturalLanguageOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "name": "Merge Form Sentiment with Source",
      "type": "n8n-nodes-base.merge",
      "position": [
        900,
        -120
      ],
      "parameters": {
        "mode": "mergeByIndex"
      },
      "typeVersion": 1
    },
    {
      "name": "Merge Tweet Sentiment with Source",
      "type": "n8n-nodes-base.merge",
      "position": [
        1340,
        100
      ],
      "parameters": {
        "mode": "mergeByIndex"
      },
      "typeVersion": 1
    },
    {
      "name": "Positive Form Sentiment?",
      "type": "n8n-nodes-base.if",
      "position": [
        1120,
        -120
      ],
      "parameters": {
        "conditions": {
          "number": [
            {
              "value1": "={{$json[\"documentSentiment\"][\"score\"]}}",
              "value2": 0.4,
              "operation": "larger"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "name": "Store Form Submission in Strapi",
      "type": "n8n-nodes-base.strapi",
      "position": [
        1340,
        -120
      ],
      "parameters": {
        "columns": "Content,Author,Created,URL",
        "operation": "create",
        "contentType": "posts"
      },
      "credentials": {
        "strapiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "name": "Positive Tweet Sentiment?",
      "type": "n8n-nodes-base.if",
      "position": [
        1560,
        100
      ],
      "parameters": {
        "conditions": {
          "number": [
            {
              "value1": "={{$json[\"documentSentiment\"][\"score\"]}}",
              "value2": 0.3,
              "operation": "larger"
            }
          ]
        }
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Webhook": {
      "main": [
        [
          {
            "node": "Simplify Webhook Result",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyze Tweet": {
      "main": [
        [
          {
            "node": "Merge Tweet Sentiment with Source",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Search Tweets": {
      "main": [
        [
          {
            "node": "Simplify Result",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Simplify Result": {
      "main": [
        [
          {
            "node": "Is Retweet or Old?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Every 30 Minutes": {
      "main": [
        [
          {
            "node": "Search Tweets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Is Retweet or Old?": {
      "main": [
        null,
        [
          {
            "node": "Analyze Tweet",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge Tweet Sentiment with Source",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyze Form Submission": {
      "main": [
        [
          {
            "node": "Merge Form Sentiment with Source",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Simplify Webhook Result": {
      "main": [
        [
          {
            "node": "Analyze Form Submission",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge Form Sentiment with Source",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Positive Form Sentiment?": {
      "main": [
        [
          {
            "node": "Store Form Submission in Strapi",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Positive Tweet Sentiment?": {
      "main": [
        [
          {
            "node": "Store in Strapi",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge Form Sentiment with Source": {
      "main": [
        [
          {
            "node": "Positive Form Sentiment?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge Tweet Sentiment with Source": {
      "main": [
        [
          {
            "node": "Positive Tweet Sentiment?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

How this works

Easily gather and manage customer testimonials by automating the collection of positive Twitter mentions into your Strapi content management system, saving hours of manual monitoring and entry. This workflow suits marketing teams or small businesses seeking to build social proof without dedicated social media staff, delivering authentic feedback directly to your database. It kicks off with a webhook trigger for form submissions or runs on a 30-minute interval to search Twitter for relevant mentions, then analyses sentiment using Google Cloud Natural Language before storing approved entries in Strapi.

Use this when you want to streamline testimonial curation from social media alongside web forms, particularly for brands active on Twitter with consistent branding keywords. Avoid it if your testimonials primarily come from emails or surveys, as those require different triggers like IMAP nodes. Common variations include adjusting the interval for daily runs or integrating additional filters for tweet age and retweet status to focus on fresh, original content.

About this workflow

Automate Testimonials In Strapi With N8N. Uses strapi, interval, twitter, googleCloudNaturalLanguage. Webhook trigger; 14 nodes.

Source: https://github.com/Zie619/n8n-workflows — original creator credit. Request a take-down →

More Social Media workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Social Media

This is the workflow powering the n8n demo shown at StrapiConf 2022.

Strapi, Twitter, Google Cloud Natural Language
Social Media

The x402 payment standard is growing in popularity and has enabled new monetization opportunities for internet resources. This workflow lets you automate the monetization of your followers on X by rec

Telegram, Twitter, N8N Nodes 1Shot
Social Media

Etl Pipeline For Text Processing. Uses twitter, postgres, mongoDb, slack. Scheduled trigger; 9 nodes.

Twitter, Postgres, MongoDB +2
Social Media

ETL pipeline. Uses twitter, postgres, mongoDb, slack. Scheduled trigger; 9 nodes.

Twitter, Postgres, MongoDB +2
Social Media

aban — Publish Fanout. Uses linkedIn, twitter, httpRequest. Webhook trigger; 6 nodes.

LinkedIn, Twitter, HTTP Request