Automatisation Google Sheets avec n8n : synchronisation des tickets
- Ce workflow n8n a pour objectif d'automatiser la gestion des tickets entre Dialpad et Google Sheets, facilitant ainsi le suivi des clients et l'organisation des données. Dans un contexte où la gestion efficace des tickets est cruciale pour les équipes de support client, cette automatisation permet de réduire les erreurs manuelles et d'optimiser le temps de traitement. Les cas d'usage incluent la création, la mise à jour et la synchronisation des tickets en temps réel, ce qui est essentiel pour les entreprises qui souhaitent améliorer leur réactivité et leur service client.
- Le workflow débute avec un déclencheur de type Webhook qui reçoit les données des tickets. Ensuite, le noeud 'GetCustomer' permet de récupérer les informations du client à partir de Dialpad. Si plusieurs tickets sont détectés, le noeud 'IFMoreThanOne' gère cette condition pour traiter chaque ticket individuellement. Les tickets sont ensuite créés ou mis à jour via les noeuds 'CreateTicket' et 'UpdateTicket'. Pour chaque ticket, des données sont également envoyées vers Google Sheets grâce aux noeuds 'Google Sheets' qui permettent de maintenir un tableau de bord à jour avec les informations pertinentes. Enfin, des fonctions personnalisées comme 'Contacts' et 'Customers' sont utilisées pour enrichir les données avant leur envoi, garantissant ainsi une gestion complète et efficace des informations.
- Les bénéfices business de cette automatisation n8n sont multiples : elle réduit les risques d'erreurs humaines, améliore la traçabilité des tickets et permet un accès rapide aux données clients, ce qui se traduit par une meilleure satisfaction client et une efficacité opérationnelle accrue.
Workflow n8n Google Sheets, tickets, Dialpad : vue d'ensemble
Schéma des nœuds et connexions de ce workflow n8n, généré à partir du JSON n8n.
Workflow n8n Google Sheets, tickets, Dialpad : détail des nœuds
Inscris-toi pour voir l'intégralité du workflow
Inscription gratuite
S'inscrire gratuitementBesoin d'aide ?{
"id": "1",
"name": "Dialpad to Syncro",
"nodes": [
{
"name": "GetCustomer",
"type": "n8n-nodes-base.httpRequest",
"position": [
350,
180
],
"parameters": {
"url": "={{$node[\"EnvVariables\"].json[\"syncro_baseurl\"]}}/api/v1/search?query={{$json[\"body\"][\"external_number\"].replace(/\\+/g, '').replace(/^[01]/, '')}}",
"options": {},
"authentication": "headerAuth"
},
"credentials": {
"httpHeaderAuth": "Syncro"
},
"typeVersion": 1
},
{
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"position": [
-60,
180
],
"webhookId": "ec452bb5-58d9-4e0d-9cd2-c6df1c2cd957",
"parameters": {
"path": "moezdialpad",
"options": {},
"httpMethod": "POST",
"responseData": "allEntries",
"responseMode": "lastNode"
},
"typeVersion": 1
},
{
"name": "CreateTicket",
"type": "n8n-nodes-base.httpRequest",
"position": [
1190,
110
],
"parameters": {
"url": "={{$node[\"EnvVariables\"].json[\"syncro_baseurl\"]}}/api/v1/tickets",
"options": {
"bodyContentType": "json"
},
"requestMethod": "POST",
"authentication": "headerAuth",
"bodyParametersUi": {
"parameter": [
{
"name": "customer_id",
"value": "={{$node[\"Contacts\"].json[\"contacts\"][0][\"customer_id\"]}}"
},
{
"name": "subject",
"value": "=Phone call from {{$node[\"Function\"].json[\"contacts\"][0][\"firstname\"]}} {{$node[\"Function\"].json[\"contacts\"][0][\"lastname\"]}} ({{$node[\"Webhook\"].json[\"body\"][\"contact\"][\"phone\"]}})"
},
{
"name": "status",
"value": "In Progress"
},
{
"name": "contact_id",
"value": "={{$node[\"Contacts\"].json[\"contacts\"][0][\"id\"]}}"
},
{
"name": "user_id",
"value": "={{$node[\"EnvVariables\"].parameter[\"values\"][\"string\"][1][\"value\"]}}"
}
]
}
},
"credentials": {
"httpHeaderAuth": "Syncro"
},
"typeVersion": 1
},
{
"name": "GetTicket",
"type": "n8n-nodes-base.httpRequest",
"position": [
860,
40
],
"parameters": {
"url": "={{$node[\"EnvVariables\"].json[\"syncro_baseurl\"]}}/api/v1/tickets?contact_id={{$json[\"contacts\"][0][\"id\"]}}&status=Not%20Closed",
"options": {},
"authentication": "headerAuth"
},
"credentials": {
"httpHeaderAuth": "Syncro"
},
"typeVersion": 1
},
{
"name": "IFMoreThanOne",
"type": "n8n-nodes-base.if",
"position": [
1000,
40
],
"parameters": {
"conditions": {
"number": [
{
"value1": "={{$node[\"GetTicket\"].json[\"tickets\"].length}}",
"value2": 1,
"operation": "equal"
}
],
"boolean": [
{
"value1": "={{$json[\"tickets\"]}}",
"value2": true
}
]
},
"combineOperation": "any"
},
"typeVersion": 1
},
{
"name": "Google Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
1480,
-40
],
"parameters": {
"range": "A:B",
"options": {
"valueInputMode": "USER_ENTERED"
},
"sheetId": "xxx",
"operation": "append"
},
"credentials": {
"googleApi": "Google"
},
"typeVersion": 1
},
{
"name": "ForGoogle",
"type": "n8n-nodes-base.set",
"position": [
1340,
-40
],
"parameters": {
"values": {
"string": [
{
"name": "Call",
"value": "={{$node[\"Webhook\"].json[\"body\"][\"call_id\"]}}"
},
{
"name": "Ticket",
"value": "={{$node[\"GetTicket\"].json[\"tickets\"][0][\"id\"]}}"
}
]
},
"options": {},
"keepOnlySet": true
},
"typeVersion": 1
},
{
"name": "UpdateTicket",
"type": "n8n-nodes-base.httpRequest",
"position": [
1190,
-40
],
"parameters": {
"url": "={{$node[\"EnvVariables\"].json[\"syncro_baseurl\"]}}/api/v1/tickets/{{$json[\"tickets\"][0][\"id\"]}}/comment",
"options": {},
"requestMethod": "POST",
"authentication": "headerAuth",
"bodyParametersUi": {
"parameter": [
{
"name": "subject",
"value": "=Phone call from {{$node[\"GetCustomer\"].json[\"results\"][0][\"table\"][\"_source\"][\"table\"][\"firstname\"]}} {{$node[\"GetCustomer\"].json[\"results\"][0][\"table\"][\"_source\"][\"table\"][\"lastname\"]}} ({{$node[\"Webhook\"].json[\"body\"][\"contact\"][\"phone\"]}})"
},
{
"name": "body",
"value": "={{$node[\"GetCustomer\"].json[\"results\"][0][\"table\"][\"_source\"][\"table\"][\"firstname\"]}} {{$node[\"GetCustomer\"].json[\"results\"][0][\"table\"][\"_source\"][\"table\"][\"lastname\"]}} called."
},
{
"name": "hidden",
"value": "true"
},
{
"name": "user_id",
"value": "={{$node[\"EnvVariables\"].parameter[\"values\"][\"string\"][1][\"value\"]}}"
}
]
}
},
"credentials": {
"httpHeaderAuth": "Syncro"
},
"typeVersion": 1
},
{
"name": "ForGoogle1",
"type": "n8n-nodes-base.set",
"position": [
1340,
110
],
"parameters": {
"values": {
"string": [
{
"name": "Call",
"value": "={{$node[\"Webhook\"].json[\"body\"][\"call_id\"]}}"
},
{
"name": "Ticket",
"value": "={{$node[\"CreateTicket\"].json[\"ticket\"][\"id\"]}}"
}
]
},
"options": {},
"keepOnlySet": true
},
"typeVersion": 1
},
{
"name": "Google Sheets1",
"type": "n8n-nodes-base.googleSheets",
"position": [
1480,
110
],
"parameters": {
"range": "A:B",
"options": {
"valueInputMode": "USER_ENTERED"
},
"sheetId": "xxx",
"operation": "append"
},
"credentials": {
"googleApi": "Google"
},
"typeVersion": 1
},
{
"name": "NoOp",
"type": "n8n-nodes-base.noOp",
"position": [
830,
220
],
"parameters": {},
"typeVersion": 1
},
{
"name": "Contacts",
"type": "n8n-nodes-base.function",
"position": [
510,
180
],
"parameters": {
"functionCode": "const { json: { results } } = items[0];\n\nconst getData = (results, type) => results.filter(r => r.table._index === type).map(x => ({\n id: x.table._id,\n firstname: x.table._source.table.firstname,\n lastname: x.table._source.table.lastname,\n customer_id: x.table._source.table.customer_id,\n email: x.table._source.table.email,\n business_name: x.table._source.table.business_name,\n phones: x.table._source.table.phones\n }));\n \nreturn [ { json: { contacts: getData(results, 'contacts') } } ];\n"
},
"typeVersion": 1,
"alwaysOutputData": false
},
{
"name": "IFContacts",
"type": "n8n-nodes-base.if",
"position": [
670,
180
],
"parameters": {
"conditions": {
"number": [
{
"value1": "={{$node[\"Contacts\"].json[\"contacts\"].length}}",
"value2": 1,
"operation": "equal"
}
],
"string": [],
"boolean": []
}
},
"typeVersion": 1
},
{
"name": "Customers",
"type": "n8n-nodes-base.function",
"position": [
510,
370
],
"parameters": {
"functionCode": "const { json: { results } } = items[0];\n\nconst getData = (results, type) => results.filter(r => r.table._index === type).map(x => ({\n id: x.table._id,\n firstname: x.table._source.table.firstname,\n lastname: x.table._source.table.lastname,\n customer_id: x.table._source.table.customer_id,\n email: x.table._source.table.email,\n business_name: x.table._source.table.business_name,\n phones: x.table._source.table.phones\n }));\n \nreturn [ { json: { customers: getData(results, 'customers') } } ];\n"
},
"typeVersion": 1
},
{
"name": "IFCustomers",
"type": "n8n-nodes-base.if",
"position": [
670,
370
],
"parameters": {
"conditions": {
"number": [
{
"value1": "={{$node[\"Customers\"].json[\"customers\"].length}}",
"value2": 1,
"operation": "equal"
}
],
"string": [],
"boolean": []
}
},
"typeVersion": 1
},
{
"name": "NoOp1",
"type": "n8n-nodes-base.noOp",
"position": [
810,
520
],
"parameters": {},
"typeVersion": 1
},
{
"name": "CreateTicketForCustomer",
"type": "n8n-nodes-base.httpRequest",
"position": [
860,
360
],
"parameters": {
"url": "={{$node[\"EnvVariables\"].json[\"syncro_baseurl\"]}}/api/v1/tickets",
"options": {
"bodyContentType": "json"
},
"requestMethod": "POST",
"authentication": "headerAuth",
"bodyParametersUi": {
"parameter": [
{
"name": "customer_id",
"value": "={{$node[\"Customers\"].json[\"customers\"][0][\"id\"]}}"
},
{
"name": "subject",
"value": "=Phone call from {{$node[\"Customers\"].json[\"customers\"][0][\"business_name\"]}} ({{$node[\"Webhook\"].json[\"body\"][\"contact\"][\"phone\"]}})"
},
{
"name": "status",
"value": "In Progress"
},
{
"name": "user_id",
"value": "={{$node[\"EnvVariables\"].parameter[\"values\"][\"string\"][1][\"value\"]}}"
}
]
}
},
"credentials": {
"httpHeaderAuth": "Syncro"
},
"typeVersion": 1
},
{
"name": "ForGoogle2",
"type": "n8n-nodes-base.set",
"position": [
1040,
360
],
"parameters": {
"values": {
"string": [
{
"name": "Call",
"value": "={{$node[\"Webhook\"].json[\"body\"][\"call_id\"]}}"
},
{
"name": "Ticket",
"value": "={{$node[\"CreateTicketForCustomer\"].json[\"ticket\"][\"id\"]}}"
}
]
},
"options": {},
"keepOnlySet": true
},
"typeVersion": 1
},
{
"name": "Google Sheets2",
"type": "n8n-nodes-base.googleSheets",
"position": [
1210,
360
],
"parameters": {
"range": "A:B",
"options": {
"valueInputMode": "USER_ENTERED"
},
"sheetId": "xxx",
"operation": "append"
},
"credentials": {
"googleApi": "Google"
},
"typeVersion": 1
},
{
"name": "EnvVariables",
"type": "n8n-nodes-base.set",
"position": [
210,
180
],
"parameters": {
"values": {
"string": [
{
"name": "syncro_baseurl",
"value": "https://subdomain.syncromsp.com"
},
{
"name": "user_id",
"value": "1234"
}
]
},
"options": {}
},
"typeVersion": 1
},
{
"name": "IF",
"type": "n8n-nodes-base.if",
"position": [
70,
180
],
"parameters": {
"conditions": {
"string": [
{
"value1": "={{$node[\"Webhook\"].json[\"body\"][\"direction\"]}}",
"value2": "inbound"
}
]
}
},
"typeVersion": 1
},
{
"name": "NoOp2",
"type": "n8n-nodes-base.noOp",
"position": [
70,
370
],
"parameters": {},
"typeVersion": 1
}
],
"active": true,
"settings": {},
"connections": {
"IF": {
"main": [
[
{
"node": "EnvVariables",
"type": "main",
"index": 0
}
],
[
{
"node": "NoOp2",
"type": "main",
"index": 0
}
]
]
},
"Webhook": {
"main": [
[
{
"node": "IF",
"type": "main",
"index": 0
}
]
]
},
"Contacts": {
"main": [
[
{
"node": "IFContacts",
"type": "main",
"index": 0
}
]
]
},
"Customers": {
"main": [
[
{
"node": "IFCustomers",
"type": "main",
"index": 0
}
]
]
},
"ForGoogle": {
"main": [
[
{
"node": "Google Sheets",
"type": "main",
"index": 0
}
]
]
},
"GetTicket": {
"main": [
[
{
"node": "IFMoreThanOne",
"type": "main",
"index": 0
}
]
]
},
"ForGoogle1": {
"main": [
[
{
"node": "Google Sheets1",
"type": "main",
"index": 0
}
]
]
},
"ForGoogle2": {
"main": [
[
{
"node": "Google Sheets2",
"type": "main",
"index": 0
}
]
]
},
"IFContacts": {
"main": [
[
{
"node": "GetTicket",
"type": "main",
"index": 0
}
],
[
{
"node": "NoOp",
"type": "main",
"index": 0
}
]
]
},
"GetCustomer": {
"main": [
[
{
"node": "Contacts",
"type": "main",
"index": 0
},
{
"node": "Customers",
"type": "main",
"index": 0
}
]
]
},
"IFCustomers": {
"main": [
[
{
"node": "CreateTicketForCustomer",
"type": "main",
"index": 0
}
],
[
{
"node": "NoOp1",
"type": "main",
"index": 0
}
]
]
},
"CreateTicket": {
"main": [
[
{
"node": "ForGoogle1",
"type": "main",
"index": 0
}
]
]
},
"EnvVariables": {
"main": [
[
{
"node": "GetCustomer",
"type": "main",
"index": 0
}
]
]
},
"UpdateTicket": {
"main": [
[
{
"node": "ForGoogle",
"type": "main",
"index": 0
}
]
]
},
"IFMoreThanOne": {
"main": [
[
{
"node": "UpdateTicket",
"type": "main",
"index": 0
}
],
[
{
"node": "CreateTicket",
"type": "main",
"index": 0
}
]
]
},
"CreateTicketForCustomer": {
"main": [
[
{
"node": "ForGoogle2",
"type": "main",
"index": 0
}
]
]
}
}
}Workflow n8n Google Sheets, tickets, Dialpad : pour qui est ce workflow ?
Ce workflow s'adresse aux équipes de support client et aux responsables de la gestion des tickets au sein d'entreprises de taille petite à moyenne. Les utilisateurs doivent avoir des connaissances de base en automatisation et en gestion de données, mais aucune compétence technique avancée n'est requise.
Workflow n8n Google Sheets, tickets, Dialpad : problème résolu
Ce workflow résout le problème de la gestion manuelle des tickets, qui peut entraîner des erreurs et des retards dans le traitement des demandes clients. En automatisant la création et la mise à jour des tickets, les utilisateurs peuvent réduire le temps passé sur des tâches répétitives et se concentrer sur des activités à plus forte valeur ajoutée. De plus, il diminue le risque de perte d'informations critiques et assure une meilleure organisation des données clients.
Workflow n8n Google Sheets, tickets, Dialpad : étapes du workflow
Étape 1 : Le workflow est déclenché par un Webhook qui reçoit les données des tickets.
- Étape 1 : Le noeud 'GetCustomer' récupère les informations du client depuis Dialpad.
- Étape 2 : Le noeud 'IFMoreThanOne' vérifie s'il y a plusieurs tickets à traiter.
- Étape 3 : Pour chaque ticket, le workflow crée ou met à jour les informations via les noeuds 'CreateTicket' et 'UpdateTicket'.
- Étape 4 : Les données sont ensuite envoyées vers Google Sheets pour une gestion centralisée grâce aux noeuds 'Google Sheets'.
- Étape 5 : Des fonctions personnalisées comme 'Contacts' et 'Customers' enrichissent les données avant leur envoi.
Workflow n8n Google Sheets, tickets, Dialpad : guide de personnalisation
Pour personnaliser ce workflow, vous pouvez modifier l'URL du Webhook pour l'adapter à votre environnement. Il est également possible de changer les paramètres des noeuds 'CreateTicket' et 'UpdateTicket' pour correspondre aux spécificités de votre système de gestion des tickets. Si vous souhaitez intégrer d'autres outils, vous pouvez ajouter des noeuds supplémentaires ou modifier les noeuds existants pour inclure des API différentes. Assurez-vous de sécuriser le flux en configurant correctement les authentifications requises pour chaque service utilisé.