How it works
Import, step by step
Forty sources, named
Google, Trustpilot, G2, Capterra, Yelp, the app stores, the marketplaces, the trade directories, a Senja or Testimonial.to export — and "Text message", "Email" and "In person", which is where a great many of the best ones actually are.
Text, video links and screenshots
A written review, a link to a video that lives on its own platform, or a photograph of the message as it arrived. All three keep the source beside them.
One at a time or a spreadsheet at once
Paste one, or upload a CSV. Columns are read by their names, you are shown which was read as what before anything is saved, and a long file is read to its last row.
Every Google review at once, from Google's own export
Google Takeout gives the owner of a Business Profile an archive of it, reviews included. Upload that archive and it is read in your browser: only the reviews are taken, each with its stars and the day it was written, and Google's machine translations are left out so every review keeps the words its writer used. Nothing is fetched from Google, and no connection to your account is asked for.
The source is read off the file, and you are told why
A Google Takeout archive is set to Google. A CSV whose name says Senja or Testimonial.to, or whose links point to senja.io or testimonial.to, is set to that tool, with a line saying which of those decided it. Change it if it is wrong; a file that says neither leaves the choice to you.
On the free plan, every row comes in unread
The free plan carries no AI readings, so a CSV file or a Google Takeout archive is stored row by row without a reading for risk, within what a free project holds. Each card says it was not read for risk and waits in Pending for you, and the import's closing line says how many. A pasted page cannot be separated into reviews there, because separating it takes an AI reading: the import says so and points to the CSV file.
The source is shown for the rest of its life
An imported review says where it came from on every page it appears on, with a link to the original where there is one, so a reader can go and check it.
Public, or written permission
What you check depends on where it came from. A review on a public platform: its writer published it there first, and you may republish it. Anything that reached you privately — a message, an email, a Senja or Testimonial.to file, something said in person, "Other": you hold the writer's written permission to publish these exact words on your website. Canada's Competition Act, section 74.02, asks for one or the other before a testimonial is published. The import is refused without the sentence for its source, the API asks the same through its permission field, and each testimonial's public record says which one you stated.
Safe by design
The rule that makes it safe to have
Clear boundaries
What it will not do
Every capability page ends with this list. It is the part that says what you are actually buying.
- It will not fetch reviews from a platform on your behalf.
- It will not claim a consent that nobody gave — an imported review carries a note saying no permission was collected here.
- It will not let an imported review pass as one written to you.
- It will not see, check or keep the written permission you state you hold: it records your statement, and the public record says it is yours.
- It does not make you compliant with any law. It records which basis you stated, in the words you checked.
- It will not read imported words for risk on the free plan, which carries no AI readings, and it will not present a row it did not read as one that was read.
Where it lives in the code: lib/sources.ts · app/api/import/route.ts · lib/csv.ts · lib/takeout.ts · lib/import-detect.ts
Questions
Asked about this
From Help, where every answer is written from the product as it runs.
What about a review I imported from Google?
It carries a note saying the owner copied it from a public review and confirmed they may republish it — and that no permission was collected here, because none was. It never pretends the person was asked.
Where is the consent kept?
Beside the testimonial: its recorded permission sentence, scopes, date and source. For a customer submission, the sentence records what the person agreed to here. Imports, connected feeds and API additions carry an account holder statement instead; they do not claim the writer agreed here. These records are included in your CSV export.
Which permissions does Hazelsong actually enforce?
There are four separate choices: your website, public pages hosted by Hazelsong, social media, and ads or printed material. Website widgets and the testimonial API require website permission; public hosted walls require hosted permission, plus publication enabled by a verified project owner. Social images and clips require social permission. Approval alone grants none of these, and missing scopes grant no permission. Ads and printed material are made outside Hazelsong, so that answer is recorded for you to honor rather than enforced by an advertising channel here.
They checked off website but not ads. What happens if I use it in an ad?
Nothing here stops you, because nothing here places ads. What the product does is keep the answer where you can find it: the consent sentence on the card names only the places that person allowed, and your CSV export lists what they checked off — which is the form you would want it in if they, or anybody else, ever asked what they had agreed to. The decision, and the responsibility for it, are yours. Hazelsong checks the recorded website, hosted-page and social permissions when serving those respective channels.
This is running now
Open a project and use it. Nothing on this page is a roadmap.