Landing Page Auditor
페이지와 방문자를 모두 분석하는 감사 도구입니다. 모든 발견 사항은 이 스킬이 실행한 호출에서 비롯되며, 각 발견 사항 뒤에는 숫자나 페이지 요소가 표시됩니다.
시작하기 전에
InsightfulPipe MCP가 연결되어 있어야 합니다. Google Analytics 4와 DataForSEO가 주요 경로를 담당하며, 다른 소스들이 이를 보완합니다.
- 각 플랫폼에 대해
request="accounts"와 함께query_contexts를 호출하세요:google-analytics,google-search-console,dataforseo,screenshot,pagespeed-insights, 그리고 페이지가 유료 트래픽을 받는 경우google-ads도 포함합니다.workspace_id,brand_id, GA4의property_id, Search Console의site_url을 기록하세요. 여러 속성이 있는 경우 어떤 사이트인지 물어보세요. request="actions_details"와 함께query_contexts를 호출하여get_report및list_key_events(google-analytics),search_analytics,onpage_instant_pages,capture,core-web-vitals,accessibility-seo및gaql에 대한 정보를 얻고, 반환된 본문 형태를 따르세요.- 세 가지 정보를 요청하고, 사용자가 모르는 경우 기본값을 사용하세요:
- 페이지: 기본값: GA4에서 세션이 가장 많은 랜딩 페이지 (1단계).
- 페이지가 존재하는 하나의 행동 (가입, 구매, 데모 예약, 전화, 다운로드). 기본값: 히어로 영역의 첫 번째 CTA가 가리키는 대상.
- 페이지 유형: 유료 랜딩 페이지, 홈페이지, 판매 페이지, 가격, 기능, 제품, 리드 생성, 이벤트. 기본값: URL과 트래픽 구성을 기반으로 추론하고 그렇게 명시합니다.
날짜. GA4는 하루를 처리하는 데 하루나 이틀이 필요하며, 아직 처리되지 않은 날짜는 참여가 없는 세션을 보여줍니다. 오늘로부터 2일 전까지의 최근 28일을 사용하세요. Search Console은 더 지연됩니다: 창을 오늘로부터 3일 전에 종료하세요. 보고서 상단에 두 창을 모두 명시하세요.
쿼리 실행 방법
아래의 모든 본문은 지정된 플랫폼, workspace_id 및 brand_id와 함께 query_data를 통해 전달됩니다. 날짜는 테스트 실행에서 가져온 것입니다. 자신의 창을 사용하세요. 경로 / 및 https://example.com/은 감사할 페이지를 나타냅니다. API가 적용하는 규칙 또는 데이터 요구 사항:
- **GA4
landingPage**는 호스트가 없는 경로입니다 (/pricing). 값이 비어 있거나(not set)인 행은 페이지 보기가 없는 세션입니다. 페이지 순위에서 제외하고 그 수를 알려주세요. - GA4 필터는
filter/stringFilter(matchTypeEXACT),inListFilter또는 표현식의andGroup과 함께dimensionFilter를 사용합니다. - Search Console은 호스트와 사이트가 사용하는 후행 슬래시를 포함한 전체 URL을 필터링합니다.
- Google Ads GAQL:
ORDER BY의 모든 항목은SELECT에도 있어야 합니다. 금액은_micros단위입니다. 1,000,000으로 나누세요. - **DataForSEO
custom_js**는 레이아웃 엔진이 없는 페이지 모델에서 실행됩니다:getBoundingClientRect,innerHeight및 계산된 스타일은 없으며,NodeList.forEach는 실패합니다. 일반for루프와 DOM 순서를 사용하고, 스크립트를 약 2,000자 미만으로 유지하며, 응답이 비어 있을 때custom_js_client_exception을 읽으세요. 각onpage_instant_pages호출은 페이지당 한 번 청구됩니다.
호출이 실패하면 계속 진행하세요. 실패한 호출이 제공하는 정보를 unknown으로 표시하고, 어떤 호출이 왜 실패했는지 말한 후, 실패한 페이지 도구를 마지막에 한 번 다시 시도하세요. 추측으로 빈칸을 채우지 마세요.
1단계: 페이지 선택 및 추적 확인
{"platform": "google-analytics", "action": "get_report", "property_id": "properties/<PROPERTY_ID>",
"dimensions": ["date"], "metrics": ["sessions", "engagedSessions", "keyEvents"],
"start_date": "2026-09-06", "end_date": "2026-10-05"}
이 일일 확인을 어제까지의 지난 30일 동안 실행하세요.
- 추적 변경: 특정 날짜의 세션이 그 이전 7일의 중앙값보다 최소 5배 많고, 이후 날짜도 그 수준을 유지하면, 해당 날짜에 태그가 변경된 것입니다 (감소의 경우 반대). 새 수준의 첫날부터 창을 시작하세요.
- 처리되지 않은 날짜: 세션이 있지만 참여 세션이 0인 최근 날짜는 아직 처리되지 않은 것입니다. 창에서 제외하세요.
- 짧은 창: 7일 미만이 남은 경우 감사는 계속 실행되지만, 보고서 상단에 비율이 방향성(directional)임을 명시하세요.
{"platform": "google-analytics", "action": "get_report", "property_id": "properties/<PROPERTY_ID>",
"dimensions": ["landingPage"],
"metrics": ["sessions", "engagedSessions", "engagementRate", "keyEvents", "averageSessionDuration"],
"start_date": "2026-10-01", "end_date": "2026-10-04",
"orderBys": [{"metric": {"metricName": "sessions"}, "desc": true}], "limit": 25}
사이트 전체 참여율을 위해 deviceCategory를 유일한 차원으로 사용하여 동일한 보고서를 실행하세요. 사용자가 페이지를 지정하지 않은 경우, 세션이 가장 많은 랜딩 페이지를 감사하고 다음 4개 페이지를 다른 실행을 위한 후보로 나열하세요.
2단계: 측정 – 페이지 전환이 계산되나요?
{"platform": "google-analytics", "action": "list_key_events", "property_id": "properties/<PROPERTY_ID>"}
{"platform": "google-analytics", "action": "get_report", "property_id": "properties/<PROPERTY_ID>",
"dimensions": ["pagePath", "eventName"], "metrics": ["eventCount", "totalUsers"],
"start_date": "2026-10-01", "end_date": "2026-10-04",
"dimensionFilter": {"filter": {"fieldName": "pagePath", "stringFilter": {"matchType": "EXACT", "value": "/"}}}}
{"platform": "google-analytics", "action": "get_report", "property_id": "properties/<PROPERTY_ID>",
"dimensions": ["pagePath", "linkUrl", "outbound"], "metrics": ["eventCount"],
"start_date": "2026-10-01", "end_date": "2026-10-04",
"dimensionFilter": {"andGroup": {"expressions": [
{"filter": {"fieldName": "pagePath", "stringFilter": {"matchType": "EXACT", "value": "/"}}},
{"filter": {"fieldName": "eventName", "stringFilter": {"matchType": "EXACT", "value": "click"}}}]}}}
| 결과 | 조건 |
|---|---|
| 측정됨 | 랜딩 보고서에 페이지에 대한 주요 이벤트가 표시되거나, 페이지에서 주요 이벤트가 발생합니다. |
| 부분적 | CTA 클릭만 기록됩니다 (linkUrl이 CTA의 대상인 클릭 이벤트). |
| 측정되지 않음 | 둘 다 아닙니다. |
- 이름에 "test" 또는 "qa"가 포함된 주요 이벤트는 계산하지 않습니다. 구성된 개수와 창 내에서 발생한 개수를 보고하세요.
- GA4의 내장
click이벤트는 아웃바운드 링크만 기록합니다. 사이트 내 링크와 교차 도메인 측정을 위해 설정된 도메인에 대한 링크는 기록되지 않습니다. 따라서 CTA 대상에 대한 클릭 행이 없으면 "측정되지 않음"이며, "아무도 클릭하지 않음"이 아닙니다. - 페이지가 측정되지 않으면 전환율이 없습니다. 프록시를 사용하고 프록시라고 레이블을 지정하세요: 참여율, 전환 경로에 도달하는 페이지 세션 비율 (3단계), 90% 스크롤 (내장
scroll이벤트;deviceCategory를 이벤트 보고서에 추가하여 장치별로 분할, 본 사용자 대비 본 사용자 수).
3단계: 누가 도착하고, 어디로 가는가
{"platform": "google-analytics", "action": "get_report", "property_id": "properties/<PROPERTY_ID>",
"dimensions": ["landingPage", "sessionDefaultChannelGroup", "sessionSourceMedium"],
"metrics": ["sessions", "engagedSessions", "engagementRate"],
"start_date": "2026-10-01", "end_date": "2026-10-04",
"dimensionFilter": {"filter": {"fieldName": "landingPage", "stringFilter": {"matchType": "EXACT", "value": "/"}}}}
채널 차원 대신 deviceCategory를 사용하여 다시 실행하고, pagePath와 메트릭 sessions (세션별 상위 10개)를 사용하여 페이지가 사람들을 어디로 보내는지 한 번 더 확인하세요. 첫 번째 행은 일반적으로 페이지 자체이므로, 10개 행은 9개의 다음 페이지를 보여줍니다. 그런 다음:
- 소스: 각 채널의 세션 비율과 참여율. 세션이 10개 이상이고 참여가 0인 소스는 트래픽 문제 (봇, 미리보기 페처 또는 잘못된 태그)이지 페이지 문제가 아닙니다. 이를 플래그 지정하고, 해당 소스를 포함 및 제외한 페이지의 참여율을 제공하세요.
- 장치: 모바일 비율은 모바일 발견 사항의 가중치를 결정합니다.
- 전환 경로: 가격, 데모, 가입 또는 체크아웃 페이지에 도달하는 세션의 비율.
- 유료 트래픽 확인:
google / cpc세션은 세션에sessionGoogleAdsCustomerId가 있거나 광고 계정이 이 URL에 대한 클릭을 표시하는 경우에만 Google Ads로 간주됩니다. 그렇지 않으면 "확인되지 않은 유료"라고 부르고 명시하세요.
{"platform": "google-analytics", "action": "get_report", "property_id": "properties/<PROPERTY_ID>",
"dimensions": ["landingPage", "sessionCampaignName", "sessionGoogleAdsCustomerId"], "metrics": ["sessions", "engagedSessions"],
"start_date": "2026-10-01", "end_date": "2026-10-04",
"dimensionFilter": {"andGroup": {"expressions": [
{"filter": {"fieldName": "landingPage", "stringFilter": {"matchType": "EXACT", "value": "/"}}},
{"filter": {"fieldName": "sessionSourceMedium", "stringFilter": {"matchType": "EXACT", "value": "google / cpc"}}}]}}}
자연 검색 의도 (Search Console):
{"platform": "google-search-console", "action": "search_analytics", "site_url": "https://example.com/",
"dimensions": ["query"], "start_date": "2026-09-06", "end_date": "2026-10-03", "row_limit": 25,
"dimension_filter_groups": [{"filters": [{"dimension": "page", "operator": "equals", "expression": "https://example.com/"}]}]}
브랜드 쿼리 (비즈니스 이름 및 철자 오류)를 나머지와 분할하고, 클릭의 브랜드 점유율을 제공하세요. 브랜드 방문자는 이미 이름을 알고 있습니다: 페이지는 이를 확인하고 라우팅해야 합니다. 비브랜드 쿼리는 헤드라인이 반영해야 할 단어를 전달합니다.
유료 메시지 일치 (Google Ads):
SELECT landing_page_view.unexpanded_final_url, metrics.clicks, metrics.cost_micros, metrics.conversions
FROM landing_page_view WHERE segments.date DURING LAST_30_DAYS ORDER BY metrics.clicks DESC LIMIT 20
SELECT ad_group_ad.ad.final_urls, ad_group_ad.ad.responsive_search_ad.headlines, metrics.clicks, metrics.impressions
FROM ad_group_ad WHERE segments.date DURING LAST_30_DAYS AND ad_group_ad.status = 'ENABLED'
ORDER BY metrics.clicks DESC LIMIT 20
SELECT ad_group.name, ad_group_criterion.keyword.text, ad_group_criterion.quality_info.post_click_quality_score,
ad_group_criterion.final_urls, metrics.clicks
FROM keyword_view WHERE segments.date DURING LAST_30_DAYS AND metrics.clicks > 0 ORDER BY metrics.clicks DESC LIMIT 50
account_id와 함께 action="gaql"을 통해 실행하세요. landing_page_view에 페이지에 대한 행이 없으면 다른 두 개는 건너뛰세요: 일치시킬 유료 트래픽이 없습니다. post_click_quality_score는 키워드에 대한 Google의 랜딩 페이지 경험 평가 (평균 이상, 평균, 평균 이하)입니다. 키워드 최종 URL은 광고의 URL이 사용되므로 종종 비어 있습니다. 따라서 키워드는 광고 그룹을 통해 페이지에 연결하세요. final_urls가 페이지를 가리키는 광고를 유지하고, 해당 광고의 헤드라인을 페이지의 H1 및 오퍼와 비교하세요. Meta, LinkedIn 또는 기타 광고, 또는 페이지에 링크된 이메일의 경우, 사용자에게 광고 또는 이메일 (헤드라인, 본문, 오퍼 및 CTA)을 붙여넣도록 요청하고 동일한 방식으로 페이지와 비교하세요: H1이 헤드라인을 반영하고, 모든 오퍼와 주장이 페이지에 있으며, 페이지의 CTA가 광고를 이어갑니다. ad-landing-page-match-scorer 스킬이 설치된 경우 더 자세히 분석합니다.
4단계: 페이지 분해
{"platform": "dataforseo", "action": "onpage_instant_pages", "url": "https://example.com/", "enable_javascript": true,
"custom_js": "var o={seq:[],nav:0,links:document.links.length,forms:document.forms.length,inputs:document.querySelectorAll('input,select,textarea').length,imgs:0,noalt:0,vid:document.querySelectorAll('video,iframe').length,proof:{}};function E(l,f){for(var i=0;i<l.length;i++)f(l[i])}function t(e){return(e.textContent||'').replace(/\\s+/g,' ').trim()}function C(e){for(var p=e;p;p=p.parentNode){var n=(p.tagName||'').toLowerCase();if(n=='nav'||n=='header'||n=='footer')return 1}return 0}var f=0;E(document.querySelectorAll('h1,p'),function(e){if(e.tagName=='H1')f=1;else if(f==1&&t(e)){o.sub=t(e).slice(0,200);f=2}});E(document.querySelectorAll('h1,h2,h3,a[href],button'),function(e){var n=e.tagName.toLowerCase();if(n.charAt(0)=='h'){o.seq.push([n,t(e).slice(0,90)]);return}if(C(e))return;var c=(e.getAttribute('class')||'')+' '+(e.getAttribute('role')||'');if(n=='a'&&!/btn|button|cta|bg-/.test(c))return;var x=t(e).slice(0,50);if(x)o.seq.push(['cta',x,(e.getAttribute('href')||'').slice(0,80)])});E(document.querySelectorAll('header a[href],nav a[href]'),function(){o.nav++});E(document.querySelectorAll('img'),function(e){o.imgs++;if(!e.hasAttribute('alt'))o.noalt++});var x=t(document.body);o.words=x.split(' ').length;var p={testimonial:/testimonial|what .{0,12}say/i,rating:/★|\\d(\\.\\d)? ?\\/ ?5|g2|capterra|trustpilot/i,logos:/trusted by|used by|customers include/i,count:/\\d[\\d,]*\\+? (customers|users|teams|companies|marketers)/i,works_with:/works with|integrates with/i,security:/soc ?2|gdpr|encrypt/i,guarantee:/guarantee|refund|cancel anytime/i,faq:/faq|frequently asked/i};for(var k in p){var m=x.match(p[k]);o.proof[k]=m?m[0].slice(0,40):null}o;"}
custom_js_response는 읽기 순서대로 페이지 (seq: 헤더, 탐색 및 바깥 영역 외부의 제목 및 CTA), H1 뒤의 첫 번째 단락 (sub), 개수 및 각 증거 유형에 대한 첫 번째 일치를 반환합니다. 다음과 같이 읽으세요:
- 히어로: 첫 번째
h2이전의 모든 것. H1, 부제목 및 CTA를 기록하세요. - CTA: 대상(
href)이 있는 요소만 CTA입니다. 대상이 없는 버튼은 탭, 아코디언 또는 쿠키 배너입니다. 고유한 대상을 세고, 긴 페이지 중간 이후에 기본 CTA가 다시 나타나는지 확인하세요. - 증거: 일치는 단서일 뿐, 확정이 아닙니다. 계산하기 전에 주변 텍스트를 확인하세요: 제품 데모의 숫자 또는 FAQ 답변의 "보안"은 증거가 아닙니다. "함께 작동" 로고는 호환성을 보여주지만 고객은 아닙니다.
- 이탈: 헤더 및 탐색 링크 수 (
nav). 유료 랜딩 페이지에서 모든 링크는 이탈 경로입니다. - 양식:
forms및inputs. - 표준 응답에서:
meta.title,meta.htags,meta.content.plain_text_word_count, 가독성 지수 및checks(no_h1_tag,has_render_blocking_resources,no_image_alt,title_too_long).no_image_alt는 스크립트가 alt 속성을 찾을 때에도 true일 수 있습니다...
... (잘림)