# Set how your storefront appears in search

> Set your site name, the home page title and description, the share picture, social profiles, ownership codes, redirects, robots rules and IndexNow.

Source: https://www.coritan.com/docs/organizations/seo/

In the dashboard:

- /dashboard/organizations/…/settings/seo: https://www.coritan.com/dashboard/organizations

Search engines and social sites read your storefront before a person does. This page covers what you can set, where, what each setting does and how to check it. An empty field always uses the default your brand ships with, so you only fill in what you want to change.

## Before you begin

- You need the Owner or Admin role in the organization to change anything. Any other member can open the page in the dashboard, read the saved values and test a path.
- Your storefront must be served by Coritan on its own hostname. An organization with no storefront host can save settings, but it cannot test a path or make an IndexNow key.
- For verification you need an account with the search engine you want to prove ownership to.

## Where to set it

The dashboard, the staff console and the admin console edit the same settings, so a change in one shows in the others.

In the [dashboard](https://www.coritan.com/dashboard/organizations), open your organization, then **Settings**, then **SEO**. The page has six cards. **Search appearance**, **Social profiles**, **Verification** and **Robots** each have their own **Save changes** button, and **Discard** puts that card back as it was. The footer counts the changes you have not saved. A card sends only its own fields, so what you typed in another card stays unsaved until you save that card. The **Redirects** card and the **IndexNow** card act as you press their buttons, and **Hold indexing** on the **Robots** card asks you to confirm and saves at once.

The staff console on your storefront has the same settings at `/staff/settings`, then the "SEO" tab. Platform staff set them for any organization in the admin console: open the organization, then "Settings", then "SEO". In both, four panels share one "Save search settings" bar, which appears while something is unsaved, and "Discard" puts the panels back as they were. The "Redirects" panel and the "IndexNow" panel save on their own, because each is one action on a list. "Hold indexing" asks you to confirm and saves at once.

A value that breaks a rule is refused with a sentence that names the field, and nothing is saved. A change reaches new page loads within a minute, and the [audit log](/docs/organizations/audit-log/) records it as `settings.seo.updated` with the fields before and after.

## Search appearance

| Field | Limit | What it does |
| --- | --- | --- |
| "Site name" | 80 characters | The name in the site's structured data and in the `og:site_name` tag. Search engines may use it as the name they show for the site. Page titles keep the name your brand ships with. |
| "Other names" | 5 names, 80 characters each, one per line | Other names people use for the brand, given to search engines as alternate names. |
| "Home page title" | 60 characters recommended, 120 allowed | The title of the home page in search results and when a link is shared. Only the home page changes. |
| "Home page description" | 160 characters recommended, 320 allowed | The home page's description in search results and share cards. |
| "Social image" | An `https://` address, or a path under `/assets/` that ends in `.jpg`, `.png` or `.webp` | The picture a shared link shows, about 1200 by 630 pixels. |
| "Social image description" | 420 characters | What the picture shows, for someone who cannot see it. |

The counters under the title and description turn amber when the text is longer than a result shows, which is about 60 and 160 characters. The text still saves, and a search engine cuts it. A preview under the description shows how the home page may look in a result. It is a guide, not what any engine will print.

An empty "Home page title" or "Home page description" uses your brand's own words. The title and description you set apply to the home page only, so the pages that make up the rest of your storefront keep theirs.

## Social profiles

List your profiles on X, Facebook, Instagram, YouTube, TikTok, Discord, Twitch, GitHub, LinkedIn, Reddit, Bluesky, Threads, Pinterest, Steam, Trustpilot and Mastodon. Each link must be `https://`, up to 300 characters, and on that network's own address (a Mastodon link can be on any host). Search engines read them as the brand's own profiles. The X profile also sets the `twitter:site` tag on every page.

## Verification

A search engine asks you to prove that you own the site. Use either a tag or a file.

- **A tag.** Paste the content of the meta tag into "Google tag", "Bing tag" or "Yandex tag", not the whole tag. Letters, digits, `-` and `_`, up to 128 characters. The storefront puts `google-site-verification`, `msvalidate.01` or `yandex-verification` in the head of every page.
- **A file.** Paste the file name Google gives (`google0123456789abcdef.html`), the 32 character code in Bing's `BingSiteAuth.xml`, or the file name Yandex gives (`yandex_0123456789abcdef.html`) into the "file" fields. The storefront then serves the file at its address with the exact body the search engine expects, and answers 404 for any other name.

After you save, the panel lists the addresses the site serves. Open them in a browser, then press the verify button in the search engine's console.

## Redirects

When a page moves, add a redirect so its old address keeps working. Choose "Add redirect…" and enter:

- "Old address": a path on your storefront, up to 300 characters, with no query or `#`.
- "New address": a path, or an `https://` address, up to 500 characters.
- "Status": `301` when the move is for good, `302` while you try it.

You can add up to 200 redirects. A redirect is refused when the old address is the home page, or starts with `/api`, `/assets`, `/staff`, `/admin`, `/t/`, `/ws`, `/health`, `/robots.txt`, `/sitemap`, `/llms` or `/.well-known`; when it points at itself; when the same old address is listed twice; when the chain loops; or when it passes through more than 3 redirects. A redirect you set wins over a page your brand lists, so use it with care. A visitor goes straight to the end of a chain in one step.

To check an address, type it into "Test a path" and choose "Test path". It says what a visitor gets today with the settings that are saved: a redirect and where it goes, a page search engines can list, a page kept out of search, or a 404. Open a row's actions menu and choose "Edit…" or "Delete…" to change or remove a redirect. Deleting asks you to confirm.

## Robots

"Extra paths to block" takes one path per line, such as `/private` or `/tmp/*`. Each becomes a `Disallow` line in `robots.txt`. A path cannot be `/`, and cannot reach `robots.txt`, `sitemap.xml`, `llms.txt` or `llms-full.txt`. Up to 50 paths, 200 characters each, with no spaces, colons or `#`.

Your storefront already keeps the staff console out of the crawl. Signed-in pages such as the account area, the sign-in pages and the checkout stay fetchable and say `noindex` in the page itself, because a search engine that is turned away at the door never reads a `noindex`.

### Hold indexing

"Hold indexing" keeps the whole site out of search. While it is on, every page answers `noindex, nofollow`, every response carries `X-Robots-Tag: noindex, nofollow`, and `robots.txt` says `Disallow: /`. The page content still renders for visitors.

Use it when a host is not the address people should find, for example before you move to a new hostname. It is off by default. Turn it off when the site goes live. Search engines take days to weeks to list or drop pages after you change it.

> [!WARNING]
> Holding indexing removes the site from search results over the following days. Check the switch when a search engine reports that pages are excluded by a `noindex` tag.

## IndexNow

IndexNow tells Bing, Yandex and other search engines that use it the moment a page is published or removed, so they crawl it in minutes. Choose "Make key" to turn it on. The storefront serves the key as a text file at `/<key>.txt`, which is how a search engine knows the request comes from you.

With a key set, the storefront sends the address of a guide or a server listing when it goes live, changes or comes down, and of a forum thread when someone starts it and the forum counts it worth listing. Choose "Send all URLs now…" to send every address in the sitemap, in batches of 100. That button works up to 4 times an hour. It is off while Hold indexing is on, and whenever the organization has no storefront host. "Make new key…" replaces the key at once, and "Remove key…" stops the file and the sending.

## Languages

A storefront can serve its pages in more than one language. Your brand lists its languages, and a storefront with one language is not changed. This section describes a storefront with several, such as MCServerHost, which serves twelve.

English keeps the addresses it always had. Every other language lives under its code: the German copy of `/products` is `/de/products`, and the German home page is `/de`. A visitor can open any of them, share them, and a search engine can list each one on its own.

### Which pages have a copy

The home page, the plans page, the free server page, the status page, the community home page and its server and guide lists, downloads and careers have a copy in every language.

A page written by one person in one language has one address: a server listing, a guide, a forum thread, the legal pages, and pages with no translated title. A request for one of them under a language prefix answers `301` with the plain address. Signed-in pages such as `/de/login` open in the language and stay `noindex`, as they do in English. The staff console is English, and `/de/staff` answers `301` with `/staff`.

### What each copy says

A copy is written in the language of its address: the title, the description, the headings, the text and questions a search engine reads, and the menu that shows while the page loads. The words come from the same translation files the storefront shows a visitor, and a phrase a language has not translated falls back to English one phrase at a time. `<html lang>` and `og:locale` name the language.

### How a search engine tells the copies apart

Every copy lists all of its languages with `<link rel="alternate" hreflang="...">`, itself included, and `x-default` points at the English copy. Each copy names its own address as its canonical. A page kept out of the index lists no languages. `/sitemap.xml` lists every copy of a page with the same set, and `llms.txt` stays in English.

### What you set applies to English

"Home page title" and "Home page description" are written in one language, so they change the English home page only. Each other language keeps its translated home page title and description. "Site name" and the social profiles apply to every language. A redirect you add from `/old-page` also answers `/de/old-page`, and it goes to the German copy of the new address when that page has one.

### What a visitor sees

The server never sends an English address to another language. A visitor whose browser or earlier choice names a language still reads that language on it, and the language menu offers the same page at that language's address. Picking a language in the header menu opens the same page in it (English removes the prefix) and remembers the choice. A visitor who opens `/de/products` reads German, and the pages with no prefix, such as sign in and the panel, then stay in German.

### Check a language

Open `/de/products` and view the source. The `<html>` tag says `lang="de"`, the title and description are German, `rel="canonical"` is the `/de/products` address, and thirteen `rel="alternate"` lines list the twelve languages and `x-default`. Open `/sitemap.xml` and look for the same lines inside each `<url>`.

## When the storefront is in maintenance

While the maintenance switch on the Features tab is on, every page request on your storefront answers `503` with `Retry-After: 3600`, so search engines try again later instead of indexing a maintenance page. The page still renders, so visitors see the maintenance page and signed-in staff get through. The staff console, the API and the assets are never answered with `503`.

## Result

View the source of your home page. The title, description and `og:` tags are the ones you set. An `application/ld+json` block names your site, your alternate names and your profiles under `sameAs`, and the verification tags are in the head. Open `/robots.txt` to see your extra paths and the `Sitemap:` line. Open `/sitemap.xml` to see the pages a search engine is told about.

## Troubleshooting

### The preview and the search result do not match

The preview shows what the title and description say, cut to the length a result shows. A search engine may choose another title or description, or show your domain instead of the site name. It decides for itself, and a change here is a suggestion it weighs.

### A verification file answers 404

The file name must be exactly what the search engine gave, including the `.html`, and saved in the "file" field. Check the address the panel lists, and that the field is saved.

### A redirect is refused

The sentence names the problem: a loop, a chain over 3 redirects, a reserved path, or an old address that is already listed. Fix that row and save again.

### Pages say `noindex` and `robots.txt` blocks everything

Hold indexing is on. Turn it off with the "Hold indexing" switch in the "Robots" card (the "Robots" panel in the staff console).

### "Send all URLs now…" is disabled

The card says why: there is no key yet, indexing is on hold, or the organization has no storefront host.

### The page says Coritan serves no storefront host for this organization

Search settings apply to a storefront that Coritan serves on a hostname of its own. Until one is connected, you can save the settings, but "Test path" and "Make key" stay off and nothing on a public page changes. [Contact support](https://www.coritan.com/dashboard/support) to connect your storefront host.

## With the API

`GET /api/v1/orgs/{org_slug}/seo` reads the saved `seo` block, the `defaults` an empty field falls back to, the `limits`, the `networks` a profile link may name, the storefront `host`, the addresses the site serves for `files` and the state of IndexNow. Any member of the organization may read it. `PUT` on the same path needs the Owner or Admin role. It saves only the fields you send, and an empty one goes back to the default. It answers with the same body as `GET` plus `changed`, which lists each field that differs from before as its old and new value. It answers `400` with a sentence that names the field when a value breaks a rule, and saves nothing.

```bash
curl -X PUT "https://api.coritan.com/api/v1/orgs/acme/seo" \
  -H "Authorization: Bearer $CORITAN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "home_title": "Acme: game servers that stay up",
    "social": { "x": "https://x.com/acmehosting" },
    "redirects": [{ "from": "/plans", "to": "/products", "status": 301 }]
  }'
```

The fields are `site_name`, `alt_names`, `home_title`, `home_description`, `og_image`, `og_image_alt`, `social` (a map of network to link), `verification` (`google`, `bing`, `yandex`, `google_file`, `bing_file`, `yandex_file`), `robots_extra`, `redirects` (a list of `from`, `to` and `status`) and `hold_indexing`. The IndexNow key is made by `POST .../seo/indexnow-key` and removed by `DELETE` on the same path, both for the Owner or Admin role. `POST .../seo/indexnow/submit` needs the same role. It queues every address and answers `202` with `queued` and `job_id`, `409` when IndexNow cannot send, and `429` past 4 runs an hour for the whole organization. `GET .../seo/test-path?path=/old-page` is open to every member and answers the `kind` (`redirect`, `indexable`, `noindex` or `not_found`) with `redirect_to` and `status` for a redirect. It answers `400` for a path that does not start with one `/` or has a space in it, and `409` when the organization has no storefront host.

The staff console calls the same operations under `/api/v1/orgs/{org_slug}/staff/settings/seo`. Each answers as the route above does, and each, reads included, needs the Owner or Admin role.

## Next steps

- [Add analytics and ad tags to your storefront](/docs/organizations/tags/)
- [Manage the staff team and console settings](/docs/organizations/staff-console/team-and-settings/)
- [Change organization settings](/docs/organizations/settings/)

## API

- `GET /api/v1/orgs/{org_slug}/seo`: Get org seo (https://www.coritan.com/docs/api/reference/organizations/organizations-members/seo/#op-get-api-v1-orgs-org-slug-seo)
- `PUT /api/v1/orgs/{org_slug}/seo`: Save the search settings sent (https://www.coritan.com/docs/api/reference/organizations/organizations-members/seo/#op-put-api-v1-orgs-org-slug-seo)
- `POST /api/v1/orgs/{org_slug}/seo/indexnow-key`: Make a new IndexNow key (https://www.coritan.com/docs/api/reference/organizations/organizations-members/seo/#op-post-api-v1-orgs-org-slug-seo-indexnow-key)
- `DELETE /api/v1/orgs/{org_slug}/seo/indexnow-key`: Remove the IndexNow key (https://www.coritan.com/docs/api/reference/organizations/organizations-members/seo/#op-delete-api-v1-orgs-org-slug-seo-indexnow-key)
- `POST /api/v1/orgs/{org_slug}/seo/indexnow/submit`: Send every page in the storefront's sitemap to IndexNow now, in batches of 100 (https://www.coritan.com/docs/api/reference/organizations/organizations-members/seo/#op-post-api-v1-orgs-org-slug-seo-indexnow-submit)
- `GET /api/v1/orgs/{org_slug}/seo/test-path`: Test org seo path (https://www.coritan.com/docs/api/reference/organizations/organizations-members/seo/#op-get-api-v1-orgs-org-slug-seo-test-path)
- `GET /api/v1/orgs/{org_slug}/staff/settings/seo`: Staff get seo (https://www.coritan.com/docs/api/reference/organizations/organizations-members/staff/#op-get-api-v1-orgs-org-slug-staff-settings-seo)
- `PUT /api/v1/orgs/{org_slug}/staff/settings/seo`: Save the brand's search settings (https://www.coritan.com/docs/api/reference/organizations/organizations-members/staff/#op-put-api-v1-orgs-org-slug-staff-settings-seo)
- `POST /api/v1/orgs/{org_slug}/staff/settings/seo/indexnow-key`: Make a new IndexNow key (https://www.coritan.com/docs/api/reference/organizations/organizations-members/staff/#op-post-api-v1-orgs-org-slug-staff-settings-seo-indexnow-key)
- `DELETE /api/v1/orgs/{org_slug}/staff/settings/seo/indexnow-key`: Remove the IndexNow key (https://www.coritan.com/docs/api/reference/organizations/organizations-members/staff/#op-delete-api-v1-orgs-org-slug-staff-settings-seo-indexnow-key)
- `POST /api/v1/orgs/{org_slug}/staff/settings/seo/indexnow/submit`: Send every page in the sitemap to IndexNow now (https://www.coritan.com/docs/api/reference/organizations/organizations-members/staff/#op-post-api-v1-orgs-org-slug-staff-settings-seo-indexnow-submit)
- `GET /api/v1/orgs/{org_slug}/staff/settings/seo/test-path`: Staff test path (https://www.coritan.com/docs/api/reference/organizations/organizations-members/staff/#op-get-api-v1-orgs-org-slug-staff-settings-seo-test-path)
