Advertisement
Marc_Cornelius

Google Ads Script: Landing Page Anomaly

Jul 27th, 2024
2,879
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.74 KB | None | 0 0
  1. /*
  2. Google Ads Script: Landing Page Conversion Rate Monitor
  3.  
  4. Instructions:
  5. 1. Copy this entire script and paste it into your Google Ads script editor.
  6. 2. Replace '[email protected]' with the email address where you want to receive alerts.
  7. 3. (Optional) Adjust the CONVERSION_RATE_THRESHOLD value if you want to change the sensitivity of the alerts.
  8. 4. (Optional) Modify the DATE_RANGE_DAYS value if you want to analyze a different time period.
  9. 5. Save the script.
  10. 6. Run the script manually to test it, or set up a schedule for automated running.
  11.  
  12. This script will:
  13. - Compare landing page performance over two consecutive periods (default: 14 days each).
  14. - Send an email alert if any landing page's conversion rate changes significantly.
  15. - Include click data for context in the email alert.
  16. - Add the account name to the email subject for easy identification.
  17.  
  18. Note: Make sure you have the necessary permissions to create and run scripts in your Google Ads account.
  19. */
  20.  
  21. function main() {
  22. var CONVERSION_RATE_THRESHOLD = 0.3; // 30% change
  23. var EMAIL_ADDRESS = '[email protected]'; // Replace with your email address
  24. var DATE_RANGE_DAYS = 14; // Number of days for each analysis period
  25.  
  26. var account = AdsApp.currentAccount();
  27. var accountName = account.getName();
  28.  
  29. var today = new Date();
  30. var periodEndDate = new Date(today.getTime() - DATE_RANGE_DAYS * 24 * 60 * 60 * 1000);
  31. var periodStartDate = new Date(periodEndDate.getTime() - DATE_RANGE_DAYS * 24 * 60 * 60 * 1000);
  32.  
  33. var DATE_RANGE = formatDate(periodEndDate) + " AND " + formatDate(today);
  34. var PREVIOUS_DATE_RANGE = formatDate(periodStartDate) + " AND " + formatDate(periodEndDate);
  35.  
  36. var report = AdsApp.report(
  37. "SELECT campaign.name, ad_group.name, ad_group_ad.ad.final_urls, " +
  38. "metrics.conversions, metrics.clicks " +
  39. "FROM ad_group_ad " +
  40. "WHERE segments.date BETWEEN " + DATE_RANGE
  41. );
  42.  
  43. var rows = report.rows();
  44. var landingPageData = {};
  45.  
  46. while (rows.hasNext()) {
  47. var row = rows.next();
  48. var urls = parseUrls(row['ad_group_ad.ad.final_urls']);
  49. var conversions = parseFloat(row['metrics.conversions']);
  50. var clicks = parseFloat(row['metrics.clicks']);
  51.  
  52. urls.forEach(function(url) {
  53. if (!landingPageData[url]) {
  54. landingPageData[url] = { conversions: 0, clicks: 0 };
  55. }
  56. landingPageData[url].conversions += conversions;
  57. landingPageData[url].clicks += clicks;
  58. });
  59. }
  60.  
  61. var previousReport = AdsApp.report(
  62. "SELECT ad_group_ad.ad.final_urls, " +
  63. "metrics.conversions, metrics.clicks " +
  64. "FROM ad_group_ad " +
  65. "WHERE segments.date BETWEEN " + PREVIOUS_DATE_RANGE
  66. );
  67.  
  68. var previousRows = previousReport.rows();
  69. var previousLandingPageData = {};
  70.  
  71. while (previousRows.hasNext()) {
  72. var row = previousRows.next();
  73. var urls = parseUrls(row['ad_group_ad.ad.final_urls']);
  74. var conversions = parseFloat(row['metrics.conversions']);
  75. var clicks = parseFloat(row['metrics.clicks']);
  76.  
  77. urls.forEach(function(url) {
  78. if (!previousLandingPageData[url]) {
  79. previousLandingPageData[url] = { conversions: 0, clicks: 0 };
  80. }
  81. previousLandingPageData[url].conversions += conversions;
  82. previousLandingPageData[url].clicks += clicks;
  83. });
  84. }
  85.  
  86. var alertMessages = [];
  87.  
  88. for (var url in landingPageData) {
  89. var currentData = landingPageData[url];
  90. var previousData = previousLandingPageData[url] || { conversions: 0, clicks: 0 };
  91.  
  92. var currentConvRate = currentData.clicks > 0 ? currentData.conversions / currentData.clicks : 0;
  93. var previousConvRate = previousData.clicks > 0 ? previousData.conversions / previousData.clicks : 0;
  94.  
  95. if (previousConvRate > 0) {
  96. var convRateChange = Math.abs(currentConvRate - previousConvRate) / previousConvRate;
  97.  
  98. if (convRateChange > CONVERSION_RATE_THRESHOLD) {
  99. var changeDirection = currentConvRate > previousConvRate ? 'increased' : 'decreased';
  100. var message = "Landing page: " + url + "\n" +
  101. "Conversion rate " + changeDirection + " by " + (convRateChange * 100).toFixed(2) + "%\n" +
  102. "Current conversion rate: " + (currentConvRate * 100).toFixed(2) + "%\n" +
  103. "Previous conversion rate: " + (previousConvRate * 100).toFixed(2) + "%\n" +
  104. "Current period clicks: " + currentData.clicks + "\n" +
  105. "Previous period clicks: " + previousData.clicks + "\n\n";
  106. alertMessages.push(message);
  107. }
  108. }
  109. }
  110.  
  111. if (alertMessages.length > 0) {
  112. var emailBody = "Comparison of landing page performance:\n" +
  113. "Current period: Last " + DATE_RANGE_DAYS + " days\n" +
  114. "Previous period: " + DATE_RANGE_DAYS + " days prior to the current period\n\n" +
  115. "The following landing pages have experienced significant changes in conversion rates:\n\n" +
  116. alertMessages.join("");
  117. var emailSubject = "Landing Page Conversion Rate Alert - " + accountName;
  118. MailApp.sendEmail(EMAIL_ADDRESS, emailSubject, emailBody);
  119. }
  120. }
  121.  
  122. function parseUrls(urlData) {
  123. if (typeof urlData === 'string') {
  124. try {
  125. var parsed = JSON.parse(urlData);
  126. return Array.isArray(parsed) ? parsed : [parsed];
  127. } catch (e) {
  128. return urlData.split(',').map(function(url) { return url.trim(); });
  129. }
  130. } else if (Array.isArray(urlData)) {
  131. return urlData;
  132. } else if (typeof urlData === 'object') {
  133. return Object.values(urlData);
  134. } else {
  135. return [];
  136. }
  137. }
  138.  
  139. function formatDate(date) {
  140. var year = date.getFullYear();
  141. var month = ('0' + (date.getMonth() + 1)).slice(-2);
  142. var day = ('0' + date.getDate()).slice(-2);
  143. return year + month + day;
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement