Reads the landing pages you name and logs specific conversion fixes to a Google Sheet, one row per tip.

UsesGoogle SheetsOpenAI

Review landing pages with AI and log the fixes

ValuesSet pageUrls to blank.Set pageUrls to blank.
ValuesSet offerAndAudience to blank.Set offerAndAudience to blank.
ValuesSet reportSheetUrl to blank.Set reportSheetUrl to blank.
ValuesSet reportTabName to Landing page reviews.Set reportTabName to Landing page reviews.
ValuesSet pageCharacterLimit to 18000.Set pageCharacterLimit to 18000.
ValuesSet tabIsNew to false.Set tabIsNew to false.
Decisions & LoopsIf a step below fails, save the error as createTabErrorIf a step below fails, save the error as createTabError
Try
Google SheetsGoogle SheetsCreate the tab reportTabName in reportSheetUrl.Create the tab reportTabName in reportSheetUrl.
ValuesChange tabIsNew to true.Change tabIsNew to true.
On error
ValuesShow in the output: The '@reportTabName' tab is already there, so this run adds to it. (createTabError.message).Show in the output: The '@reportTabName' tab is already there, so this run adds to it. (createTabError.message).
Decisions & LoopsIf tabIsNew is yesIf tabIsNew is yes
Yes
Google SheetsGoogle SheetsAdd a row to reportTabName in reportSheetUrl.Add a row to reportTabName in reportSheetUrl.
No
No steps
TextSplit pageUrls with "Split pageUrls with replaced by , by , and save it as pageList.
ValuesSet pagesReviewed to 0.Set pagesReviewed to 0.
ValuesSet tipsWritten to 0.Set tipsWritten to 0.
Decisions & LoopsFor each pageEntry in pageList:For each pageEntry in pageList:
TextTrim pageEntry and save it as pageUrl.Trim pageEntry and save it as pageUrl.
Decisions & LoopsIf pageUrl is emptyIf pageUrl is empty
Yes
Decisions & LoopsSkip to the next item.Skip to the next item.
No
No steps
ValuesSet pageText to blank.Set pageText to blank.
ValuesSet pageReached to false.Set pageReached to false.
Decisions & LoopsIf a step below fails, save the error as fetchErrorIf a step below fails, save the error as fetchError
Try
HTTPFetch pageUrl and save it as response.Fetch pageUrl and save it as response.
ValuesChange pageReached to response.ok.Change pageReached to response.ok.
TextTrim response.body and save it as pageText.Trim response.body and save it as pageText.
On error
ValuesShow in the output: Could not open pageUrl - fetchError.message.Show in the output: Could not open pageUrl - fetchError.message.
Decisions & LoopsIf pageReached isn't yes or pageText is emptyIf pageReached isn't yes or pageText is empty
Yes
ValuesShow in the output: Skipped pageUrl because it did not return a readable page.Show in the output: Skipped pageUrl because it did not return a readable page.
Decisions & LoopsSkip to the next item.Skip to the next item.
No
No steps
TextShorten pageText to pageCharacterLimit characters (keeping words whole) and save it as pageExcerpt.Shorten pageText to pageCharacterLimit characters (keeping words whole) and save it as pageExcerpt.
ValuesSet reviewPrompt to You are a conversion rate optimisation specialist reviewing one landing page. Give the specific, actionable notes you would give a client, not a score and not general advice that would fit any page.Set reviewPrompt to You are a conversion rate optimisation specialist reviewing one landing page. Give the specific, actionable notes you would give a client, not a score and not general advice that would fit any page. What this page sells, who it is for, and what counts as a conversion: offerAndAudience Look for the things that actually lose conversions on this page: - Call to action: is the main action obvious, above the fold, and worded as a benefit rather than 'Submit' or 'Learn more'? - Messaging: within five seconds, does the page say what this is, who it is for, and why it beats the alternative? - Layout: what gets between a visitor and the action - competing links, walls of text, the offer buried below three scrolls? - Trust: is there proof a stranger would believe - named customers, numbers, guarantees, pricing that is actually shown? - Forms: how many fields, and is every one of them worth the drop-off? Reply with at most 8 findings, one per line, and nothing else. No numbering, no bullet characters, no introduction and no closing summary. Each line is exactly three parts separated by the pipe character: Area | What is wrong | What to change Area must be one of: Call to action, Messaging, Layout, Trust, Forms. Quote the page's own wording when you name a problem, and make the change concrete enough to hand straight to a designer. Leave out anything you cannot see evidence for in the page below. Page address: pageUrl Page source below as raw HTML. Read the visible copy and the form and link markup; ignore script blocks, style blocks and tracking tags. pageExcerpt.
ValuesSet findings to blank.Set findings to blank.
Decisions & LoopsIf a step below fails, save the error as reviewErrorIf a step below fails, save the error as reviewError
Try
OpenAIOpenAIAsk OpenAI: reviewPrompt. Save it as review.Ask OpenAI: reviewPrompt. Save it as review.
TextTrim review.response_text and save it as findings.Trim review.response_text and save it as findings.
On error
ValuesShow in the output: Could not review pageUrl - reviewError.message.Show in the output: Could not review pageUrl - reviewError.message.
Decisions & LoopsIf findings is emptyIf findings is empty
Yes
ValuesShow in the output: No optimisation tips came back for pageUrl, so nothing was written for it.Show in the output: No optimisation tips came back for pageUrl, so nothing was written for it.
Decisions & LoopsSkip to the next item.Skip to the next item.
No
No steps
Dates & TimesGet today's date and save it as reviewedOn.Get today's date and save it as reviewedOn.
TextSplit findings by a new line and save it as findingLines.Split findings by a new line and save it as findingLines.
ValuesSet rowsForThisPage to 0.Set rowsForThisPage to 0.
Decisions & LoopsFor each findingLine in findingLines:For each findingLine in findingLines:
TextSplit findingLine by | and save it as parts.Split findingLine by | and save it as parts.
Decisions & LoopsIf the length of parts is greater than or equal to 3If the length of parts is greater than or equal to 3
Yes
Google SheetsGoogle SheetsAdd a row to reportTabName in reportSheetUrl.Add a row to reportTabName in reportSheetUrl.
ValuesAdd 1 to rowsForThisPage.Add 1 to rowsForThisPage.
ValuesAdd 1 to tipsWritten.Add 1 to tipsWritten.
No
No steps
Decisions & LoopsIf rowsForThisPage is 0If rowsForThisPage is 0
Yes
Google SheetsGoogle SheetsAdd a row to reportTabName in reportSheetUrl.Add a row to reportTabName in reportSheetUrl.
ValuesAdd 1 to tipsWritten.Add 1 to tipsWritten.
No
No steps
ValuesAdd 1 to pagesReviewed.Add 1 to pagesReviewed.
ValuesShow in the output: Reviewed pagesReviewed as text landing page(s) and wrote tipsWritten as text tip(s) to the '@reportTabName' tab.Show in the output: Reviewed pagesReviewed as text landing page(s) and wrote tipsWritten as text tip(s) to the '@reportTabName' tab.