Google Sheets, GSC & ChatGPT API

Google Sheets, GSC & ChatGPT API – SEO Analizi

SEO analizi zaman alıcı olabilir, ancak sürecin otomatikleştirilmesi tekrarlayan görevlerin ortadan kaldırılmasına ve önemli web sitesi optimizasyonlarının hızlandırılmasına yardımcı olur.

Bu kılavuz, SEO denetimlerini kolaylaştırmak ve yapay zeka destekli içgörüler elde etmek için Google E-Tablolar, Google Search Console (GSC) ve ChatGPT API’sini kullanarak özel bir aracın nasıl oluşturulacağını gösterecektir .

Bu araçla şunları yapabileceksiniz:

  • Daha hızlı analiz için GSC veri alımını otomatikleştirin.
  • Eyleme dönüştürülebilir SEO önerileri oluşturmak için yapay zekayı kullanın.

GSC’ye bağlı bir etki alanından bir URL seçeceksiniz, ChatGPT API anahtarınızı gireceksiniz, sayfayı inceleyeceksiniz ve yapay zeka destekli bir analiz çalıştıracaksınız; tüm bunları Google E-Tablolar içinde yapacaksınız.

Hangi SEO analizlerini otomatize ediyoruz?

Bu araç kurulduktan sonra, GSC’den anahtar kelime sıralamaları, yönlendiren URL’ler, son tarama tarihi ve robots.txt dosyasındaki dizinleme durumu dahil olmak üzere önemli SEO verilerine hızlı bir şekilde erişmenizi sağlayacaktır.

ChatGPT, şu konularda analizler yaparak ve öneriler sunarak süreci iyileştirir:

  • Başlık etiketleri .
  • Meta açıklamaları .
  • Başlık etiketleri.
  • İçerik.
  • Anahtar kelime yerleşimi.
  • İç bağlantı .
  • Mobil optimizasyon.
  • Yerel SEO.
  • Şema işaretlemesi.

Bu komut dosyası her şeyi kapsamasa da saniyeler içinde ayrıntılı sayfa içgörüleri sunarak saatlerce manuel çalışma yapmanıza gerek kalmaz.

Daha sonra önerileri inceleyip hangi iyileştirmeleri uygulayacağınıza karar verebilirsiniz.

Kendi GSC özel aracınızı ve betiğinizi kurmak için 8 adım

Senaryonuzu kurmak ilk başta bunaltıcı gelebilir, ancak her adımı dikkatlice takip edin ve her şeyin çalıştığından emin olmak için senaryoyu kopyalayın.

Başlamak için birkaç şeye ihtiyacınız olacak:

Şimdi, bu “aracı” çalışır hale getirmek için sekiz adımlı sürecimde size rehberlik edeceğim.

Adım 1: Aracınız için Google E-Tablosu oluşturun

Eğer bir Google hesabınız varsa, bu işlemi şu adımları izleyerek yapabilirsiniz:

  • Google Drive’ı açın.
  • Aracınızı yerleştirmek istediğiniz klasöre gidin.
  • Arkaplana sağ tıklayın .
  • Google E-Tablolar > Boş elektronik tablo öğesini seçin .

Sayfanın adını istediğiniz gibi değiştirebilirsiniz, ancak ben şunu seçtim: GSC Özel Aracı.

Adım 2: Sayfanızı doldurun

Aşağıdaki adımları dikkatlice izleyerek sayfayı doldurun:

  • “GSC özelliğini seç” ifadesini ekleyin A1.
  • “URL Seçin” ifadesini ekleyin A2.

“Denetim Sonuçları” na geçin A15ve ekleyin. Bunun altına, sırasıyla A15A25aşağıdakileri ekleyin:

  • Bağlantı adresi:
  • Kapsam:
  • Robotlar.txt:
  • Dizinleme Durumu:
  • Son Tarama:
  • Google Kanonik:
  • Kullanıcı Kanonik:
  • Mobil Kullanılabilirlik:
  • Zengin Sonuçlar Uygunluğu:
  • Yönlendiren URL’ler:

D1, ChatGPT API anahtarınızı yapıştıracaksınız . Bu anahtarınız yoksa lütfen yukarıdaki bağlantıya gidin ve bu aracın çalışması için bir tane aldığınızdan emin olun.

“AI Analiz Sonucu”nu F1ve “İstem ChatGPT’ye Gönderildi”yi ekleyin G1.

Şimdi, bu iki sütundaki birkaç satırı birleştirmemiz gerekiyor. Aşağıdaki adımları izleyerek birleştireceksiniz F2– F30ve G2G30

  • Birleştirilecek satırları seçin.
  • Biçim > Hücreleri birleştir > Dikey olarak birleştir seçeneğine gidin .

Birleştirmeniz gereken F ve G satırları için bu adımı tekrarlayın.

Adım 3: Bir Google Cloud projesi oluşturun

Araç için  bir Google Cloud Console veri projesi oluşturun .

Kurulum tamamlandıktan sonra “GSC Özel Aracı” adında yeni bir proje oluşturun.

Bunu , Proje Seç > Yeni Proje’ye giderek ve yukarıdaki ekran görüntüsünde olduğu gibi bilgileri doldurarak  yapabilirsiniz .

Projeye isim vermeyi tamamladığınızda Oluştur’a tıklayın .

Şimdi Google Search Console API’sini projenize bağlayalım.

Arama çubuğuna gidin ve “Google Search Console API” yazın, seçin ve sonraki ekranda Etkinleştir’e tıklayın.

Hala yapmamız gereken çok şey var ve bu projeyi en kısa zamanda yeniden ele alacağız.

Adım 4: Erişim kimlik bilgilerini ekleyin

Daha fazla ayarlama yapmak için Google Cloud Console’unuza dönün.

Ekranın sol tarafındaki Kimlik Bilgileri’ne tıklayın :

Ekranın üst kısmındaki + Kimlik Bilgilerini Oluştur’a tıklayın ve OAuth istemci kimliğini seçin .

Configure Consent Screen’e gidin ve External’i seçin . Ekranı oluşturun ve ardından şunları girin:

  • Uygulama adı.
  • Destek e-postası (GSC hesabına bağlı).
  • Geliştiricinin iletişim bilgileri.

Kaydedin ve Add or Remove Scopes yazan bir sonraki ekrana geçin .

Google Search Console API kapsamlarını seçin ve güncelleyin. Ardından, Kaydet ve devam et .

Erişim izni vermek istediğiniz kullanıcıları ekleyin ve ardından Kaydet ve devam et’e tıklayın .

