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 →
{
"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.
googleCloudNaturalLanguageOAuth2ApistrapiApitwitterOAuth1Api
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 →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This is the workflow powering the n8n demo shown at StrapiConf 2022.
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
Etl Pipeline For Text Processing. Uses twitter, postgres, mongoDb, slack. Scheduled trigger; 9 nodes.
ETL pipeline. Uses twitter, postgres, mongoDb, slack. Scheduled trigger; 9 nodes.
aban — Publish Fanout. Uses linkedIn, twitter, httpRequest. Webhook trigger; 6 nodes.