# Wall of Love

> Build a Wall of Love, a hosted page of your testimonials with a header and a button: its address, layout, search settings, and how to link or embed it.

A Wall of Love is a page of your testimonials that we host for you. It
has a header, your testimonials as cards, and a button that takes
visitors where you want them. You link to it from your site, your emails
and your profiles, with nothing to paste. Open **Testimonials** in the
site's sidebar, then the **Walls** tab.

Walls are on every plan, and a site can have as many as it needs. When a
site has exactly one wall, the tab opens that wall's builder directly.
Press **Walls** above the builder's title for the list.

## The list

**New wall** (key `N`) opens the builder. **Removal requests** opens the
requests people made for a testimonial to come down, with the number
that are open. See
[Removal requests](/docs/testimonials/permalinks#removal-requests).

| Column | What it shows |
|---|---|
| Name | The wall's name and its address, which opens the page |
| Fed by | The collection, shared view, tags or number of hand-picked testimonials behind it, or "Not fed yet" |
| Showing | How many testimonials it shows right now |
| Views | The total for the last 30 days |

Search covers the name and the address. Sort by **Name** or **Newest**.
The menu at the end of a row has **Edit**, **Open the page**, **Link and
embed**, **Duplicate** and **Move to trash**. A wall in the trash is not
listed. It is on the [Trash](/docs/testimonials/trash) page of
Testimonials.

When you start Testimonials with "find testimonials on my website" in
the Inbox, the site gets a wall named **Wall of Love**, titled "What
people say about" your site, with an address made from the site's name
and a **Visit our website** button to your domain. It is fed by a shared
saved view named **All approved**, so it fills as you approve
testimonials, on every plan.

## The builder

The builder has five tabs, **Page**, **Content**, **Style**, **Search**
and **Embed**, beside a live preview. The Embed tab appears once the
wall is saved, and the first save opens it. The preview works the same
way as the widget's:
see [The live preview](/docs/testimonials/widgets#the-live-preview).
Nothing is live until you press **Save**.

The header of a saved wall has **Open the page** and a **More** menu
with **Duplicate**, **Removal requests** and **Move to trash**.

### Page

| Setting | What it does |
|---|---|
| **Name** | Up to 100 characters. Only your team sees it. A new wall starts as "Wall of Love" |
| **Address** | The last part of `/w/<slug>`. 3 to 60 lowercase letters, numbers and hyphens, unique across Privatus Analytics. Left empty on a new wall, it is made from the name. When you change it, the old address keeps working and sends visitors to the new one |
| **Language** | The language of the page's own words. Shown when the site has more than one language |
| **Layout** | **Masonry** (the default), **Grid** or **List** |
| Layout options | Masonry: **Columns** (2 to 5, default 3) and **Space between cards**. Grid: **Columns** (1 to 5, default 3), **Space between cards** and **Same height in each row**. List: **Person** left of the words or above them, and **Lines between, no boxes** |
| **Title** | The heading, up to 120 characters. "Wall of Love" unless you change it |
| **Subtitle** | The line under the heading, up to 300 characters |
| **Logo** | On by default. Shows the brand kit's logo above the title, when the brand kit has one |
| **Average rating and count** | On by default. Worked out from everything that feeds the wall, never typed. Shown once at least one testimonial has a rating |
| **Button text** and **Button link** | Your call to action, shown in the header and again at the foot of the page. The text is up to 40 characters and the link must start with `https://`. The button needs both |
| **"Add yours" opens** | Adds a second button, "Add yours", that opens one of your [forms](/docs/testimonials/forms). **No "Add yours" button** leaves it out |

### Content

The Content tab is the same as a widget's. Choose
[what feeds the wall](/docs/testimonials/widgets#what-feeds-it) (a
collection, a shared saved view, tags or a hand-picked list of up to
100), the **Order**, and
[what each card shows](/docs/testimonials/widgets#what-each-card-shows).
A wall has no "Show at most": it shows 24 testimonials a page.

The rule for
[what is shown, and what never is](/docs/testimonials/widgets#what-is-shown-and-what-never-is)
is the same too.

### Style

The same settings as a
[widget's Style tab](/docs/testimonials/widgets#style), with two
differences. The page background is the brand kit's background unless
you set another. And on a page we host there is no site to match, so the
font choice "Match my site" means the brand kit's fonts. No font file is
loaded.

Custom CSS is part of Business and Enterprise, and hiding the "Collected with
Privatus Analytics" badge is part of Business. See the
[styling reference](/docs/testimonials/styling).

### Search

A hosted wall always asks search engines not to list it, and there is no
switch for that. The tab says so: "This page asks search engines not to
list it. To have the words found in search, show the wall or a widget on
your own site."

| Setting | What it does |
|---|---|
| **Title in search results** | Up to 70 characters. The wall's title unless you write one |
| **Description in search results** | Up to 160 characters. The subtitle unless you write one, and without a subtitle "What customers say about" your site, "in their own words." |
| **Picture when the page is shared** | An image you upload, about 1200 by 630 pixels. Without one, your logo is used |
| **Add review markup** | The same switch as on a widget. It is part of Business. See [Review markup](/docs/testimonials/widgets#review-markup) |

### Embed

The link and the code. See
[Link to it or embed it](#link-to-it-or-embed-it).

## The public page

The wall is at `https://privatus.page/w/<slug>`. It, and every public page,
form and widget of the site, is shown only once the site is
[verified](/docs/getting-started/verify-installation#verified-sites-and-public-pages).

| Part | Detail |
|---|---|
| The words | Written into the page itself, so visitors without JavaScript read them |
| More testimonials | "Load more" adds the next 24 cards under the ones already shown, and disappears after the last page. It is a real link to the next page (`?page=2`), so without JavaScript, or if the cards cannot be fetched, it opens that page instead. Later pages show the cards without the header |
| Light or dark | Follows the visitor's device, unless the wall is set to always light or always dark |
| An empty wall | Shows its header and "Nothing here yet." |
| "This is mine, remove it" | Every card has a small **More** that opens this link. It leads to the [removal form](/docs/testimonials/permalinks#the-removal-form) for that testimonial |
| Search engines | The wall's page, its embed frame and every other page we host for you are served with `noindex` and are not in the Privatus Analytics sitemap. Search engines index your customers' words on your own site (the pasted HTML embed, and review markup), never on ours |
| Framing | The page itself cannot be shown in a frame. Use the frame code below. The frame and the embedded wall ask search engines not to list them |

> **Privacy:** The page sets no cookie, reads none, stores nothing in
> the browser and loads nothing from any other company. Photos, videos
> and audio come from `media.privatusanalytics.com`, which is ours.

A view is counted when the wall is seen, a click when a link on it is
pressed and a play when a video is started, as totals per day with the
page and the country. No IP address, no User-Agent and no identifier is
stored. See
[What the script does on your site](/docs/testimonials/widgets#what-the-script-does-on-your-site).

### Other languages

On Business, a wall has an address for each of the site's other
languages: `/w/<slug>/<code>`, for example `/w/<slug>/de`. On Free and
Pro it has one for each of those languages the site holds stored
translations in, so the addresses keep working after a downgrade. There the
page's own words are in that language, and each testimonial shows its
stored translation when it has one, marked "Translated". Each page tells
search engines about the others.

The language always comes from the address, never from a cookie or the
visitor's browser. An address with a language the wall does not offer
sends the visitor to the wall's main address.

## Link to it or embed it

The **Embed** tab of the builder has three ways, each with a copy
button. **Link and embed** in the list opens the same tab.

| Way | Use it when |
|---|---|
| **Link** | You want a page of its own. This is the usual way |
| **Inside your own page** | Your site lets you add a script, and you want the wall as part of one of your pages |
| **Frame** | Your site builder allows nothing else |

```html
<div data-pa-testimonial-wall="wal_..." style="min-height:480px"></div>
<script src="https://privatus.page/embed/widget.js" async></script>
```

**Inside your own page** shows the wall with its header and buttons. For
the cards alone, add `data-header="off"` to the first line. The tab
gives you both versions ready to copy. The script is the same one
widgets use, so a page with a wall and several widgets loads it once.

```html
<iframe src="https://privatus.page/embed/walls/wal_..." title="Wall of Love" loading="lazy" width="100%" height="900" style="border:0"></iframe>
```

A **Frame** shows the cards without the header, at a fixed height.
Change the `height` to fit your page.

An embedded wall, by script or by frame, shows 24 testimonials and a
"Load more" button that shows 24 more each time, up to 72. A wall with
more than that ends with a "See all" link to the wall's own page.

For the steps in common site builders, see
[Install on your site](/docs/testimonials/install-a-widget).

## When your changes show

The wall page and its embeds are kept on Cloudflare's servers close to
your visitors. They are cleared for the same changes as a widget: the
wall, a testimonial on it, a person shown on it, a tag, collection or
shared view that feeds it, the brand kit, the site's languages or name,
and the workspace's plan. A change shows within about ten seconds. An
embedded wall is kept by a visitor's browser for five minutes like a
widget, so a testimonial you unapprove or trash is gone from new visits
within about ten seconds, and from a browser that already loaded the
embed within 5 minutes. The wall's own page is not kept by browsers. See
[When your changes show](/docs/testimonials/widgets#when-your-changes-show).

A browser keeps an embedded wall (the script or the frame) for five
minutes. The wall's own page is never kept by browsers.

**Duplicate** copies every setting under the name "Name (copy)" and a
free address. **Move to trash** keeps a wall for 30 days. While it is
there, its page says "This page has been taken down." and its embeds
show nothing. Restoring the wall from the
[Trash](/docs/testimonials/trash) page brings the page and the embeds
back at the same address.

## API and MCP

| Action | MCP tool | Permission |
|---|---|---|
| List, read one | `testimonial_walls_list`, `testimonial_walls_get` | `analytics.read` |
| Create, change | `testimonial_walls_create`, `testimonial_walls_update` | `content.write` |
| Duplicate | `testimonial_walls_duplicate` | `content.write` |
| Move to trash, restore | `testimonial_walls_trash`, `testimonial_walls_restore` | `content.write` |
| The link and the code to embed it | `testimonial_walls_embed` | `analytics.read` |

A create call with only a name makes a working wall: the title "Wall of
Love", the masonry layout and an address made from the name. It shows
testimonials once you choose what feeds it. A change that is not allowed
responds with `422` and names the input: an address that is malformed or
in use (the message suggests a free one), a button link that does not
start with `https://`, a language the site does not have, or a form or
image that is not the site's. A change the plan does not include
responds with `402` and the code `plan_limit`. Inputs and response
fields are in the [API reference](/docs/api) and the
[MCP reference](/docs/mcp).

An AI assistant cannot delete anything or move anything to the trash.
The MCP tool `testimonial_walls_trash` runs nothing: it responds with
`human_only` and the address of the wall's page, and the assistant hands
you that link. The API call runs as usual, and
`testimonial_walls_restore` runs over both.

## Good to know

- **Locked options say why.** On Free and Pro the badge menu is fixed on
  "Show the badge", **Add review markup** cannot be ticked and the
  custom CSS field cannot be typed in. Each has a line naming the
  plan and a link to the plans.
- **After a downgrade nothing is deleted.** The badge comes back, custom
  CSS is not applied and review markup is left out, all within about
  ten seconds. Stored translations keep being shown, and a language
  address the site holds no translation in sends visitors to the main
  address. The settings stay as you saved them and work again when the
  plan includes them.
- **An address stays yours.** An address a wall used to have keeps
  redirecting to it and cannot be taken by another wall.
- **A wall always counts views.** Unlike a widget, it has no switch for
  it.
- **The public page takes 120 requests a minute from one connection**,
  then responds "One moment." for the rest of that minute.
- **A custom domain** for a wall is part of Business and is set up on
  request. See [Custom domain](/docs/testimonials/custom-domain).