Adım 5: GSC verileri için bir Google Cloud projesine geçin

Hamburger simgesine tıklayın ve Bulut genel görünümü > Gösterge Tablosu’na gidin .

Sayfada bulunan Proje numaranızı kopyalamak istiyorsunuz .

Proje numarasına gidin, seçin ve CTRL + C kullanarak kopyalayın.

Google E-Tablolar dosyanıza gidin ve Proje Ayarları yazan dişli simgesine tıklayın .

Proje numaranızı metin kutusuna yapıştırın ve Projeyi ayarla’ya tıklayın .

Adım 6: Google Apps Komut Dosyanıza Gidin

Şimdi Proje Ayarlarınıza geri dönecek ve düzenleyicide  “appsscript.json” dosyasını göster’e tıklayacaksınız.

Editörün içinde appsscript.json dosyasına gidin ve dosyadaki her şeyi aşağıdaki kodla değiştirin:

{
  "timeZone": "America/New_York",
  "dependencies": {},
  "exceptionLogging": "STACKDRIVER",
  "oauthScopes": [
    "https://www.googleapis.com/auth/webmasters",
    "https://www.googleapis.com/auth/webmasters.readonly",
    "https://www.googleapis.com/auth/script.external_request",
    "https://www.googleapis.com/auth/spreadsheets",
    "https://www.googleapis.com/auth/spreadsheets.currentonly"
  ],
  "runtimeVersion": "V8"
}

Her şeyi yapıştırdıktan sonra Code.js dosyasına gidip şu kodu yapıştıracaksınız:

// Store the OAuth token and logs in script properties

