FREE SEO EBOOK Într-o eră digitală în continuă evoluție, succesul online al oricărei afaceri sau proiect depinde în mare măsură de vizibilitatea sa în motoarele de căutare. Search Engine Optimization (SEO) nu mai este doar o simplă tactică, ci o componentă esențială a unei strategii de marketing digital cuprinzătoare. De la înțelegerea și utilizarea corectă a cuvintelor cheie, până la adoptarea celor mai recente inovații în inteligența artificială, acest eBook îți oferă toate instrumentele și cunoștințele necesare pentru a naviga în peisajul complex al SEO. Completează formularul de mai jos cu datele corect și vei primi acces gratuit la eBook-ul nostru de 32 de pagini pentru SEO. Acest ghid a fost conceput pentru a acoperi nu doar fundamentele SEO, ci și pentru a explora în profunzime strategiile avansate care pot transforma prezența ta online. Fie că ești un începător dornic să înțeleagă bazele, sau un profesionist experimentat în căutarea unor perspective noi, acest eBook îți va furniza informații valoroase și sfaturi practice pentru a-ți îmbunătăți performanța în motoarele de căutare. De la optimizarea pentru căutările vocale și mobile, la utilizarea eficientă a datelor structurate și a inteligenței artificiale, vei descoperi cum să îți adaptezi strategia pentru a răspunde nevoilor și așteptărilor utilizatorilor moderni. În plus, vom explora cum să creezi conținut evergreen, să construiești backlink-uri de calitate și să optimizezi paginile de produs pentru a domina rezultatele căutărilor în sectorul e-commerce. Pentru întrebări sau sugestii ne poți contacta aici! Contactează-ne!
Month: <span>August 2024</span>
Google Ads Scripts Raportare automată pe mail [RO] Cum funcționează? Acest script automatizează procesul de generare a rapoartelor de performanță, precum costurile, conversiile și numele campaniilor Google Ads, pe diverse intervale de timp și trimite aceste rapoarte prin email sub formă de tabele HTML bine structurate. Este un instrument util pentru monitorizarea eficientă a campaniilor de marketing și pentru menținerea echipei informate în mod regulat. [EN] How does it work? This script automates the process of generating performance reports, such as costs, conversions, and campaign names for Google Ads campaigns over various time intervals, and sends these reports via email in the form of well-structured HTML tables. It is a useful tool for efficiently monitoring marketing campaigns and keeping the team regularly informed. function main() { var reportConfigs = [ {days: 7, label: “Last 7 Days”}, {days: 14, label: “Last 14 Days”}, {days: 30, label: “Last 30 Days”} ]; var recipientEmails = “example.mail@gmail.com”; var subject = “Raport Cost Google Ads”; var body = “Raport al costurilor campaniilor pentru ultimele 7, 14 și 30 de zile:”; for (var i = 0; i < reportConfigs.length; i++) { var days = reportConfigs[i].days; var label = reportConfigs[i].label; var campaignReport = AdsApp.report( "SELECT CampaignName, Cost, AccountCurrencyCode, Conversions " + "FROM CAMPAIGN_PERFORMANCE_REPORT " + "WHERE Impressions > 0 ” + “DURING LAST_” + days + “_DAYS”); var rows = campaignReport.rows(); var data = []; while (rows.hasNext()) { var row = rows.next(); var rowData = [ row[“CampaignName”], row[“Cost”], row[“AccountCurrencyCode”], row[“Conversions”] ]; data.push(rowData); } // Format data as HTML table var htmlTable = “”; htmlTable += “” + label + “”; htmlTable += “Nume campaniiCostValutaConversii”; for (var j = 0; j < data.length; j++) { htmlTable += "" + data[j][0] + "" + data[j][1] + "" + data[j][2] + "" + data[j][3] + ""; } htmlTable += ""; // Add table to email body body += htmlTable; } // Send data to email MailApp.sendEmail({ to: recipientEmails, subject: subject, htmlBody: body }); Logger.log("Data sent to email: " + recipientEmails); } Cum să Implementezi Scriptul Navighează la interfața Google Ads. Mergi la “Instrumente și Setări” (pictograma cheii) în colțul din dreapta sus. Sub “Acțiuni în masă”, selectează “Scripturi”. Click pe butonul albastru plus pentru a crea un nou script. Copiază și lipeste scriptul furnizat în editor. Autorizează scriptul să acceseze contul tău Google Ads urmând instrucțiunile. Salvează și previzualizează scriptul pentru a te asigura că rulează corect. Programează scriptul să ruleze zilnic pentru a menține actualizați parametrii personalizați. Contactează-ne!
WordPress Plugins SEO PLUGIN Ce este un plugin wordpress? Un modul software care adaugă funcționalități suplimentare site-ului tău WordPress, cum ar fi securitate, SEO, sau formulare de contact, fără a fi nevoie de cunoștințe de programare. Cum funcționează pluginul? Pluginul permite gestionarea centralizată a meta descrierilor pentru toate paginile și postările, ușurând astfel optimizarea seo a site-ului prin intermediul Yoast SEO, fără a accesa fiecare pagină/postare individual. Limitarea lungimii meta descrierii: Funcția mdm_sanitize_meta_description() este menționată în cod, dar nu este folosită în mod direct în fluxul principal. Aceasta funcție ar trebui să fie utilizată pentru a asigura că meta descrierile nu depășesc 200 de caractere, prevenind astfel problemele legate de SEO. Descarcă plugin Pentru probleme tehnice vizavi de plugin ne poți contacta aici! Contactează-ne!
Google Ads Scripts Search terms additions Cum funcționează? Acest script este un instrument pentru automatizarea adăugării de cuvinte cheie în Google Ads, în special pentru conturile mari cu volume mari de date. Urmând acest tutorial, poți configura și personaliza scriptul pentru a răspunde nevoilor tale specifice, asigurând performanța optimă a contului tău fără a fi nevoie de intervenții manuale constante. Scriptul este conceput pentru a adăuga termeni de căutare cu conversii ridicate în grupurile de anunțuri relevante ca și cuvinte cheie, pe baza unor criterii specifice precum tipul de potrivire, conversiile, CPA și ROAS. Cerințe preliminare: Acces la contul Google Ads cu permisiuni pentru a crea și rula scripturi. Un Google Spreadsheet pentru înregistrarea adăugărilor de cuvinte cheie. Configurarea Scriptului Trebuie să personalizezi anumite variabile din script pentru a-l adapta la nevoile tale specifice: ✘1.Perioada de Observare: Setează câte zile în urmă scriptul trebuie să caute termeni de căutare cu conversii. var LOOKBACK_DAYS = 30; // Exemplu: 30 zile ✘2.Tipul de Potrivire: Definiți tipul de potrivire pentru cuvintele cheie care vor fi adăugate (de exemplu, EXACT, PHRASE, BROAD). var MATCH_TYPE = ‘EXACT’; // Exemplu: Potrivire exactă ✘3.Filtre pentru Grupuri de Anunțuri și Campanii: Opțional, filtrează după numele grupurilor de anunțuri sau campaniilor. Acest lucru te ajută să eviți erorile de timeout prin reducerea datelor procesate. var INCLUDE_ADGROUP_NAME_CONTAINS = “”; // Exemplu: “exact”var INCLUDE_CAMPAIGN_NAME_CONTAINS = “”; // Exemplu: “brand” ✘4.URL-ul Spreadsheet-ului: Furnizează URL-ul Google Spreadsheet-ului unde vor fi stocate înregistrările. var SPREADSHEET_URL = ‘URL_SPREADSHEET_AICI’; ✘5.Conversii Minime: Setează numărul minim de conversii pe care trebuie să le aibă un termen de căutare pentru a fi adăugat ca și cuvânt cheie. var MIN_CONVERSIONS = 1; ✘6.Praguri CPA și ROAS: Definiți pragurile pentru CPA (Cost per Achiziție) și ROAS (Return on Ad Spend) dacă este necesar. var CPA_THRESHOLD = 100; // Exemplu: Adăugați doar cuvinte cheie cu CPA sub 100 USDvar ROAS_THRESHOLD = 0.5; // Exemplu: Adăugați doar cuvinte cheie cu ROAS peste 0.5 var logEntries = []; function main() { // Set your tresholds here var LOOKBACK_DAYS = 30; var MATCH_TYPE = ‘EXACT’; //select what match type you want the queries to be added as var INCLUDE_ADGROUP_NAME_CONTAINS = “”; //filter for ad group name, if no filter it will consider all ad groups var INCLUDE_CAMPAIGN_NAME_CONTAINS = “”; //HIGHLY RECOMMENDED, without campaign filters GAQL will run into limits fast. Filter for campaign name, if no filter it will consider all campaigns var SPREADSHEET_URL = ”; //insert your own spreadsheet URL here, make sure it’s set to public editing var MIN_CONVERSIONS = 1; //set minimum amount of conversions var CPA_THRESHOLD = null; //leave null if you don’t want a maximum CPA threshold. Otherwise, set a max CPA threshold e.g. if you set it to 100 it will not add queries as keywords that exceed a CPA of 100 var ROAS_THRESHOLD = null; //leave null if you don’t want a minimum ROAS threshold. Otherwise, set a minimum ROAS threshold e.g. if you set it to 0.5 it will not add queries as keywords that have a ROAS lower than 0.5 // end of tresholds var dateRange = getDateRange(LOOKBACK_DAYS); var startDate = dateRange.startDate; var endDate = dateRange.endDate; var campaigns = AdsApp.campaigns() .withCondition(“Status = ENABLED”) //filter only for enabled campaigns, if you want to run it on paused campaigns for some reason change the word ENABLED to PAUSED .withCondition(“AdvertisingChannelType = SEARCH”) //filter for search campaigns to not into errors with shopping or pmax campaigns .get(); var adGroupIds = []; var campaignIds = []; while (campaigns.hasNext()) { var campaign = campaigns.next(); if (INCLUDE_CAMPAIGN_NAME_CONTAINS && !campaign.getName().toLowerCase().includes(INCLUDE_CAMPAIGN_NAME_CONTAINS.toLowerCase())) { continue; } campaignIds.push(campaign.getId()); var adGroups = campaign.adGroups() .withCondition(“Status = ENABLED”) //filter only for enabled ad groups, if you want to run it on paused ad groups for some reason change the word ENABLED to PAUSED .withCondition(“AdGroupType != SEARCH_DYNAMIC_ADS”) //filter our dynamic search ads as we cannot add keywords there .get(); while (adGroups.hasNext()) { var adGroup = adGroups.next(); if (INCLUDE_ADGROUP_NAME_CONTAINS && !adGroup.getName().toLowerCase().includes(INCLUDE_ADGROUP_NAME_CONTAINS.toLowerCase())) { continue; } adGroupIds.push(adGroup.getId()); } } if (adGroupIds.length > 0) { //GAQL query that fetches only search terms with view status none, have not been added or excluded var query = ` SELECT campaign.name, search_term_view.ad_group, search_term_view.search_term, metrics.clicks, metrics.conversions, metrics.conversions_value, metrics.cost_micros, metrics.conversions_value_per_cost, metrics.cost_per_conversion, search_term_view.status FROM search_term_view WHERE search_term_view.status = ‘NONE’ AND metrics.conversions > ${MIN_CONVERSIONS – 1} AND ad_group.id IN (${adGroupIds.join(“,”)}) AND segments.date BETWEEN ‘${startDate}’ AND ‘${endDate}’ `; var report = AdsApp.report(query); var rows = report.rows(); while (rows.hasNext()) { var row = rows.next(); var searchTerm = row[“search_term_view.search_term”]; var conversions = parseFloat(row[“metrics.conversions”]); var cost = parseFloat(row[“metrics.cost_micros”]) / 1000000; var conversionValue = parseFloat(row[“metrics.conversions_value”]) / 1000000; var roas = parseFloat(row[“metrics.conversions_value_per_cost”]); var cpa = parseFloat(row[“metrics.cost_per_conversion”]) / 1000000; // where statements for cpa and roas in GAQL not possible so I added them to be sequenced later if ((CPA_THRESHOLD !== null && cpa > CPA_THRESHOLD) || (ROAS_THRESHOLD !== null && roas < ROAS_THRESHOLD)) { Logger.log("Did not add keyword: " + searchTerm + " due to CPA (" + cpa + ") or ROAS (" + roas + ") thresholds."); continue; } try { var adGroupId = row["search_term_view.ad_group"].split("/").pop(); // Extract numeric ID var adGroup = AdsApp.adGroups().withIds([parseInt(adGroupId)]).get().next(); adGroup.newKeywordBuilder().withText(formatKeywordText(searchTerm, MATCH_TYPE)).build(); Logger.log("Added keyword: " + searchTerm + " to ad group: " + adGroup.getName()); logAdditionToSheet(row["campaign.name"], adGroup.getName(), searchTerm, MATCH_TYPE, conversions, cpa.toFixed(2), roas.toFixed(8)); } catch (e) { Logger.log("Failed to add keyword: " + searchTerm + " - " + e.message); } } } writeLogsToSheet(SPREADSHEET_URL); } function getDateRange(lookbackDays) { var today = new Date(); var endDate = formatDate(today); var startDate = new Date(today.getTime() - (lookbackDays * 24 * 60 * 60 * 1000)); return { startDate: formatDate(startDate), endDate: endDate }; } //senator, we run ads function formatDate(date) { var year = date.getFullYear(); var month = (date.getMonth() + 1).toString().padStart(2, '0'); var day = date.getDate().toString().padStart(2, '0'); return year + "-" + month + "-" + day; } function formatKeywordText(searchTerm, matchType) { switch (matchType) { case 'PHRASE': return """ + searchTerm + """; case 'EXACT': return "[" + searchTerm + "]"; case 'BROAD': default: return searchTerm; } } // Logs function logAdditionToSheet(campaignName, adGroupName, keyword, matchType, conversions, cpa, roas) { var dateAdded = new Date().toLocaleDateString(); logEntries.push([campaignName, adGroupName,