Quality Review
The quality review scores a campaign before it goes live. It does not block publishing; the readiness report does that. It tells you whether the messages your supporters will send look like real, personal messages, which is what decision makers respond to. Your AI assistant reads this page before writing content samples and before fixing a failed check.
How the review works
- Eight checks, each with a weight. The score is the share of weight passed among the checks that were evaluated; a check that does not apply to your campaign, or could not be evaluated, does not count.
- Six checks are deterministic and give their result immediately. Two are run by an AI in the background and arrive a few seconds later.
- Run the review again after editing the campaign. Running it again without any change keeps the same results.
- Each failed check names the affected samples or groups, and where to fix them: the content samples, the custom questions, or the campaign settings.
Writing content samples
Content samples set the tone of every generated message, so the review looks at them first. A good sample:
- is written by one supporter, in the first person ("As a resident of…", "I am worried that…"), never in the organization's voice ("We at…", "Our organization demands…");
- is specific: a fact, a local reference, a figure, a personal stake, not a generic appeal;
- differs from the other samples of the same group and channel in length, structure and angle;
- reads naturally: no stock openings or closings, no "Furthermore" or "In conclusion", contractions where a real person would use them;
- stays short on social channels, and personalizes with a token where the recipient is not known in advance.
Tokens are replaced with the recipient's details at send time: {{ first_name }} and {{ last_name }} are the most common, custom fields use {{ custom_fields.<slug> }}, and {% if %} / {% for %} tags adapt a sentence to the recipient.
The checks
Not written in the sender's voice
Check id: wrong_point_of_view · weight 20 · AI check
Fails when a sample is written from the organization's point of view instead of the sender's: a collective institutional voice, the organization referring to itself, or campaign-speak addressed to supporters rather than text a supporter would send. Messages must read as written by an individual constituent, customer or concerned citizen.
Fix: rewrite the affected content samples in the first person.
Content samples feel AI-generated
Check id: ai_generated_feel · weight 15 · AI check
Fails when samples read as generic AI output: stock openings and closings ("I hope this message finds you well"), hedging boilerplate, formulaic transitions; the same skeleton across samples with mere synonym swaps; no concrete or personal detail; or an unnaturally polished register, with perfectly balanced sentences and no contractions.
Fix: rewrite the affected content samples with concrete details and a natural voice, and vary their structure.
No recipient personalization
Check id: no_recipient_personalization · weight 15
Passes when at least one sample of a personalizable channel contains a token ({{ first_name }}, {{ custom_fields.<slug> }}, or a legacy {TOKEN}) or an {% if %} / {% for %} tag, or when the campaign has greetings and offers the email or form channel, since greetings personalize those messages on their own.
Does not apply to call scripts and reviews, which are never personalized, and is skipped when every send reaches the whole recipient pool of its group: the author then knows exactly who reads the message and can name them directly.
Fix: add a token to one content sample, or attach greetings.
No custom questions
Check id: no_custom_questions · weight 15
Fails when the campaign asks no custom question. Answers are what give each message a personal angle.
Does not apply when the campaign only offers the call channel, which does not generate messages.
Fix: attach at least one custom question to the campaign.
Copy is too long
Check id: copy_too_long · weight 10
Fails for any sample above the limit of its channel:
| Channel | Limit |
|---|---|
| Email, form | 150 words |
| Facebook, Instagram, TikTok, LinkedIn, review | 50 words |
| 280 characters, tokens counted at their literal length |
A token counts as one word; {% %} tags count as zero. Call scripts are not checked.
Fix: shorten the affected content samples.
All samples have the same length
Check id: same_lengths · weight 10
For each group and channel with at least two samples, fails when the longest and shortest samples differ by less than 25% of the longest. Same-length samples produce templated messages.
Does not apply to call scripts and tweets, nor to groups with a single sample on a channel.
Fix: lengthen or shorten samples so their lengths spread out.
Too many recipients contacted at once
Check id: too_many_targets · weight 10
Email only. Fails when a supporter's email goes to more than 10 recipients of a group: the number of recipients per supporter, or 20 when it is left at 0, capped by the group's email recipients. Bulk sends look like spam and dilute impact. Twitter is capped at 3 recipients by the application.
Does not apply to geolocated campaigns, where each supporter reaches the one recipient matched to their address, nor to campaigns without an email group.
Fix: lower the recipients per supporter in the campaign settings, or narrow the recipient lists.
No email collection
Check id: no_email_collection · weight 5
Fails when no CRM integration is active for the campaign, either enabled for all the organization's campaigns or for this one specifically. Without it you cannot keep in touch with supporters after they act.
Fix: enable the CRM in the campaign settings, or configure an integration in the admin.