const scriptProperties = PropertiesService.getScriptProperties();
const OPENAI_URL = “https://api.openai.com/v1/chat/completions”;
const SYSTEM_MESSAGE = { role: “system”, content: “You are a helpful SEO expert.” };
function log(message) {
Logger.log(message); // Regular Apps Script logging
constlogs = scriptProperties.getProperty(‘customLogs’) || ”;
scriptProperties.setProperty(‘customLogs’, logs + ‘\n’ + message); // Append message to logs
}
function resetLogs() {
scriptProperties.deleteProperty(‘customLogs’); // Clear logs for a new execution
}
function getLogs() {
returnscriptProperties.getProperty(‘customLogs’) || ‘No logs available.’;
}
function fetchOAuthToken() {
lettoken = scriptProperties.getProperty(‘oauthToken’);
if (!token) {
token = ScriptApp.getOAuthToken();
scriptProperties.setProperty(‘oauthToken’, token);
log(‘OAuth token fetched and stored.’);
}
returntoken;
}
function onOpen() {
constui = SpreadsheetApp.getUi();
ui.createMenu(‘Search Console’)
.addItem(‘Authorize GSC’, ‘promptReauthorization’)
.addItem(‘Fetch GSC Properties’, ‘fetchGSCProperties’)
.addItem(‘Select URL’, ‘fetchUrlsForSelectedProperty’)
.addItem(‘Fetch Keywords’, ‘fetchKeywordsForSelectedUrl’) // Yeni menü ekleme
.addItem(‘Inspect URL’, ‘inspectUrl’)
.addItem(‘AI Analyze’, ‘aiAnalyze’)
.addToUi();
}
function fetchKeywordsForSelectedUrl() {
constsheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
constselectedProperty = sheet.getRange(‘B1’).getValue();
constselectedUrl = sheet.getRange(‘B2’).getValue();
if (!selectedProperty || selectedProperty === ‘Select a property’ || !selectedUrl || selectedUrl === ‘Select a URL’) {
SpreadsheetApp.getUi().alert(‘Please select a valid property and URL before fetching keywords.’);
return;
}
constoauthToken = fetchOAuthToken();
constkeywords = getTopKeywordsForUrl(selectedProperty, selectedUrl, oauthToken);
if (!keywords || keywords.length === 0) {
sheet.getRange(‘A3’).setValue(‘No keywords found’).setFontWeight(‘bold’);
return;
}
sheet.getRange(‘A3:D12’).clearContent();
sheet.getRange(‘A3’).setValue(‘Keyword’).setFontWeight(‘bold’);
sheet.getRange(‘B3’).setValue(‘Clicks’).setFontWeight(‘bold’);
sheet.getRange(‘C3’).setValue(‘Impressions’).setFontWeight(‘bold’);
sheet.getRange(‘D3’).setValue(‘CTR’).setFontWeight(‘bold’);
keywords.forEach((keyword, index) => {
if (index < 10) {
sheet.getRange(`A${3 + index}`).setValue(keyword.query).setFontWeight(‘bold’);
sheet.getRange(`B${3 + index}`).setValue(keyword.clicks);
sheet.getRange(`C${3 + index}`).setValue(keyword.impressions);
sheet.getRange(`D${3 + index}`).setValue(keyword.ctr);
}
});
}
function fetchUrlsForSelectedProperty() {
constsheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
constselectedProperty = sheet.getRange(‘B1’).getValue();
if (!selectedProperty || selectedProperty === ‘Select a property’) {
SpreadsheetApp.getUi().alert(‘Please select a valid property before fetching URLs.’);
return;
}
constoauthToken = fetchOAuthToken();
consturls = getUrlsForProperty(selectedProperty, oauthToken);
if (!urls || urls.length === 0) {
sheet.getRange(‘A2’).setValue(‘No URLs found’).setFontWeight(‘bold’);
sheet.getRange(‘B2’).clearContent();
log(`No URLs found for property ${selectedProperty}`);
return;
}
sheet.getRange(‘A2’).setValue(‘Select a URL’).setFontWeight(‘bold’);
sheet.getRange(‘B2’).setDataValidation(
SpreadsheetApp.newDataValidation()
.requireValueInList([‘Select a URL’].concat(urls), true)
.build()
);
sheet.getRange(‘B2’).setValue(‘Select a URL’).setFontWeight(‘bold’);
}
function promptReauthorization() {
constui = SpreadsheetApp.getUi();
constresponse = ui.alert(
‘Re-authorize Script’,
‘Re-authorizing will revoke current permissions and require you to authorize again. Do you want to continue?’,
ui.ButtonSet.YES_NO
);
if (response === ui.Button.YES) {
try {
scriptProperties.deleteProperty(‘oauthToken’); // Clear old token
consttoken = fetchOAuthToken(); // Fetch and store new token
log(“OAuth Token: ” + token);
ui.alert(‘Authorization successful. No further action is required.’);
} catch (e) {
ui.alert(‘Authorization failed: ‘ + e.toString());
}
} else {
ui.alert(‘Re-authorization canceled.’);
}
}
function fetchGSCProperties() {
resetLogs();
constsheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
constoauthToken = fetchOAuthToken();
constsites = getSitesListFromGSC(oauthToken);
if (!sites || sites.length === 0) {
SpreadsheetApp.getUi().alert(‘No GSC properties found. Please ensure you have access to GSC properties.’);
return;
}
constsiteUrls = [‘Select a property’].concat(
sites.map(site => site.siteUrl).sort()
);
sheet.getRange(‘A1’).setValue(‘Select GSC property’).setFontWeight(‘bold’);
sheet.getRange(‘B1’).setDataValidation(
SpreadsheetApp.newDataValidation()
.requireValueInList(siteUrls, true)
.build()
);
sheet.getRange(‘B1’).setValue(‘Select a property’).setFontWeight(‘bold’);
sheet.setColumnWidth(1, 150);
sheet.setColumnWidth(2, 350);
}
let isProcessing = false; // Global flag to prevent recursive triggering
function getApiRequestDetails(selectedProperty) {
constpayload = {
startDate: getThreeMonthsAgo(),
endDate: getToday(),
dimensions: [“page”],
rowLimit: 100,
orderBy: [{ fieldName: “clicks”, sortOrder: “DESCENDING” }]
};
constapiUrl = `https://www.googleapis.com/webmasters/v3/sites/${encodeURIComponent(selectedProperty)}/searchAnalytics/query`;
return { url: apiUrl, payload: payload };
}
function getSitesListFromGSC(oauthToken) {
try {
consturl = ‘https://www.googleapis.com/webmasters/v3/sites’;
constheaders = {
‘Authorization’: ‘Bearer ‘ + oauthToken,
‘Content-Type’: ‘application/json’
};
constoptions = {
method: ‘get’,
headers: headers,
muteHttpExceptions: true
};
constresponse = UrlFetchApp.fetch(url, options);
log(`Response Code: ${response.getResponseCode()}`);
log(`Response Content: ${response.getContentText()}`);
if (response.getResponseCode() === 200) {
constjson = JSON.parse(response.getContentText());
returnjson.siteEntry || [];
} else {
thrownewError(`Error fetching data: ${response.getResponseCode()} – ${response.getContentText()}`);
}
} catch (e) {
log(`Error: ${e.toString()}`);
return [];
}
}
function getUrlsForProperty(property, oauthToken) {
try {
constapiUrl = `https://www.googleapis.com/webmasters/v3/sites/${encodeURIComponent(property)}/searchAnalytics/query`;
log(`API URL: ${apiUrl}`);
log(`OAuth Token: ${oauthToken}`);
constpayload = {
startDate: getThreeMonthsAgo(),
endDate: getToday(),
dimensions: [“page”],
rowLimit: 100,
orderBy: [{ fieldName: “clicks”, sortOrder: “DESCENDING” }]
};
log(`Payload: ${JSON.stringify(payload)}`);
constheaders = {
Authorization: `Bearer ${oauthToken}`,
“Content-Type”: “application/json”
};
constoptions = {
method: “post”,
contentType: “application/json”,
headers: headers,
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
constresponse = UrlFetchApp.fetch(apiUrl, options);
log(`Response Code: ${response.getResponseCode()}`);
log(`Response: ${response.getContentText()}`);
if (response.getResponseCode() === 200) {
constjson = JSON.parse(response.getContentText());
returnjson.rows ? json.rows.map(row => row.keys[0]) : [];
} else {
thrownewError(`Failed to fetch data: ${response.getResponseCode()} – ${response.getContentText()}`);
}
} catch (e) {
log(`Error: ${e.toString()}`);
return [];
}
}
function getTopKeywordsForUrl(property, url, oauthToken) {
try {
constapiUrl = `https://www.googleapis.com/webmasters/v3/sites/${encodeURIComponent(property)}/searchAnalytics/query`;
log(`API URL: ${apiUrl}`);
log(`OAuth Token: ${oauthToken}`);
constpayload = {
startDate: getThreeMonthsAgo(),
endDate: getToday(),
dimensions: [“query”],
dimensionFilterGroups: [
{
filters: [
{
dimension: “page”,
operator: “equals”,
expression: url
}
]
}
],
rowLimit: 10,
orderBy: [{ fieldName: “clicks”, sortOrder: “DESCENDING” }]
};
log(`Payload: ${JSON.stringify(payload)}`);
constheaders = {
Authorization: `Bearer ${oauthToken}`,
“Content-Type”: “application/json”
};
constoptions = {
method: “post”,
contentType: “application/json”,
headers: headers,
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
constresponse = UrlFetchApp.fetch(apiUrl, options);
log(`Response Code: ${response.getResponseCode()}`);
log(`Response: ${response.getContentText()}`);
if (response.getResponseCode() === 200) {
constjson = JSON.parse(response.getContentText());
returnjson.rows ? json.rows.map(row => ({
query: row.keys[0],
clicks: row.clicks,
impressions: row.impressions,
ctr: row.ctr
})) : [];
} else {
thrownewError(`Failed to fetch data: ${response.getResponseCode()} – ${response.getContentText()}`);
}
} catch (e) {
log(`Error: ${e.toString()}`);
return [];
}
}
function getToday() {
consttoday = newDate();
returntoday.toISOString().split(“T”)[0];
}
function getThreeMonthsAgo() {
constdate = newDate();
date.setMonth(date.getMonth() – 3);
returndate.toISOString().split(“T”)[0];
}
function inspectUrl() {
constsheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
consturl = sheet.getRange(‘B2’).getValue();
constproperty = sheet.getRange(‘B1’).getValue();
// Clear previous inspection results in A15:D30
sheet.getRange(‘A15:D30’).clearContent();
sheet.getRange(‘A15’).setValue(‘Inspecting…’).setFontWeight(‘bold’);
if (!url || url === ‘Select a URL’) {
SpreadsheetApp.getUi().alert(‘Please select a valid URL in cell B2 before inspecting.’);
sheet.getRange(‘A15’).setValue(‘No URL selected’).setFontWeight(‘bold’);
return;
}
constoauthToken = fetchOAuthToken();
try {
constresult = callUrlInspectionApi(property, url, oauthToken);
// Extract fields from the response
constindexStatus = result.indexStatusResult || {};
constmobileUsability = result.mobileUsabilityResult || {};
constrichResults = result.richResultsInfo || {};
constreferringUrls = indexStatus.referringUrls?.join(‘, ‘) || ‘None’;
// Populate inspection results in the sheet
sheet.getRange(‘A15’).setValue(`Inspection Results`).setFontWeight(‘bold’);
sheet.getRange(‘A16’).setValue(`URL:`).setFontWeight(‘bold’);
sheet.getRange(‘B16’).setValue(url);
sheet.getRange(‘A17’).setValue(`Coverage:`).setFontWeight(‘bold’);
sheet.getRange(‘B17’).setValue(indexStatus.coverageState || ‘Unknown’);
sheet.getRange(‘A18’).setValue(`Robots.txt:`).setFontWeight(‘bold’);
sheet.getRange(‘B18’).setValue(indexStatus.robotsTxtState || ‘Unknown’);
sheet.getRange(‘A19’).setValue(`Indexing State:`).setFontWeight(‘bold’);
sheet.getRange(‘B19’).setValue(indexStatus.indexingState || ‘Unknown’);
sheet.getRange(‘A20’).setValue(`Last Crawled:`).setFontWeight(‘bold’);
sheet.getRange(‘B20’).setValue(indexStatus.lastCrawlTime || ‘Not Available’);
sheet.getRange(‘A21’).setValue(`Google Canonical:`).setFontWeight(‘bold’);
sheet.getRange(‘B21’).setValue(indexStatus.googleCanonical || ‘Unknown’);
sheet.getRange(‘A22’).setValue(`User Canonical:`).setFontWeight(‘bold’);
sheet.getRange(‘B22’).setValue(indexStatus.userCanonical || ‘Unknown’);
sheet.getRange(‘A23’).setValue(`Mobile Usability:`).setFontWeight(‘bold’);
sheet.getRange(‘B23’).setValue(mobileUsability.verdict || ‘Unknown’);
sheet.getRange(‘A24’).setValue(`Rich Results Eligibility:`).setFontWeight(‘bold’);
sheet.getRange(‘B24’).setValue(richResults.verdict || ‘Unknown’);
sheet.getRange(‘A25’).setValue(`Referring URLs:`).setFontWeight(‘bold’);
sheet.getRange(‘B25’).setValue(referringUrls);
// Log and alert full response for debugging
constfullResponse = JSON.stringify(result, null, 2);
log(`Full Inspection Result: ${fullResponse}`);
//SpreadsheetApp.getUi().alert(`Inspection Completed. Full Response:\n\n${fullResponse}`);
} catch (error) {
sheet.getRange(‘A15’).setValue(‘Inspection Failed’).setFontWeight(‘bold’);
log(`Error inspecting URL: ${error.message}`);
SpreadsheetApp.getUi().alert(`Error inspecting URL: ${error.message}\n\nLogs:\n${getLogs()}`);
}
}
function callUrlInspectionApi(property, url, oauthToken) {
constapiUrl = ‘https://searchconsole.googleapis.com/v1/urlInspection/index:inspect’;
constpayload = {
siteUrl: property,
inspectionUrl: url,
languageCode: ‘en-US’
};
constheaders = {
Authorization: `Bearer ${oauthToken}`,
‘Content-Type’: ‘application/json’
};
constoptions = {
method: ‘post’,
contentType: ‘application/json’,
headers: headers,
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
log(`API URL: ${apiUrl}`);
log(`Payload: ${JSON.stringify(payload)}`);
try {
constresponse = UrlFetchApp.fetch(apiUrl, options);
constresponseCode = response.getResponseCode();
constresponseText = response.getContentText();
log(`Response Code: ${responseCode}`);
log(`Response Content: ${responseText}`);
if (responseCode === 200) {
constjsonResponse = JSON.parse(responseText);
if (jsonResponse && jsonResponse.inspectionResult) {
returnjsonResponse.inspectionResult;
} else {
log(`Unexpected API Response Structure: ${responseText}`);
thrownewError(‘Unexpected API response format. “inspectionResult” field is missing.’);
}
} else {
log(`Failed API Call: ${responseText}`);
thrownewError(`Failed to inspect URL. Response Code: ${responseCode}. Response: ${responseText}`);
}
} catch (error) {
log(`Error during API call: ${error}`);
thrownewError(`Error inspecting URL: ${error.message}`);
}
}
function callChatGPT(prompt, temperature = 0.9, maxTokens = 800, model = “gpt-3.5-turbo”) {
constsheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
constsecretKey = sheet.getRange(‘D1’).getValue().trim(); // Retrieve the OpenAI API key from D1
if (!secretKey) {
thrownewError(“API Key is missing in cell D1. Please provide a valid OpenAI API key.”);
}
constpayload = {
model: model,
messages: [
SYSTEM_MESSAGE,
{ role: “user”, content: prompt }
],
temperature: temperature,
max_tokens: maxTokens
};
constoptions = {
method: “POST”,
headers: {
“Content-Type”: “application/json”,
“Authorization”: “Bearer ” + secretKey
},
payload: JSON.stringify(payload)
};
try {
constresponse = UrlFetchApp.fetch(OPENAI_URL, options);
constresponseData = JSON.parse(response.getContentText());
if (responseData.choices && responseData.choices[0] && responseData.choices[0].message) {
returnresponseData.choices[0].message.content.trim();
} else {
log(“Unexpected response format from OpenAI: ” + JSON.stringify(responseData));
return”Sorry, I couldn’t process the request.”;
}
} catch (error) {
log(“Error calling OpenAI API: ” + error);
return”Sorry, there was an error processing your request.”;
}
}
function aiAnalyze() {
constsheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
consturl = sheet.getRange(‘B2’).getValue();
constkeywords = sheet.getRange(‘A3:A12’).getValues().flat().filter(Boolean); // Get non-empty keywords
constinspectionData = sheet.getRange(‘A16:B20’).getValues();
// Validate input fields
if (!url || keywords.length === 0 || inspectionData.some(row => row.length < 2 || !row[0].trim() || !row[1].trim())) {
SpreadsheetApp.getUi().alert(“Ensure the following are filled before running AI Analyze:\n- URL in B2\n- Keywords in A3:A12\n- Inspection data in A16:B20”);
return;
}
// Prepare the prompt for ChatGPT
constprompt = `
Analyze this URL: ${url}
Also the view-source version from: ${url}
against these keywords: ${keywords.join(“, “)}
Considering the URL inspection data from Google Search Console:
${inspectionData.map(row => `${row[0]}: ${row[1]}`).join(“\n”)}
Suggest a short list of specific recommendations on how I can improve the page’s SEO. Make sure the recommendations include details such as change this to that, or add something, etc… Be concrete with SEO recommendations.
`;
// Display the prompt in G1
sheet.getRange(‘G1’).setValue(“Prompt Sent to ChatGPT”).setFontWeight(“bold”);
sheet.getRange(‘G2:G30’).clearContent(); // Clear previous content in column G
sheet.getRange(‘G2:G30’).merge(); // Merge cells G2:G30
sheet.getRange(‘G2’).setValue(prompt).setVerticalAlignment(“top”); // Add the prompt and align to top
sheet.setColumnWidth(7, 400); // Set column G width to 400px
// Call ChatGPT API
constanalysisResult = callChatGPT(prompt);
// Display the result in the spreadsheet (Column F)
sheet.getRange(‘F1’).setValue(“AI Analysis Result”).setFontWeight(“bold”);
sheet.getRange(‘F2:F30’).clearContent(); // Clear previous content
sheet.getRange(‘F2:F30’).merge(); // Merge the cells
sheet.getRange(‘F2’).setValue(analysisResult).setVerticalAlignment(“top”); // Add the AI result and align to top
sheet.setColumnWidth(6, 400); // Set column F width to 400px
// Log the response
log(“AI Analysis Completed: ” + analysisResult);
}
1719037803636

Yapay Zeka ile WordPress – Call Action

ChatGPT ile Teknik Geliştirme – Call Action

Son projelerimden birinde, WordPress siteleri için içeriklere dinamik olarak telefon bağlantısı ve pop-up form linki ekleyen bir fonksiyon geliştirdim.

📌 Telefon numarası ve form linki içeriğe ekleniyor ve kullanıcı bu linklere tıklayarak ya doğrudan arama yapabilir ya da pop-up formunu açabilir.

📌 Mesaj içeriğin sonuna ekleniyor.

📌 Sayfa başlığına özel bir mesaj oluşturuyor.

Kodun detaylarını ve SEO faydalarını inceleyin. Kendi projelerinizde nasıl kullanabileceğinizi değerlendirin!

Desteğe ihtiyaç duyarsanız DM’den yazabilirsiniz.

Kod: https://github.com

1716129464565

Yapay Zeka ile WordPress Geliştirme – Sayfalandırma

ChatGPT ile Teknik SEO Geliştirmeleri

WordPress kategori içeriklerinizde /page/2, /page/3 ve /page/4 gibi deva eden sayfalamalarda görünüyor ise, kopya riski var demektir.

📌 Arama motorları, aynı içeriği birden fazla URL’de bulduklarında bunu kopya içerik olarak değerlendirir.

📌 Aynı içeriği barındıran sayfaların çoğalması, bu bütçenin verimsiz kullanılmasına neden olabilir.

📌 Arama motorları, aynı içeriğe sahip farklı sayfalar arasında otoriteyi bölüştürebilir.

ChatGPT ile yazdığım kod sayesinde yalnızca kategori ilk sayfasındada içeriğin görünmesini sağlayabilirsiniz.

Kod:

global $wp_query;
$total_pages = $wp_query->max_num_pages;
$current_page = max( 1, get_query_var( ‘paged’ ) );
$term = get_queried_object();
if ( $term && $current_page == 1 ) {
echo ‘<div class=”container”>’ . term_description( $term->term_id, ‘product_cat’ ) . ‘</div>’;
}

1732047368096

Yapay Zeka ile WordPress Geliştirme – Ürün İsmi

ChatGPT ile Teknik SEO Geliştirmeleri

Woocemmerce sitenizde, ürün başlıklarını <h3> ile gösterilmesi arama motorlarının sayfanızı daha iyi anlamasına yardımcı olabilir.

📌Ürün başlıkları genellikle anahtar kelimeler içerir. Bu anahtar kelimeleri başlık etiketleri içinde kullanmak, arama motorlarına bu kelimelerin önemli olduğunu işaret eder ve ilgili aramalarda sayfanızın daha üst sıralarda görünmesine yardımcı olur.

ChatGPT ile yazdığım kodu content-product.php dosyasına ürün başlıklarını <h3> etiketi ile göstermek için ekleyebilirsiniz.

Kod:
<h3 class=”woocommerce_before_shop_loop_item_title”><?php echo get_the_title(); ?></h3>

1716046103308

Yapay Zeka ile WordPress Geliştirme – Ürün Varyasyonu

ChatGPT ile Teknik SEO Geliştirmeleri

WooCommerce kullanan e-ticaret sitelerinizde, ürün varyasyonlarının seçimine göre URL oluşması ve meta başlık, meta açıklamasının dinamik olarak güncellenmesi SEO açısından fayda sağlar.

ChatGPT ile yazdığım kod sayesinde ürün varyasyonları için aşağıdaki geliştirmeleri yapabilirsiniz.

📌 Varyasyonların benzersiz meta etiketlere sahip olması,

📌 Her varyasyon sayfasının canonical etiketinin esas sayfaya verilmesi,
(ana ürün sayfasının otoritesini artırır ve sıralamasını iyileştirir)

📌 Her varyasyonun ayrı ayrı izlenmesi ve analiz edilmesi,
(hangi varyasyonların daha iyi performans gösterdiğini belirler)

📌 Varyasyon seçildiğinde sayfa yeniden yüklenmeden açılır.

Kod erişebilirsiniz.


function add_custom_js() {<br />
?&gt;<br />
<script type="text/javascript">
        jQuery(document).ready(function($) {
            var $form = $('form.variations_form');</p>
<p>            // URL'deki parametreyi kontrol ederek varyasyonu seçin
            function selectVariationFromUrl() {
                var params = new URLSearchParams(window.location.search);
                params.forEach(function(value, key) {
                    var $select = $form.find('select[name="' + key + '"]');
                    if ($select.length > 0) {
                        $select.val(value).trigger('change');
                    }
                });
                $form.trigger('check_variations');
            }</p>
<p>            // Sayfa yüklendiğinde varyasyonu seçin
            selectVariationFromUrl();</p>
<p>            // Varyasyon değiştiğinde URL'yi, sayfa başlığını ve meta açıklamasını güncelleyin
            $form.on('change', 'select', function() {
                var params = [];
                var variationNames = [];</p>
<p>                $form.find('select').each(function() {
                    var attribute = $(this).attr('name');
                    var value = $(this).val();
                    if (value) {
                        params.push(attribute + '=' + value);
                        variationNames.push($(this).find('option:selected').text());
                    }
                });</p>
<p>                var newUrl = window.location.protocol + "//" + window.location.host + window.location.pathname + '?' + params.join('&');
                window.history.replaceState({ path: newUrl }, '', newUrl);</p>
<p>                // Sayfa başlığını ve meta açıklamasını güncelle
                if (variationNames.length > 0) {
                    var newTitle = document.title.split(' - ')[0] + ' - ' + variationNames.join(', ');
                    document.title = newTitle;</p>
<p>                    var metaDescription = document.querySelector('meta[name="description"]');
                    if (metaDescription) {
                        var newDescription = newTitle + ' - En iyi fiyatla pozitifpastacilik.com\'dan satın alın! Binlerce çeşit pasta malzemesi, ayağınıza gelsin!';
                        metaDescription.setAttribute('content', newDescription);
                    }
                }
            });
        });
    </script><br />
&lt;?php<br />
}<br />
add_action(&#8216;wp_footer&#8217;, &#8216;add_custom_js&#8217;);<br />
1719134667992

Yapay Zeka ile WordPress Geliştirme – Ürün Kategorisi

ChatGPT ile SEO Teknik Geliştirme – PLP Optimizasyon

WooCommerce ürün listeleme sayfasında, alt kategori veya üst kategoriyi listeleyerek kullanıcıların gezinmesini kolaylaştırabilirsiniz.

📌 Alt kategorilerin ve üst kategorin görsel olarak sunulması, kullanıcıların ilgilendikleri ürünlere daha hızlı ve kolay bir şekilde ulaşmalarını sağlar.

📌 İlgili içeriklere daha hızlı erişim sağlar ve hemen çıkma oranını azaltır.

📌 İç linkleme ile sitenizdeki bağlantı otoritesinin daha iyi dağılmasını sağlar.

ChatGPT ile yazdığım kod sayesinde site içi linkleme stratejinizin bir parçası olarak, hem kullanıcı deneyimini iyileştirebilir hem de arama motorlarının sitenizi daha iyi taramasını ve anlamasını sağlayabilirsiniz.

Kod erişim sağlayabilirsiniz.



function display_subcategories_or_parent_category() {
    if ( is_product_category() ) {
        $current_category = get_queried_object();
        $args = array(
            'child_of'     => $current_category->term_id,
            'taxonomy'     => 'product_cat',
            'hide_empty'   => false,
            'title_li'     => '',
            'orderby'      => 'name',
            'order'        => 'ASC'
        );
        
        $subcategories = get_categories( $args );

        echo '

‘; if ( ! empty( $subcategories ) ) { echo ‘

‘; } echo ‘

‘; } else { // Alt kategori yoksa üst kategoriyi listele $parent_category = get_term( $current_category->parent, ‘product_cat’ ); if ( $parent_category && ! is_wp_error( $parent_category ) ) { echo ‘

‘; echo ‘

‘; } } echo ‘

‘; } } add_action( ‘woocommerce_before_main_content’, ‘display_subcategories_or_parent_category’, 15 );

1732047368096

Yapay Zeka ile WordPress Site Geliştirme

Gelişen altyapıların yanı sıra, WordPress’in kullanım kolaylığı ve ücretsiz olması sayesinde popülerliği devam ediyor.

Projelerde kullanılan temalar ve sektörün gereksinimlerine bağlı olarak SEO ihtiyaçları farklılık gösterebilir.

Bu yaklaşımla, projemiz için ChatGPT ile ürettiğimiz kodların bazılarını sizinle paylaşıyorum.

PLP Optimizasyon
Product Title
Pagination
Product Attribute

Screen Shot 2024-12-05 at 01.28.33

Yapay Zeka ile Ticimax SEO Geliştirme

Yapay Zeka ile Ticimax SEO Geliştirme

Yıllar önce sektöre yazılımcı olarak başlamış olmanın en büyük avantajı, ChatGPT ile oluşturduğum kodu okuyup eksik parçaları bir araya getirebilmemdir.

Yakın zamanda woocemmerce kullanıcıları için yaptığım bir paylaşımda, kaynak dosyalarına erişimle İleri Düzey SEO geliştirmeleri yapılabileceğinden bahsetmiştim. Link : https://lnkd.in/grvThWCe

Rayzer Digital ekibi olarak, yalnızca WordPress altyapısını değil, SEO hizmeti verdiğimiz Ticimax altyapısına sahip aşağıdaki projemizde özel kod geliştirerek SEO çalışması sağladığımızı duyurmaktan mutluluk duyarım.

Kod’un işlevi;

📌 Belirlediğiniz kategoride, belirleyeceğiniz kategori, ürün v.b sayfalarınıza iç bağlantı sağlayabilirsiniz.

📌 İç bağlantı linkini arttırabilirsiniz.

 

CSS – Modüller -> Script Yönetimi – > Kategori Dosyası 


/* Ana slider konteyner */
.button-group {
    display: flex;
    justify-content: center; /* Masaüstünde ortalar */
    align-items: center;
    overflow-x: auto; /* Yatay kaydırmayı etkinleştir */
    scroll-snap-type: x mandatory; /* Scroll snapping özelliği */
    gap: 10px; /* Butonlar arasındaki boşluk */
    padding: 10px;
    background-color: #f9f9f9;
    border-bottom: 1px solid #ddd;
    scrollbar-width: none; /* Firefox için scrollbar gizle */
    touch-action: pan-x; /* Mobil cihazlarda yatay kaydırma */
}

.button-group::-webkit-scrollbar {
    display: none; /* Chrome, Safari için scrollbar gizle */
}

/* Slider butonları */
.button-group a {
    flex: 0 0 auto; /* Sabit genişlikte butonlar */
    padding: 10px 20px;
    font-size: 16px;
    text-decoration: none;
    color: #000;
    border: 1px solid #ccc;
    border-radius: 5px;
    background-color: #fff;
    scroll-snap-align: start; /* Scroll snapping noktası */
    transition: all 0.3s ease;
}

.button-group a:hover {
    background-color: #f0f0f0;
    border-color: #000;
}

/* Mobil uyumluluk */
@media screen and (max-width: 768px) {
    .button-group {
        justify-content: flex-start; /* Mobilde butonlar sola yaslanır */
    }

    .button-group a {
        font-size: 14px; /* Daha küçük yazı boyutu */
        padding: 8px 16px; /* Daha kompakt buton boyutu */
    }
}

 

JavaScript – Modüller -> Script Yönetimi – > Kategori Dosyası 


// Her sayfa için sabit 4 kategori eşlemesi
const categoryMapping = {
"erkek-spor-ayakkabi": [
{ name: "Erkek Ayakkabı", link: "/erkek-ayakkabi" },
{ name: "Erkek Bot", link: "/erkek-bot-ayakkabi-modelleri" },
{ name: "Erkek Sandalet & Terlik", link: "/erkek-sandalet-terlik-modelleri" },
{ name: "Sneaker Erkek Ayakkabı", link: "/sneaker-erkek-ayakkabi-modelleri" }
],
"erkek-ayakkabi": [
{ name: "Erkek Spor Ayakkabı", link: "/erkek-spor-ayakkabi" },
{ name: "Erkek Bot", link: "/erkek-bot-ayakkabi-modelleri" },
{ name: "Erkek Klasik Ayakkabı", link: "/erkek-klasik-ayakkabi" },
{ name: "Yazlık Erkek Ayakkabı", link: "/yazlik-erkek-ayakkabi" }
],
"erkek-bot-ayakkabi-modelleri": [
{ name: "Erkek Klasik Ayakkabı", link: "/erkek-klasik-ayakkabi" },
{ name: "Erkek Spor Ayakkabı", link: "/erkek-spor-ayakkabi" },
{ name: "Erkek Ayakkabı", link: "/erkek-ayakkabi" },
{ name: "Erkek Casual Ayakkabı", link: "/erkek-casual-ayakkabi" }
],
"sneaker-erkek-ayakkabi-modelleri": [
{ name: "Erkek Günlük Ayakkabı", link: "/erkek-gunluk-ayakkabi" },
{ name: "Yüksek Taban Erkek Ayakkabı", link: "/yuksek-taban-erkek-ayakkabi" },
{ name: "Erkek Spor Ayakkabı", link: "/erkek-spor-ayakkabi" },
{ name: "Erkek Ayakkabı", link: "/erkek-ayakkabi" }
]
};

// Bulunduğunuz sayfayı algılar
function getCurrentPage() {
    const path = window.location.pathname;
    return path.split("/").filter(Boolean).pop(); // URL'deki son parçayı alır
}

// İlgili kategorileri alır ve butonları oluşturur
function renderCategories() {
    const currentPage = getCurrentPage();
    const relatedCategories = categoryMapping[currentPage];

    if (!relatedCategories) return; // Sayfa eşleşmesi yoksa çık

    const container = document.getElementById("category-buttons");
    relatedCategories.forEach(category => {
        const link = document.createElement("a");
        link.href = category.link;
        link.textContent = category.name;
        container.appendChild(link);
    });
}

// Sayfa yüklendiğinde çalıştır
document.addEventListener("DOMContentLoaded", renderCategories);

HTML – Tasarım – Blok Yönetimi – Kategori – Yeni Blok Ekle 


<div class="button-group" id="category-buttons">
    <!-- Dinamik butonlar buraya eklenecek -->
</div>
1730933293060

SEO Fiyatları

SEO fiyatlandırması, projelerin hedeflerine, işin kapsamına, anahtar kelime rekabetine, web sitesinin mevcut durumuna ve istenen hizmet türüne göre şekillenir. Her SEO çalışması, özelleştirilmiş bir strateji ve belirli adımları içerdiğinden maliyetler değişiklik gösterebilir. İşte SEO fiyatlandırmasını etkileyen faktörler, hizmet türleri, fiyatlandırma modelleri ve her bir sürecin detayları:

SEO Fiyatlandırmasını Etkileyen Temel Faktörler

1. Hedefler ve Anahtar Kelime Rekabeti

  • Yüksek Rekabet: Eğer hedeflenen anahtar kelimeler rekabet oranı yüksek kelimelerdense (örneğin, globalde çok aranan veya sektörde birçok rakip tarafından kullanılan kelimeler), SEO çalışmaları daha yoğun emek gerektirir. Bu nedenle, çalışma süresi ve maliyet artar.
  • Düşük Rekabet: Yerel ve belirli bir alana odaklı anahtar kelimeler için rekabet daha düşüktür. Dolayısıyla SEO maliyeti daha düşük olabilir. Örneğin, “istanbul terzi” gibi bir anahtar kelime ile “moda” gibi genel bir kelimenin rekabet seviyesi ve çalışmaya etkisi farklıdır.

2. Web Sitesinin Mevcut Durumu

  • Yeni kurulan veya SEO açısından eksik bir web sitesi, daha fazla optimizasyona ihtiyaç duyar.
  • Teknik açıdan yavaş bir site, mobil uyumluluk sorunları olan veya içeriği eksik olan siteler, SEO çalışması öncesinde ciddi bir hazırlık gerektirir. Bu gibi durumlar SEO maliyetini artırır.
  • Ayrıca, SEO çalışmalarına başlarken mevcut sitenin analiz edilmesi (SEO denetimi) gerekir ve bu denetim çalışmaları da ekstra maliyet anlamına gelir.

3. Pazar Büyüklüğü ve Hedef Kitle

  • Yerel Pazar: Yalnızca yerel bir hedef kitlesine ulaşılmak isteniyorsa, bu tür çalışmalar daha sınırlı bir bütçeyle yapılabilir. Yerel SEO çalışmaları, yerel dizinlerde listelenme, harita optimizasyonu ve bölgeye özel anahtar kelime çalışmaları içerir.
  • Ulusal ve Uluslararası Pazar: Ulusal veya global hedef kitlesine ulaşmak isteyen projelerde, geniş bir coğrafyada rekabet etmek gerektiği için maliyetler artabilir. Bu durumda anahtar kelime rekabeti daha fazladır, dolayısıyla yapılan çalışmaların süresi ve fiyatı da daha yüksektir.

4. SEO Stratejileri ve Çalışma Alanları

  • Çeşitli SEO alanlarında yapılacak çalışmalar, maliyeti etkiler. Örneğin, yalnızca içerik optimizasyonu (On-Page SEO) odaklı bir çalışma, kapsamlı bir Off-Page SEO (backlink oluşturma ve sosyal medya sinyalleri gibi site dışı çalışmalar) içeren bir projeye göre daha uygun fiyatlı olabilir.
  • Teknik SEO, içerik optimizasyonu, backlink çalışmaları, yerel SEO, mobil SEO gibi alanların hepsini kapsayan bütünleşik bir SEO çalışması ise en yüksek maliyetle fiyatlandırılır.

5. Çalışma Süresi ve Raporlama Sıklığı

  • SEO çalışmalarının etkisi uzun vadede gözlemlenir. Genellikle en az 3-6 ay gibi bir sürede etkili sonuçlar alınmaya başlanır. Süreç ne kadar uzarsa, raporlamalarla desteklenen uzun süreli çalışmalar daha maliyetli olur.
  • Raporlama sıklığı da fiyatlandırmayı etkiler. Aylık ya da haftalık raporlama gibi sık raporlama talepleri, ek zaman ve maliyet gerektirir.

SEO Hizmeti ve Çalışma Süreçleri

SEO, çeşitli alanlarda özel optimizasyon çalışmaları içerir. Her bir alanın kendine has yöntemleri ve stratejileri bulunmaktadır:

SEO Hizmeti İçerik ve Yapılan Çalışmalar

Teknik SEO

Site hızı iyileştirmeleri, mobil uyumluluk optimizasyonları, site mimarisi düzenleme, yapılandırılmış veri (schema) eklemeleri. Bu çalışmalar arama motorlarının siteyi daha iyi taramasını sağlar.

On-Page SEO

İçerik optimizasyonu, anahtar kelime stratejisi, başlık ve meta açıklama düzenlemeleri. Kullanıcı dostu ve SEO uyumlu içerikler oluşturmak, arama motoru sıralamalarında önemli rol oynar.

Off-Page SEO

Backlink oluşturma, sosyal medya sinyalleri, içerik paylaşımı gibi site dışı çalışmalar. Site otoritesini artırarak arama motorlarındaki konumu güçlendirmeye yardımcı olur.

Yerel SEO

Google My Business gibi yerel dizinlerde listelenme, harita optimizasyonu, lokasyon bazlı anahtar kelime stratejisi. Küçük işletmeler için daha uygun maliyetli çözümler sunar.

SEO Raporlama ve Analiz

Çalışmaların performansını raporlama ve analiz etme, SEO stratejilerinin güncellenmesi. Aylık raporlar, çalışmalarda verimlilik analizi yaparak stratejiyi düzenleme imkanı sağlar.

SEO Fiyatlandırma Modelleri

1. Saatlik Ücretlendirme

  • Saatlik ücretlendirme, belirli bir süre boyunca sağlanan SEO danışmanlık hizmetleri veya kısa süreli SEO analizleri için idealdir.
  • SEO danışmanı, her saat başına ücret alarak site analizi yapar, strateji geliştirir ve yol haritası sunar. Özellikle küçük işletmeler veya danışmanlık almak isteyen şirketler için tercih edilen bir yöntemdir.

2. Aylık Abonelik Ücreti

  • Aylık abonelik bazlı ücretlendirme, SEO çalışmalarının sürekli olduğu durumlarda kullanılır. Sürekli optimizasyon gerektiren projeler, teknik SEO, içerik geliştirme ve backlink kazanımı gibi alanlarda sürekli destek alır.
  • SEO ajansları veya uzmanlar, bu modelle her ay belirli bir çalışma yaparak düzenli raporlama sağlar. Genelde site sıralamalarında ilerleme kaydetmek ve uzun vadeli sonuçlar almak isteyen işletmeler için uygundur.

3. Proje Bazlı Fiyatlandırma

  • Proje bazlı fiyatlandırma, belirli bir hedef doğrultusunda kısa süreli yapılacak SEO çalışmaları içindir. Bu modelde fiyat, projenin kapsamına ve yapılacak çalışmanın süresine göre belirlenir.
  • Örneğin, yeni bir ürün lansmanı veya etkinlik için SEO çalışması gibi sınırlı sürede yapılacak projeler için uygundur. Belirli bir kampanya süresince etkili olmak isteyen markalar tarafından tercih edilir.

SEO Çalışma Sürecinin Aşamaları

SEO çalışmaları, birden çok aşamadan geçer. Her bir aşamada yapılan işlemler ve odaklanılan konular farklıdır. Bu süreci adım adım inceleyebiliriz:

  1. Araştırma ve Analiz:
    SEO çalışmaları, sitenin mevcut durumu ve hedeflerin analiz edilmesiyle başlar. Anahtar kelime araştırması, rakip analizi ve site denetimi yapılır.
  2. Strateji Geliştirme:
    Hedeflere uygun bir SEO stratejisi belirlenir. Bu strateji, içerik üretimi, teknik SEO çalışmaları ve backlink kazanımı gibi adımları kapsar.
  3. Optimizasyon:
    Belirlenen stratejiye uygun olarak site içi ve dışı optimizasyon çalışmaları yapılır. İçerikler SEO uyumlu hale getirilir, site hızı artırılır ve backlink ağı genişletilir.
  4. Test ve Değerlendirme:
    Çalışmaların sonuçları analiz edilir, kullanıcı davranışları ve site performansı takip edilir. Hatalar veya eksiklikler varsa düzeltilir.
  5. Raporlama ve Güncellemeler:
    SEO çalışmaları raporlanır ve elde edilen verilere göre strateji güncellenir. Bu süreç, sitenin organik trafik ve sıralamalarını artırmaya yönelik olarak düzenli olarak devam eder.

SEO Maliyet Dağılımı

SEO bütçesi, yapılan çalışmalara göre çeşitli alanlara ayrılabilir. İşte bir SEO çalışmasında maliyet dağılımı örneği:

Çalışma Alanı Maliyet Dağılımı (%)
İçerik Optimizasyonu %30
Teknik SEO Çalışmaları %20
Backlink Oluşturma %25
Raporlama ve Analiz %15
Diğer SEO Stratejileri %10

SEO çalışmaları, projeye ve hedeflere bağlı olarak farklı fiyatlandırma modelleri ile planlanır.

Screen Shot 2024-08-08 at 11.45.46

Yapay Zeka Destekli Avukat SEO Projesi

Yapay Zeka Destekli Avukat SEO 

Site altyapısını SEO temelleriyle hazırladığım ve ardından tasarım geliştirmeleri ile süreci ileriye taşıdığım projenin başarısını sizinle paylaşmaktan gurur duyuyorum. Bu konuda bize güvenen Av. Tuğba Kopuz Şahin‘ne teşekkür ederim.

Sektörün zorluklarına rağmen, ChatGPT ile ürettiğimiz SEO odaklı içerikler ile başarı sağladık. Bu süreçte, Av. Tuğba Kopuz Şahin’in uzmanlığıyla EEAT kriterlerine uygun olacak düzeyde içeriklerimizi geliştirmesinde, önemli bir katkı sağladı.