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.
AI rewritten version (editable)
Run an AI rewrite to generate a stronger version of your copy.
We'll explain what changed and why once the AI has rewritten your copy.
AI-generic risk
-Not analysed
How much this reads like generic AI or templated corporate copy.
Marketing strength
-Not analysed
Hook, clarity of offer, specificity and call-to-action.
Top issues spotted
Quick wins to improve your copy
Clichés, jargon, filler & em dashes
No analysis yet. Run the editor on your copy to see clichés and filler.
Legend:
Red = AI-style clichésYellow = Buzzwords / jargonBlue = Filler & fluffPurple = Em dashes (-)
Your copy with issues highlighted
Paste your copy and analyse to see highlights.
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.
Choose the goal, tone or editing direction that best matches the page or campaign.
Run the analysis or AI rewrite.
Compare the improved version with your original draft.
Keep the strongest lines and add your own proof, examples and brand voice.
What you get from this tool
Cleaner rewritten copyTone and clarity suggestionsReduced filler wordingStronger call-to-action directionA 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 sectionsImproving landing page copyRewriting sales emailsCleaning service page draftsMaking 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.
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.
Most clients start seeing early results within 4 to 6 weeks, depending on the package. SEO and content take time to build momentum, while paid ads and social media can drive quicker visibility and engagement.
No. All of our packages are month-to-month, giving you complete flexibility. Cancel, pause, or upgrade at any time. You'll never be tied into something that doesn't serve your business.
Absolutely. While our packages cover most needs, we know every business is different. You can request custom combinations or start with a core package and add services as needed.
Yes. Everything we create for you; your website, content, designs, ad accounts, email flows, is 100% yours to keep, even if you cancel. No strings, no lock-in.
You get clear monthly reports showing clicks, calls, conversions, reach, rankings, and ROI, based on your goals. We break it down in plain language so you always know what's working and where to improve.
That's totally fine. We can audit your current site for SEO, speed, or conversion issues, or integrate our services (like SEO, content, or ads) with what you already have.
Just choose a package and fill out our quick onboarding form. We'll ask for basic info (logo, website, goals, access to platforms if needed), and we take care of the rest.
We don't just focus on one channel; we connect everything. SEO, social media, ads, email, content, and web: all working together, not in silos. And we actually explain what we're doing.
Yes-we also offer once-off services like website design, logo creation, video production, content writing, and more. You'll find those on our One-Off Services page.
We keep it light on your side. After onboarding, we manage most of the work. You can expect to approve key content, ads, or designs, but most clients spend less than 1 hour/month reviewing what we send.
Both. Every package includes strategy, execution, and optimisation. You don't need to come with a full plan, we'll help you figure out what works best and where to focus.
We work across many sectors; e-commerce, tech, services, retail, healthcare, legal, education, and more. We also offer industry-specific packages if you need tailored help.
Yes, book a free 15-minute discovery call and we'll answer your questions, recommend a package, or customise one based on your goals.
Our digital marketing packages typically include a mix of SEO services, social media management, Google Ads and Facebook Ads, content creation, email marketing, and website optimisation; all tailored to your business needs.
Our digital marketing packages start from R3,500/month and scale based on the services you need. Unlike many agencies, we show our pricing up front so you know exactly what you're paying for.
For most small business's, the best strategy includes local SEO, Google Business Profile optimisation, targeted Facebook Ads, and consistent social media content. We offer all of this in our affordable entry-level packages.
Absolutely. SEO is one of the most cost-effective and impactful digital marketing strategies available. Organic search drives 53% of all website traffic . This means more than half of your potential customers are finding business's through unpaid search results.
SEO focuses on improving your unpaid rankings in search results over time, while Google Ads is a paid strategy that gets your website to the top instantly. We recommend a mix of both for balanced, short- and long-term results.
It depends on your business goals, industry, and budget. If you're not sure, book a free 15-minute consultation, and we'll recommend the best fit, or customise one for you.
Yes, digital marketing increases your online visibility, bringing in more qualified leads, improving customer retention, and ultimately growing your revenue.
Absolutely. Platforms like Facebook, Instagram, and TikTok help you connect with customers, build trust, and drive conversions. Even basic social media marketing can make a huge impact if done consistently.
We track real metrics that matter; leads, sales, return on ad spend (ROAS), SEO ranking improvements, website traffic, and more. You get a clear report every month, with no jargon or fluff.
Not necessarily. We can audit your current website and improve it as needed. If it's outdated or not converting, we'll recommend design upgrades or a rebuild as part of your package or as a once-off service.
By using this website, you agree to our use of cookies. We use cookies to provide necessary site functionality and provide you with a great experience.
Thank you!
Your message has been successfully sent
Thank you!
Your form has been submitted. Please check your email for a copy of your responses. If you're accepted, you'll receive an email with a link to checkout.
Could not add item to cart
Write a Review
After purchase you are sent an email receipt which includes your download page link. Please visit that download page to submit a review for this product.
") + "\\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
};
});
})();