Your Cart
No items added to cart yet

Free Marketing AI Content Editor & AI Detector

Use this free tool to stress test your marketing copy before it goes live. Paste your landing page, sales email or ad, click Analyse copy, and get an instant read on how "AI written” your copy feels. The editor highlights clichés, corporate jargon, filler words and em dashes so you can tighten your message without losing your voice.

AI Content Editor | Humanise and Improve Marketing Copy
Built for marketers · AI + human editing

Marketing AI Content Editor & Copy Coach

Paste or write your marketing copy, get an instant analysis, then let AI rewrite it for clarity, conversion and originality - in an editor you can fully control.

The AI suggests a stronger version. You stay in control: edit, mix and match lines, and keep your own voice.

1. Your original copy

Landing pages, ads, emails, social captions or sales pages - paste or type below.

Tip: You'll get the most useful feedback once you have at least 80-100 words written.

2. AI edit & feedback

Analyse your copy first, or go straight to 'Ask AI to rewrite' for an edited version.

Want converting copy across your whole site?

Talk to our digital marketing team about done for you SEO content and conversion copywriting so you can ship campaigns that'sound like you and still rank.

Free AI Marketing Tools

AI Content Editor built for real marketing work

Use this editor when a draft has the right idea but still feels flat, vague, repetitive or too obviously AI-generated.

The tool helps tighten the message so your audience understands the offer faster and has a clearer reason to act.

How to use AI Content Editor

  1. Paste your draft into the editor.
  2. Choose the goal, tone or editing direction that best matches the page or campaign.
  3. Run the analysis or AI rewrite.
  4. Compare the improved version with your original draft.
  5. Keep the strongest lines and add your own proof, examples and brand voice.

What you get from this tool

Cleaner rewritten copy Tone and clarity suggestions Reduced filler wording Stronger call-to-action direction A more polished draft for publishing

Best use cases

This tool is most useful when you want a faster, clearer starting point before investing more time into strategy, production or optimisation.

Editing AI blog sections Improving landing page copy Rewriting sales emails Cleaning service page drafts Making captions sound more natural

Professional next step

Need every page to sound sharper and more persuasive? Use the editor for quick improvements, then get a content strategy that supports ranking and conversion.

AI Content Editor FAQs

Is this AI Content Editor only for AI-written copy?

No. It can also improve human-written drafts that need clearer wording, better structure or a stronger call-to-action.

Will the editor change my meaning?

Treat the output as a draft. Review every edit and keep the parts that match your offer, audience and brand voice.

What makes edited copy more effective?

Specific benefits, proof, simple wording, a clear structure and one obvious next step usually make copy more effective.

Want this handled properly?

Free tools are useful for quick checks and planning. For strategy, execution, tracking and measurable improvement, The Marketing Specialists can help turn the insight into action.

Digital Marketing FAQs

