SerpAPI와 Google Sheets를 사용하여 내부 링크 기회를 찾기
중급
이것은Content Creation, Multimodal AI분야의자동화 워크플로우로, 12개의 노드를 포함합니다.주로 Set, HttpRequest, GoogleSheets, ManualTrigger, SplitInBatches 등의 노드를 사용하며. SerpAPI와 Google 스프레드시트를 사용하여 내부 링크 기회를 찾아
사전 요구사항
- •대상 API의 인증 정보가 필요할 수 있음
- •Google Sheets API 인증 정보
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
"id": "3qFkempg015uG0dB",
"meta": {
"instanceId": "b597f3db206729fea79938d01afc341ae2811ad29d941b24c1597c0110c58f12",
"templateCredsSetupCompleted": true
},
"name": "Find internal linking opportunities using SerAPI and Google Sheets",
"tags": [],
"nodes": [
{
"id": "8c2aa4ad-94d0-4c52-b6bb-bee296a4420b",
"name": "항목 반복",
"type": "n8n-nodes-base.splitInBatches",
"position": [
480,
144
],
"parameters": {
"options": {},
"batchSize": 5
},
"typeVersion": 3
},
{
"id": "7fccd9bf-8f71-4adf-97e4-2eff330d757f",
"name": "SerpAPI를 사용해 검색 결과 가져오기",
"type": "n8n-nodes-base.httpRequest",
"position": [
832,
160
],
"parameters": {
"url": "https://serpapi.com/search",
"options": {},
"sendQuery": true,
"authentication": "predefinedCredentialType",
"queryParameters": {
"parameters": [
{
"name": "q",
"value": "={{ $json.Keyword }} site:{{ $json.Domain }} -inurl:{{ $json.URL }}"
}
]
},
"nodeCredentialType": "serpApi"
},
"credentials": {
"serpApi": {
"id": "YAoSR4cn13A9KovZ",
"name": "SerpAPI account"
},
"httpHeaderAuth": {
"id": "TJXGtVnuqOEKAqqj",
"name": "Unsplash API"
}
},
"typeVersion": 4.2
},
{
"id": "420bdbbe-a304-4bfe-8cd8-54ab467a6d71",
"name": "JSON에서 링크 추출",
"type": "n8n-nodes-base.set",
"position": [
1184,
160
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "eae05e00-7188-4cca-994f-0cdf091e5618",
"name": "URL",
"type": "string",
"value": "={{ $('Loop Over Items').item.json.URL }}"
},
{
"id": "1e7647fb-a137-4971-8f8c-5f0709d0f92f",
"name": "organic_results",
"type": "array",
"value": "={{ $json.organic_results.map(item => item.link) }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "44ca48a2-fae4-4de4-a5d7-e4d16960b914",
"name": "Google 시트에 내부 URL 추가",
"type": "n8n-nodes-base.googleSheets",
"position": [
1536,
160
],
"parameters": {
"columns": {
"value": {
"URL": "={{ $json.URL }}",
"Internal link 1": "={{ $json.organic_results[0] ? $json.organic_results[0] : \"N/A\"}}",
"Internal link 2": "={{ $json.organic_results[1] ? $json.organic_results[1] : \"N/A\"}}",
"Internal link 3": "={{ $json.organic_results[2] ? $json.organic_results[2] : \"N/A\"}}",
"Internal link 4": "={{ $json.organic_results[3] ? $json.organic_results[3] : \"N/A\"}}",
"Internal link 5": "={{ $json.organic_results[4] ? $json.organic_results[4] : \"N/A\"}}",
"Internal link 6": "={{ $json.organic_results[5] ? $json.organic_results[5] : \"N/A\"}}",
"Internal link 7": "={{ $json.organic_results[6] ? $json.organic_results[6] : \"N/A\"}}",
"Internal link 8": "={{ $json.organic_results[7] ? $json.organic_results[7] : \"N/A\"}}",
"Internal link 9": "={{ $json.organic_results[8] ? $json.organic_results[8] : \"N/A\"}}",
"Internal link 10": "={{ $json.organic_results[9] ? $json.organic_results[9] : \"N/A\"}}"
},
"schema": [
{
"id": "Domain",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Domain",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Keyword",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Keyword",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Internal link 1",
"type": "string",
"display": true,
"required": false,
"displayName": "Internal link 1",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Internal link 2",
"type": "string",
"display": true,
"required": false,
"displayName": "Internal link 2",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Internal link 3",
"type": "string",
"display": true,
"required": false,
"displayName": "Internal link 3",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Internal link 4",
"type": "string",
"display": true,
"required": false,
"displayName": "Internal link 4",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Internal link 5",
"type": "string",
"display": true,
"required": false,
"displayName": "Internal link 5",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Internal link 6",
"type": "string",
"display": true,
"required": false,
"displayName": "Internal link 6",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Internal link 7",
"type": "string",
"display": true,
"required": false,
"displayName": "Internal link 7",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Internal link 8",
"type": "string",
"display": true,
"required": false,
"displayName": "Internal link 8",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Internal link 9",
"type": "string",
"display": true,
"required": false,
"displayName": "Internal link 9",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Internal link 10",
"type": "string",
"display": true,
"required": false,
"displayName": "Internal link 10",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "number",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"URL"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1U0whmy1d7wPoWTNTa1u68QrLTE1NqYgyyFXxARWo_1M/edit#gid=0",
"cachedResultName": "Internal links"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1U0whmy1d7wPoWTNTa1u68QrLTE1NqYgyyFXxARWo_1M",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1U0whmy1d7wPoWTNTa1u68QrLTE1NqYgyyFXxARWo_1M/edit?usp=drivesdk",
"cachedResultName": "Find internal links using SerpAPI - N8N demo"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "oXAMCvV3d7R6Oelr",
"name": "Google Sheets account - Personal"
}
},
"typeVersion": 4.7
},
{
"id": "172e75f7-9698-4c87-819e-edf94ea20612",
"name": "URL 및 키워드 가져오기",
"type": "n8n-nodes-base.googleSheets",
"position": [
128,
144
],
"parameters": {
"options": {},
"filtersUI": {
"values": [
{
"lookupColumn": "Internal link 1"
}
]
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1U0whmy1d7wPoWTNTa1u68QrLTE1NqYgyyFXxARWo_1M/edit#gid=0",
"cachedResultName": "Internal links"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1U0whmy1d7wPoWTNTa1u68QrLTE1NqYgyyFXxARWo_1M",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1U0whmy1d7wPoWTNTa1u68QrLTE1NqYgyyFXxARWo_1M/edit?usp=drivesdk",
"cachedResultName": "Find internal links using SerpAPI - N8N demo"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "oXAMCvV3d7R6Oelr",
"name": "Google Sheets account - Personal"
}
},
"typeVersion": 4.7
},
{
"id": "1d1a37d8-8b2b-4399-9abe-13dff9cc1ad2",
"name": "스티커 메모",
"type": "n8n-nodes-base.stickyNote",
"position": [
16,
-320
],
"parameters": {
"color": 7,
"width": 320,
"height": 704,
"content": "## Get URLs and keywords\nIn this node, we're getting the different URLs that we want suggestions for, and the keywords/topics those pages are targeting.\n\nWe're filtering out everything that already has a value in the `internal link 1` column so we don't override rows we already processed in a previous run\n"
},
"typeVersion": 1
},
{
"id": "2f549918-a4ca-4a99-b60a-94b903c7f994",
"name": "수동 트리거",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-112,
144
],
"parameters": {},
"typeVersion": 1
},
{
"id": "36b666a5-613b-43bc-a940-b5bb546bdbfa",
"name": "스티커 메모1",
"type": "n8n-nodes-base.stickyNote",
"position": [
368,
-320
],
"parameters": {
"color": 7,
"width": 320,
"height": 704,
"content": "## Loop over URLs\nLoop over each URL to get the results. Here we're doing it in batches of 5\n\n:warning: Note :warning:\nDon't set the batch size too high or you'll start hitting rate limits for some of the APIs, especially Google Sheets. \n\nIf you have a small number of URLs to process you can leave it at five. If you have a larger set of URLs consider setting the batch size lower, or adding a wait node at the end.\n\n"
},
"typeVersion": 1
},
{
"id": "3dc9bb5d-03c4-423b-96d0-120badad6810",
"name": "스티커 메모2",
"type": "n8n-nodes-base.stickyNote",
"position": [
720,
-320
],
"parameters": {
"color": 7,
"width": 320,
"height": 704,
"content": "## Get search results using SerpAPI\nGet the search results from SerpAPI.\n\nWe're searching for the target keyword, while doing a `site:<domain>` search so we only get results from our site.\n\nWe use `-inurl:<url>` to exclude the URL we are currently working with. This gives us results similar to the URL we have that we can building internal links from.\n\n:warning: Note :warning:\nIf you have to process a large set of URLs it's worth [setting up a programmable search engine](https://drlee.io/build-your-own-google-create-a-custom-search-engine-with-trusted-sources-c1c113e845cc) instead of using SerAPI\n\n"
},
"typeVersion": 1
},
{
"id": "75af678f-5af2-4aa7-8f00-d6fc84ee18e6",
"name": "스티커 메모3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1072,
-320
],
"parameters": {
"color": 7,
"width": 320,
"height": 704,
"content": "## Extract organic links from JSON\nSerpAPI gives us a bunch of data we don't need for this use case so we just filter for the organic results. specifically, we filter the URLs it gives us\n\n"
},
"typeVersion": 1
},
{
"id": "72d62473-fab0-4db5-92f8-4cac1ab9acb0",
"name": "스티커 메모4",
"type": "n8n-nodes-base.stickyNote",
"position": [
1424,
-320
],
"parameters": {
"color": 7,
"width": 320,
"height": 704,
"content": "## Update Google Sheet\nHere we're adding the URLs to the different column in our sheet.\n\nNote that we're using an inline `if` statement so, if there's no URL present, it just adds 'N/A' to our Google Sheet. Not all URLs will have 10 internal link opportunities\n\n"
},
"typeVersion": 1
},
{
"id": "e229c5a9-44c9-44c5-af81-ca2859283831",
"name": "스티커 메모5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-592,
-320
],
"parameters": {
"color": 7,
"width": 400,
"height": 704,
"content": "## Overview\n\nUse this workflow to spot internal linking ideas on your site and improve your search performance. It takes your target URLs and keywords, finds related pages, and suggests where to add links. Strong internal linking helps search engines understand your site.\n\n## How it works\n- You provide a list of target URLs and the keywords you want to rank for\n- The workflow uses the SERP API to search your site for related pages, skipping the target URL\n- It filters the results and pulls relevant URLs\n- It writes the suggestions to a Google Sheet, and adds “N/A” if no good matches are found\n\n## Setup steps\n1. Turn on the Google Sheets API and create a sheet with your domain, target URLs, and keywords\n2. Create a SERP API account and get an API key\n3. Optional: Set up a Google Programmable Search Engine if you prefer not to use the SERP API\n4. Add your SERP API key and Google Sheets credentials to n8n.\n5. Run the workflow to generate internal link suggestions in your Google Sheet"
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "5d62c2bc-3ff0-4b0c-8af5-76d8fe285226",
"connections": {
"2f549918-a4ca-4a99-b60a-94b903c7f994": {
"main": [
[
{
"node": "172e75f7-9698-4c87-819e-edf94ea20612",
"type": "main",
"index": 0
}
]
]
},
"8c2aa4ad-94d0-4c52-b6bb-bee296a4420b": {
"main": [
[],
[
{
"node": "7fccd9bf-8f71-4adf-97e4-2eff330d757f",
"type": "main",
"index": 0
}
]
]
},
"172e75f7-9698-4c87-819e-edf94ea20612": {
"main": [
[
{
"node": "8c2aa4ad-94d0-4c52-b6bb-bee296a4420b",
"type": "main",
"index": 0
}
]
]
},
"420bdbbe-a304-4bfe-8cd8-54ab467a6d71": {
"main": [
[
{
"node": "44ca48a2-fae4-4de4-a5d7-e4d16960b914",
"type": "main",
"index": 0
}
]
]
},
"44ca48a2-fae4-4de4-a5d7-e4d16960b914": {
"main": [
[
{
"node": "8c2aa4ad-94d0-4c52-b6bb-bee296a4420b",
"type": "main",
"index": 0
}
]
]
},
"7fccd9bf-8f71-4adf-97e4-2eff330d757f": {
"main": [
[
{
"node": "420bdbbe-a304-4bfe-8cd8-54ab467a6d71",
"type": "main",
"index": 0
}
]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
중급 - 콘텐츠 제작, 멀티모달 AI
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
템플릿 HP - 콘텐츠 스케줄링
GPT-4, Apify 및 Google Sheets를 사용하여 Instagram 콘텐츠 일정 자동 생성
Set
Code
Wait
+
Set
Code
Wait
24 노드keisha kalra
콘텐츠 제작
Printify 자동화 - 제목 및 설명 업데이트 - AlexK1919
GPT-4o-mini를 사용하여 Printify용 SEO 제품 제목 및 설명 자동 생성
If
Set
Code
+
If
Set
Code
26 노드Amit Mehta
콘텐츠 제작
WooCommerce Nano Banana용 AI 가상 피팅
Fal.ai Nano Banana를 사용하여 WooCommerce용 가상 AI 피팅 이미지 자동 생성
If
Set
Wait
+
If
Set
Wait
20 노드Davide
콘텐츠 제작
Google Maps 데이터 추출
Perplexity AI 및 이메일 검증을 통한 Google Maps 잠재고객 생성 자동화
If
Set
Code
+
If
Set
Code
18 노드Antxon Pous
콘텐츠 제작
Meta Graph API로 Google 스프레드시트에서 Instagram 스토리 게시 자동화
Meta Graph API를 통한 Google 스프레드시트에서 Instagram 스토리 게시 자동화
If
Set
Sort
+
If
Set
Sort
19 노드iMan
콘텐츠 제작
OpenAI, ElevenLabs 및 Fal.ai를 사용한 비디오, 팟캐스트 및 ASMR용 바이럴 콘텐츠 제작 자동화
OpenAI, ElevenLabs 및 Fal.ai를 사용한 비디오, 팟캐스트 및 ASMR용 바이럴 콘텐츠 제작 자동화
Set
Code
Wait
+
Set
Code
Wait
97 노드Adam Crafts
콘텐츠 제작
워크플로우 정보
난이도
중급
노드 수12
카테고리2
노드 유형6
저자
Robin Geuens
@robingeuensHi, I'm Robin. I'm a veteran marketer of 7 years and love automation. If you have any questions about automation feel free to reach out to me on LinkedIn: https://www.linkedin.com/in/rgeuens/
외부 링크
n8n.io에서 보기 →
이 워크플로우 공유