") + "\\b", "gi"); } function analyseCopy(text) { const clean = text.replace(/\s+/g, " ").trim(); const words = clean ? clean.split(" ").filter(Boolean) : []; const sentences = text.split(/[.!?]+/).map(s => s.trim()).filter(Boolean); const wordCount = words.length; const sentenceCount = sentences.length || 1; const avgSentenceLen = wordCount ? Math.round(wordCount / sentenceCount) : 0; const numberCount = (text.match(/\d[\d,.%]*/g) || []).length; const questionCount = (text.match(/\?/g) || []).length; const dashCount = (text.match(/—|--| - /g) || []).length; let clicheCount = 0; const clicheHits = []; CLICHES.forEach(pattern => { const found = countRegex(text, pattern, "gi"); if (found) { clicheCount += found; clicheHits.push(pattern); } }); let buzzCount = 0; const buzzHits = []; BUZZWORDS.forEach(word => { const found = countWord(text, word); if (found) { buzzCount += found; buzzHits.push(word); } }); let fillerCount = 0; const fillerHits = []; FILLERS.forEach(phrase => { const found = countRegex(text, phrase, "gi"); if (found) { fillerCount += found; fillerHits.push(phrase); } }); const hasCTA = CTA_REGEX.test(text); const hasHook = HOOK_REGEX.test(text); const risk = clamp( 18 + clicheCount * 12 + buzzCount * 4 + fillerCount * 8 + dashCount * 4 + (avgSentenceLen > 24 ? 14 : 0) - numberCount * 3 - questionCount * 2, 3, 98 ); const impact = clamp( 45 + (hasCTA ? 18 : 0) + (hasHook ? 12 : 0) + Math.min(numberCount * 4, 16) + (wordCount >= 80 ? 8 : 0) - clicheCount * 4 - (avgSentenceLen > 30 ? 10 : 0), 5, 98 ); const issues = []; if (wordCount < 80) issues.push("Add more detail. The copy is quite short, so the tool has less context to judge."); if (clicheCount > 0) issues.push("Remove generic AI-style phrases and replace them with specific proof or examples."); if (buzzCount > 1) issues.push("Cut jargon and use simpler language your customer would actually use."); if (fillerCount > 0) issues.push("Remove filler phrases to make the message tighter."); if (!hasCTA) issues.push("Add a clear next step, such as booking, contacting, downloading or requesting help."); if (!hasHook) issues.push("Strengthen the opening hook with a clear problem, benefit or outcome."); if (avgSentenceLen > 24) issues.push("Shorten long sentences so the copy is easier to read."); if (!issues.length) issues.push("The copy has a solid base. Tighten any vague wording and make the offer more specific."); const suggestions = [ "Lead with the customer problem or desired outcome.", "Replace vague claims with specific details, numbers, examples or proof.", "Keep one clear call-to-action at the end.", "Use shorter sentences and simpler wording.", "Remove phrases that sound like generic AI or corporate filler." ]; return { text, wordCount, sentenceCount, avgSentenceLen, numberCount, questionCount, dashCount, clicheCount, buzzCount, fillerCount, clicheHits, buzzHits, fillerHits, hasCTA, hasHook, aiRisk: risk, impact, issues, suggestions }; } function renderList(el, items) { if (!el) return; el.innerHTML = ""; items.forEach(item => { const li = document.createElement("li"); li.textContent = item; el.appendChild(li); }); } function renderAnalysis(a) { const resultsPanel = $("resultsPanel"); const resultsSub = $("resultsSub"); const aiScoreEl = $("aiScore"); const aiTagEl = $("aiTag"); const aiSummaryEl = $("aiSummary"); const impactScoreEl = $("impactScore"); const impactTagEl = $("impactTag"); const impactSummaryEl = $("impactSummary"); const miniStatsEl = $("miniStats"); const issuesListEl = $("issuesList"); const suggestionsListEl = $("suggestionsList"); const signalsBoxEl = $("signalsBox"); const highlightBoxEl = $("highlightBox"); const aiErrorEl = $("aiError"); if (resultsPanel) resultsPanel.style.display = "block"; if (resultsSub) resultsSub.textContent = "Here is how your copy scores and what to fix first."; if (aiErrorEl) { aiErrorEl.style.display = "none"; aiErrorEl.textContent = ""; } if (aiScoreEl) aiScoreEl.textContent = String(a.aiRisk); if (aiTagEl) aiTagEl.textContent = a.aiRisk >= 70 ? "High AI-generic risk" : a.aiRisk >= 40 ? "Medium risk" : "Low risk"; if (aiSummaryEl) { aiSummaryEl.textContent = a.aiRisk >= 70 ? "This copy uses patterns that can sound generic or AI-written. Make it more specific and customer-led." : a.aiRisk >= 40 ? "Some wording could sound generic. Tighten the copy and add proof." : "This copy is less generic than most AI-style drafts. Keep the specificity."; } if (impactScoreEl) impactScoreEl.textContent = String(a.impact); if (impactTagEl) impactTagEl.textContent = a.impact >= 75 ? "Strong" : a.impact >= 50 ? "Needs tightening" : "Weak"; if (impactSummaryEl) { impactSummaryEl.textContent = a.impact >= 75 ? "The copy has a clear marketing angle. Keep improving proof and CTA strength." : a.impact >= 50 ? "The copy has a usable base, but the hook, proof or call-to-action can be stronger." : "The copy needs a clearer offer, sharper hook and stronger next step."; } if (miniStatsEl) { miniStatsEl.innerHTML = '' + a.wordCount + " words" + '' + a.sentenceCount + " sentences" + '' + a.avgSentenceLen + " avg words/sentence" + '' + a.numberCount + " numbers" + '' + a.clicheCount + " clichés"; } renderList(issuesListEl, a.issues); renderList(suggestionsListEl, a.suggestions); if (signalsBoxEl) { const chips = [] .concat(a.clicheHits.map(x => "Cliché: " + x)) .concat(a.buzzHits.map(x => "Buzzword: " + x)) .concat(a.fillerHits.map(x => "Filler: " + x)); signalsBoxEl.className = chips.length ? "chip-row" : "empty-state"; signalsBoxEl.innerHTML = chips.length ? chips.slice(0, 18).map(x => '' + escapeHtml(x) + "").join("") : "No major clichés, buzzwords or filler phrases found."; } if (highlightBoxEl) { let safe = escapeHtml(a.text); CLICHES.forEach(pattern => { try { safe = safe.replace(new RegExp(pattern, "gi"), m => '' + m + ""); } catch (e) {} }); BUZZWORDS.forEach(word => { try { safe = safe.replace(new RegExp("\\b" + word.replace(/[.*+?^${}()|[\]\\]/g, "\\ ") + "\\b", "gi"), m => '' + m + ""); } catch (e) {} }); FILLERS.forEach(phrase => { try { safe = safe.replace(new RegExp(phrase, "gi"), m => '' + m + ""); } catch (e) {} }); highlightBoxEl.innerHTML = safe.replace(/\n/g, "
"); } } function localRewrite(text) { let improved = String(text || ""); CLICHES.forEach(pattern => { try { improved = improved.replace(new RegExp(pattern, "gi"), ""); } catch (e) {} }); FILLERS.forEach(phrase => { try { improved = improved.replace(new RegExp(phrase, "gi"), ""); } catch (e) {} }); improved = improved.replace(/\s{2,}/g, " ").replace(/\s+([,.!?])/g, "$1").trim(); return improved || text; } function renderAIResult(originalText, summary) { const resultsPanel = $("resultsPanel"); const aiHeadlineEl = $("aiHeadline"); const aiOutputEl = $("aiOutput"); const aiExplanationEl = $("aiExplanation"); const aiChangesListEl = $("aiChangesList"); if (resultsPanel) resultsPanel.style.display = "block"; const s = summary || {}; const improved = s.improvedText || s.rewrittenText || s.rewrite || s.output || s.text || (s.result && (s.result.improvedText || s.result.text)) || localRewrite(originalText); if (aiHeadlineEl) aiHeadlineEl.textContent = s.headline || "AI-edited version of your copy"; if (aiOutputEl) aiOutputEl.value = improved; if (aiExplanationEl) { aiExplanationEl.textContent = s.rationale || s.explanation || "Copy has been tightened to reduce generic phrasing, improve clarity and strengthen the call to action."; } if (aiChangesListEl) { aiChangesListEl.innerHTML = ""; const moves = Array.isArray(s.moves) ? s.moves : Array.isArray(s.changes) ? s.changes : [ "Removed or reduced generic phrasing.", "Tightened wording for clarity.", "Improved the flow and call-to-action." ]; moves.forEach(move => { const li = document.createElement("li"); if (typeof move === "string") { li.textContent = move; } else { li.textContent = (move.label ? move.label + ": " : "") + (move.description || move.text || move.action || "Suggested copy improvement"); } aiChangesListEl.appendChild(li); }); } } function runAnalysis() { const editorInput = $("editorInput"); const resultsSub = $("resultsSub"); const resultsPanel = $("resultsPanel"); if (!editorInput) return; const text = editorInput.value.trim(); if (text.length < 40) { if (resultsPanel) resultsPanel.style.display = "none"; if (resultsSub) { resultsSub.textContent = text.length === 0 ? "Start typing or paste your copy, then click Analyse copy." : "Add a bit more copy, at least a few sentences, for a meaningful analysis."; } return; } renderAnalysis(analyseCopy(text)); } function runAIRewrite() { const editorInput = $("editorInput"); const aiRewriteBtn = $("aiRewriteBtn"); const aiErrorEl = $("aiError"); const resultsSub = $("resultsSub"); if (!editorInput) return; const text = editorInput.value.trim(); if (text.length < 40) { if (resultsSub) resultsSub.textContent = "Please paste at least a few sentences of copy before asking AI to rewrite."; return; } const analysis = analyseCopy(text); renderAnalysis(analysis); if (aiErrorEl) { aiErrorEl.style.display = "none"; aiErrorEl.textContent = ""; } if (aiRewriteBtn) { aiRewriteBtn.disabled = true; aiRewriteBtn.textContent = "Asking AI to rewrite..."; } fetch(AI_EDITOR_URL, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ text: text, goal: $("editGoalSelect") ? $("editGoalSelect").value : "general", tone: $("editToneSelect") ? $("editToneSelect").value : "clear", length: $("editLengthSelect") ? $("editLengthSelect").value : "same-length", keepVoice: $("keepVoiceCheckbox") ? $("keepVoiceCheckbox").checked : true, aiRisk: analysis.aiRisk, impact: analysis.impact, wordCount: analysis.wordCount, sentenceCount: analysis.sentenceCount, numberCount: analysis.numberCount, clicheCount: analysis.clicheCount, emDashCount: analysis.dashCount }) }) .then(resp => { if (!resp.ok) throw new Error("AI editor HTTP error"); return resp.json(); }) .then(data => { renderAIResult(text, data.summary || data); }) .catch(err => { console.error("AI Content Editor Worker error:", err); renderAIResult(text, { headline: "Local edited version generated", improvedText: localRewrite(text), rationale: "The AI Worker did not return a rewrite, so this local version removes obvious filler and generic phrasing. Try again in a moment for the full AI rewrite.", moves: [ "Created a fallback edited version.", "Removed obvious generic phrasing where possible.", "Kept your original meaning intact." ] }); if (aiErrorEl) { aiErrorEl.style.display = "block"; aiErrorEl.textContent = "The AI rewrite endpoint did not respond, so a local fallback edit was generated."; } }) .finally(() => { if (aiRewriteBtn) { aiRewriteBtn.disabled = false; aiRewriteBtn.textContent = "Ask AI to rewrite"; } }); } ready(function () { const analyzeBtn = $("analyzeBtn"); const aiRewriteBtn = $("aiRewriteBtn"); const aiOutputEl = $("aiOutput"); const resultsSub = $("resultsSub"); if (aiOutputEl) { aiOutputEl.setAttribute("placeholder", "Click Ask AI to rewrite to generate an improved version you can edit."); } if (resultsSub && /Ask AI to rewrite/.test(resultsSub.textContent || "")) { resultsSub.textContent = "Analyse your copy first, or go straight to Ask AI to rewrite for an edited version."; } if (analyzeBtn) { analyzeBtn.setAttribute("type", "button"); analyzeBtn.addEventListener("click", function (event) { event.preventDefault(); event.stopImmediatePropagation(); runAnalysis(); }, true); } if (aiRewriteBtn) { aiRewriteBtn.setAttribute("type", "button"); aiRewriteBtn.addEventListener("click", function (event) { event.preventDefault(); event.stopImmediatePropagation(); runAIRewrite(); }, true); } window.tmsAiContentEditorHardFix = { runAnalysis: runAnalysis, runAIRewrite: runAIRewrite }; }); })();