# Get started > Go from a new Mark account to your first scheduled post, one step at a time. Source: https://docs.use-mark.com/docs/get-started This guide takes you from a new account to a post that is approved and scheduled on one social channel. Each step links to a full guide if you want more detail. You need a Mark account and access to one social account you can post from, such as an Instagram Business account or an X account. > **Or do this from your AI assistant.** Every step except connecting the > social account works from Claude, ChatGPT, Cursor, or another AI agent. > [Connect your AI agent](/docs/use-mark-from-ai-agents), then ask it to > "set up our brand and a market, then draft and schedule a first Instagram > post for review." ## 1. Sign in and pick a workspace 1. Open [app.use-mark.com](https://app.use-mark.com) and sign in. No account yet? Select **Sign up** and fill in **Create an account**. 2. Before **Home** opens, Mark asks you to choose an organization. In Mark, an organization is your workspace. Pick the one you were invited to, or create a new one named after your business. **Home** opens. A workspace holds one business's brand, posts, and connections. See [Concepts](/docs/concepts). ## 2. Set up your brand 1. In the sidebar, open **Strategy** > **Brand**. 2. In **Brand and voice**, fill in at least **Positioning**, **Tone**, and **Company name**. 3. Select **Save and confirm**. The page shows "Saved and confirmed." Every post Mark drafts follows these facts and this voice. Personas and pillars can wait. See [Set up your brand, personas, pillars, and markets](/docs/set-up-your-strategy). ## 3. Add a market 1. Open **Strategy** > **Markets** and select **Add market**. 2. Fill in **Name**, pick a **Country**, and set **Time zone** and **Priority** (use 1 for your first market). 3. Select **Save market**. The page shows "Market saved." ## 4. Connect one social channel 1. Open **Content** > **Channels**. 2. Under **Social**, find the channel's card and select **Connect**. 3. Sign in to the platform and authorize Mark. You come back to **Channels**, which says the channel is connected, like "Instagram is connected." The card now shows the account, like `@verdella`. Keep its **Approval policy** on **Required** so the post waits for your approval in step 7. See [Connect social accounts](/docs/connect-social-accounts) for what each platform asks of you. ## 5. Create a draft 1. Open **Content** > **Posts** and select **New post**. 2. Pick the **Channel** you connected and select **Create draft**. 3. Write the **Body**. The counter shows its length against the channel's limit. 4. Set **Scheduled time** to when the post should go out. 5. Attach an image or video with **Attach media** if the channel needs one. Instagram does. See [Create and submit a post](/docs/create-and-submit-a-post). ## 6. Submit it for review Select **Submit for review**. Mark saves the post and its status changes to **In review**. The post is locked until a reviewer decides. ## 7. Approve it 1. Open **Content** > **Review**. The post is on the **Needs review** tab. 2. Select the post to open its review page and check the **Preview** and **Delivery** time. 3. Select **Approve**. The box says "Decision recorded." See [Review and approve posts](/docs/review-and-approve-posts). ## 8. See it scheduled Open **Content** > **Posts** and select the **Scheduled** tab. Your post is there with its **Goes out** time. Its status reads **Approved**, then **Scheduled** once the channel accepts it. **Content** > **Calendar** shows it on its day. Mark publishes the post at its scheduled time, and it moves to the **Published** tab. ## Next * [Set up posting slots](/docs/set-up-posting-slots) so each channel has regular times to post. * [Review and approval](/docs/concepts/review-and-approval) explains every status and the emails approvers get. * [Browse the rest of the docs by task](/docs). # Overview > What Mark is, who it is for, and where to start in these docs. Source: https://docs.use-mark.com/docs When you stop working, your go-to-market stops too. Posting the same content to several platforms eats hours, and AI assistants recommend your competitors instead of you. Mark is for small business owners and operators who need to do more with less and would rather run the business than become a marketing expert. Mark drafts your posts from your brand and voice and publishes them to Instagram, X, Facebook, LinkedIn, TikTok, Pinterest, and YouTube once they are approved. You choose, per channel, whether a person approves every post or Mark approves posts that have no flagged claims. It tracks your keyword rankings and website health, shows which AI assistants read your pages, and reports how your posts and search traffic perform. It gets better with each review and approval. ## Pick a path * **[Get started](/docs/get-started).** Go from a new account to your first scheduled post in eight steps. * **[Use Mark from your AI agent](/docs/ai-agents).** Connect Claude, ChatGPT, Cursor, or another agent to your workspace and work from there. * **Browse by task.** Pick the job you have in mind: * [Set up your workspace](/docs/set-up-your-workspace): brand, social accounts, websites, and targets. * [Create and publish content](/docs/create-and-publish-content): write, review, approve, and schedule posts. * [Grow search and AI visibility](/docs/grow-search-and-ai-visibility): keywords, rankings, site health, and AI assistant traffic. * [Measure results](/docs/measure-results): search and social performance. * [Reference](/docs/reference): the agent tool list and the lead-capture endpoints. For the words Mark uses (workspace, draft, review), read [Concepts](/docs/concepts). # Concepts > The mental model behind Mark — workspaces, drafts, and review. Source: https://docs.use-mark.com/docs/concepts Each business runs in its own workspace. Workspaces share nothing: one business never sees another's posts, brand, or connections. * **Workspace** — one business's data: its brand, its posts and schedule, and its connections to systems like Google or the social accounts it publishes to. You can belong to more than one workspace and switch between them. * **Draft** — a post before it publishes. Drafts carry claims that need a confirmed source before they can be approved. * **Review and approval** — see [Review and approval](/docs/concepts/review-and-approval) for how a draft moves from written to published. Mark maps onto your existing systems. It does not invent new fields, statuses, or lists in your CRM. # Review and approval > How a draft moves from written to published, and the emails approvers get along the way. Source: https://docs.use-mark.com/docs/concepts/review-and-approval Nothing publishes until it is approved. That is the loop Mark is built around: draft, in review, approved, scheduled, published — or changes requested and back to draft. By default a person approves each post. A channel whose **Approval policy** is **Auto** approves posts with no claim flags on its own. See [Connect social accounts](/docs/connect-social-accounts#set-publishing-rules). A draft that cites an unconfirmed claim gets flagged, and the flag blocks approval until someone confirms the source. It gets better with each review and approval. Who reviews depends on the workspace. In a client's tenant, that client is the approver — the UI names them (`Waiting on Verdella`), not a generic pending state. ## Emails approvers get Mark emails workspace members when a post in review needs attention. Each post in an email has a **Review post** button that opens its review page. * **Posts waiting for review** is a daily digest. It says "Verdella has 3 posts in review." and lists each post by channel with its scheduled time, or **No time set**. When a post is due soon, the list starts under **Due within 24 hours**. * **A post needs your review** covers one post that's due within 24 hours. Some workspaces get this in place of the daily digest. * **A post missed its scheduled time** means the post was still in review when its time passed, so it didn't publish. Open it to decide what happens next. The member who submitted a post doesn't get the digest or the due-soon email about it. A missed post emails every workspace member, including the person who submitted it. # Set up your workspace > Tell Mark about your brand, connect the accounts it posts to, and add the websites it tracks. Source: https://docs.use-mark.com/docs/set-up-your-workspace Do these once, when the workspace is new. Brand, personas, pillars, and markets come first, because posts and angles build on them. * [Set up your brand, personas, pillars, and markets](/docs/set-up-your-strategy): the facts, voice, audiences, and themes your posts follow. * [Connect social accounts](/docs/connect-social-accounts): connect Instagram, X, Facebook, LinkedIn, TikTok, Pinterest, or YouTube from **Channels**. * [Manage websites](/docs/manage-websites): add the websites Mark tracks and pick the primary one. * [Install the site tag](/docs/install-the-site-tag): one script that reports page views and lead-form submissions to Mark. * [Set up posting slots](/docs/set-up-posting-slots): the weekly times each channel posts. * [Set KPI targets](/docs/set-kpi-targets): a monthly goal for each metric. # Set up your brand, personas, pillars, and markets > Fill in and confirm your brand, then add the personas, pillars, and markets your posts build on. Source: https://docs.use-mark.com/docs/set-up-your-strategy Your posts and angles build on your brand, personas, pillars, and markets, so set these up first. Each has its own page in the sidebar under **Strategy**: **Brand**, **Personas**, **Pillars**, and **Markets**. Many fields are lists that take one entry per row. Select **Add** plus the field name (for example, **Add Tone**) for another row, and the **×** next to a row to remove it. Create personas and pillars before you create **Angles**, because angles build on them. [**Targets**](/docs/set-kpi-targets), the last page in the group, has its own guide. ## Brand Brand holds the facts and voice your posts should follow, plus your visual identity. The page has two groups, **Brand and voice** and **Visual identity**, and each one is saved and confirmed on its own. 1. Open **Strategy** > **Brand**. 2. In **Brand and voice**, fill in: * **Positioning**, **Differentiators**, and **Doctrine**. * Under **Voice**: **Tone**, **Principles**, **Do**, **Don't**, **Example posts**, **Hashtags**, and **CTA defaults**. * Under **Company facts**: **Company name**, **Website**, **Headquarters**, **Product range summary**, **Factory locations**, and **Languages**. 3. Select **Save and confirm** at the bottom of the group. The page shows "Saved and confirmed." 4. In **Visual identity**, set the **Logo**, **Favicon URL**, **Colors**, **Heading font**, and **Body font**. 5. Select **Save and confirm** at the bottom of that group. To set the logo, select **Choose logo**, pick one image or upload one, and select **Done**. To clear it, select the **×** next to the logo. Either way, select **Save and confirm** for **Visual identity** to keep the change. ### Confirmed or not confirmed Saving a group is how you confirm a person has reviewed its values. Under each group's name, the page shows "Confirmed" with the date and time of the last save, or "Not confirmed" if nobody has saved that group yet. Saving one group doesn't touch the other. Saving **Brand and voice** leaves **Visual identity** and its confirmation as they were, and the other way around. ## Personas A persona is an audience your content is built to help and persuade. 1. Open **Strategy** > **Personas**. 2. Select **Add persona**. 3. Fill in: * **Name**: what you call this audience. * **Slug**: a short, unique label for the persona. * **What they want**: the outcome this audience is after. * **What convinces them**: one entry per row. * **Objections**: one entry per row. 4. Leave **Active** checked unless you're adding it for later. 5. Select **Save persona**. The page shows "Persona saved." To change a persona, select **Edit** on its row, update the fields, and select **Save persona** again. ## Pillars A pillar is a theme your content returns to, with the formats that make it useful. 1. Open **Strategy** > **Pillars**. 2. Select **Add pillar**. 3. Fill in: * **Name**: the theme. * **Slug**: a short, unique label for the pillar. It's fixed after you save. * **Formats**: the kinds of posts that suit this theme, one per row. * **Notes**: anything else the team should know. 4. Leave **Active** checked unless you're adding it for later. 5. Select **Save pillar**. The page shows "Pillar saved." To change a pillar, select **Edit** on its row, update the fields, and select **Save pillar** again. Each pillar's row shows its slug and formats, or "No formats yet". ### A pillar's slug is fixed After you save a pillar, **Edit pillar** shows the slug as text instead of a field. The app explains why: "Set when the pillar was created. Tracking links already built from it carry this slug as their campaign, so changing it would split this pillar's reporting in two." Pick the slug with care when you create the pillar. ## Markets A market is a place you prioritize, with the local time zone it uses. 1. Open **Strategy** > **Markets**. 2. Select **Add market**. 3. Fill in: * **Name**: what you call the market. Each market needs its own name. * **Country**: open the list, type part of the country's name, such as "korea", then pick it. * **Location** and **Language**: where AI search volume and the weekly answer-engine check look. Picking a country fills in its location and language when there's one clear match, such as United States and English. Change either one if you need to. Language only lists the languages the chosen location offers. * **Time zone**: the market's local time zone, such as Europe/Berlin. * **Priority**: a whole number. The list shows lower numbers first. 4. Leave **Active** checked unless you're adding it for later. 5. Select **Save market**. The page shows "Market saved." To change a market, select **Edit** on its row, update the fields, and select **Save market** again. A market saved before the country list existed may show "Saved as" under **Country**. Choose its country from the list to save it. Each market's row reads like "Germany · Europe/Berlin · Priority 1", with its search location below, such as "DataForSEO: Germany · German". A row that shows "No DataForSEO location" has no location and language yet, so AI search volume and answer-engine checks skip it. Select **Edit** to set them. If the location list can't load, **Location** and **Language** show "Locations unavailable". You can still save the other fields, and the market keeps the location and language it already had. ## Deactivate or delete Personas, pillars, and markets work the same way when you're done with one. * **Deactivate** keeps the item but marks it **Inactive**. Inactive items move to the bottom of the list. Select **Reactivate** to bring one back. * **Delete** removes it for good. Mark asks you to confirm first, because it can't be undone. Mark refuses to delete an item while something still uses it, and tells you to deactivate it instead: * A persona or pillar can't be deleted while posts or angles still use it. * A market can't be deleted while posts or answer-engine checks still use it. When you see "Can't delete this persona because posts or angles still use it. Deactivate it instead." (or the same message for a pillar or market), select **Cancel** and use **Deactivate**. # Connect social accounts > Connect Instagram, X, Facebook, LinkedIn, TikTok, Pinterest, and YouTube to Mark from Channels, what each platform asks of you, what each card's status means, and the publishing rules for each channel. Source: https://docs.use-mark.com/docs/connect-social-accounts Connect your social accounts on the **Channels** page so Mark can schedule and publish posts there once they're approved. Open it from the sidebar: **Content** > **Channels**. The page has four groups: **Social**, **Website**, **Email**, and **Ads**. Each channel gets a card with its connection status and its publishing rules. ## Connect a social account **Social** has a card for each of the seven channels Mark publishes to: Instagram, X, Facebook, LinkedIn, TikTok, Pinterest, and YouTube. They all connect the same way. 1. In **Social**, find the channel's card and select **Connect**. 2. Sign in to the platform and authorize Mark. You leave Mark for this step. 3. The platform sends you back to **Channels**, which says the channel is connected, like "Instagram is connected." The connected card shows the account, like `@verdella`. If authorization doesn't finish, the card stays **Not connected** and **Channels** shows an error: * If it's something you can fix, like a declined permission or a missing Facebook Page, the error says what to do. Fix it, then select **Connect** again. * If the problem is on our side, it says "Error finishing that connection. We're looking into it!" You don't need to report it. Try again later. To switch accounts or repair a connection, select **Reconnect** on a connected card. It runs the same authorization again. ## What each platform asks of you * **Instagram.** Only a Business or Creator account connects. Switch the account type in Instagram first if it's a personal account. * **X.** Sign in to the account Mark should post from. * **Facebook.** You must be an admin or editor of the Facebook Page, and you pick the Page while signing in. Mark posts to that Page. * **LinkedIn.** Choose your own profile or a company page you administer. * **TikTok.** Video posts go out as public. * **Pinterest.** You pick the board pins go to while signing in. To change the board, select **Reconnect** and pick another one. You need at least one board in Pinterest before you connect. * **YouTube.** Pick the Google account or Brand Account that owns the channel. If a Brand Account owns it, pick the Brand Account, not your personal account, and approve every permission Google asks for. On Instagram and TikTok, switching to a different account replaces the connected one and stops analytics updates for the old account's posts. The card says so. ## What each card's status means * **An account, like `@verdella`.** The account is connected and Mark can publish to it after approval. * **Not connected**, with a **Connect** button. Select **Connect** to connect the account. * **Connecting is not set up in this environment.** This copy of Mark can't connect social accounts. Ask Life With Data. ## Set publishing rules Open **Publishing rules** on a channel card to set how posts on that channel get approved and how often they go out. Select **Save** after a change. Each channel has its own rules. * **Active**: whether Mark writes for this channel. * **Approval policy**: **Required** sends every post to a reviewer before it can be scheduled. **Auto** approves a post the moment it's ready, as long as it has no claim flags, so no reviewer sees it first. * **Approver role**: which role should approve posts on this channel, **Member** or **Approver**. It's a note for your team and for Mark. It doesn't limit who can approve. * **ICP fit**: whether this channel reaches your ideal customer, **Confirmed** or **Uncertain**. * **Notes**: anything Mark should keep in mind for this channel. Social cards also have a **Bio destination**, the page your profile link points to. Once it's set, the card shows a **Profile short URL** to paste into the profile. For why review comes first and who approves, see [Review and approval](/docs/concepts/review-and-approval). ## Website rules The **Website** card covers the blog posts, FAQs, landing pages, and competitor pages Mark writes for your sites. Open **Rules by content type** to set the same rules for each content type separately. Select **Manage websites** to go to **Websites**, where you add and manage the sites themselves. ## Other connections Channels only connects social accounts. Google, Drive, and other services connect under **Settings** > **Connections**. # Manage websites > Switch between the websites Mark tracks, add one, pick the primary one, copy each site's snippet, and set how each site captures its lead form. Source: https://docs.use-mark.com/docs/manage-websites **Settings** > **Websites** shows one site at a time. The site's name at the top is a menu: select it to switch to another site, or to add one. The page opens your primary site. The first site is **primary**. It's the site **Home** shows. Each site has its own snippet and its own readiness score, and every site reports into one analytics project. Until you add a site, the page says "No websites yet. Add one to get its tag, a site audit, and an AI readiness score." Select **Add website** there to add the first one. ## Switch sites Select the site's name at the top of the page. The menu lists every site, primary first, with a **Primary** badge on the primary one. Under each name it shows the site's tag status and its readiness score once it has one. Select a site to open it. The tag status says when a page on that site last loaded its tag: * **Tag seen** with how long ago, like "Tag seen 3 hours ago". * **Tag not seen yet**. The snippet is ready, but no page on the site has loaded it. It updates within an hour of the first visit after you paste it. * **Tag not seen in N days**. The tag loaded before, but not in the last week. The snippet may have been removed from the site. * **No snippet yet**. See [When there's no snippet yet](#when-theres-no-snippet-yet). When another site's tag is not seen yet, or not seen in a week, a link next to the site's name says so, like "1 other site needs setup". Select it to open that site. Only pages on the site's own domain, or a subdomain like `www.`, count. A site that tells browsers to send no referrer (`Referrer-Policy: no-referrer`) always reads **Tag not seen yet**, even when its tag works. ## Add a website 1. Select the site's name at the top, then **Add website** at the bottom of the menu. 2. Enter the **Hostname**, like `verdella.com`. Use the bare hostname, with no `https://`, port, or path. 3. Optionally enter a **Name (optional)**, like "Main site". The menu shows the name, or the hostname if there's no name. 4. Select **Add website**. The button reads **Adding…** while it runs. The new site opens with its snippet at the top, ready to install. If the hostname isn't valid or the site is already listed, the dialog says so and nothing is added. ## Edit a site Under **Site details**, change the **Hostname** or **Name (optional)**, then select **Save**. ## Make a site primary 1. Open the site you want **Home** to show. 2. Select **More actions** (**⋯**) next to **Site audit**, then **Make primary**. The primary site has no **Make primary** option, and it shows a **Primary** badge next to its name. ## Remove a site 1. Open the site, select **More actions** (**⋯**), then **Remove website**. 2. A dialog asks to confirm, like "Remove verdella.com?" 3. Select **Remove website** to confirm, or **Cancel** to keep the site. Removing a site stops its tag working and deletes its readiness, audit, and ranking history. The page then opens your primary site. ## Copy a site's snippet Each site has its own snippet under **Tag**. Check the name at the top before you copy, so you install the right site's snippet. 1. Select **Copy**. It always copies the whole snippet. If the snippet is long, select **Show all N lines** to read it, and **Show less** to fold it again. 2. Paste it in the head of every page of that site, in the order given. Mark's tag updates itself. You paste again only after a change to the snippet, covered under form capture below. For the paste steps a site owner follows, and what the capture and consent settings do on the site, see [Install the site tag](/docs/install-the-site-tag). ### When there's no snippet yet The snippet sends analytics through your own domain, so **Tag** shows no snippet until that's set up. In its place, it shows a notice that says what's missing: * **No snippet yet: PostHog is not attached**. Mark has no analytics project for your workspace yet. * **No snippet yet: reverse proxy not checked**. The project is attached, but Mark hasn't checked whether analytics runs through your domain. Select **Check again**. * **Reverse proxy not enabled** or **Reverse proxy is not live**. Analytics doesn't run through your domain yet. Once it does, select **Check again**. The other notices link to the PostHog connection, where Life With Data finishes the setup. Every site's snippet appears once analytics runs through your domain. ## Set up form capture **Form capture** shows what that site's tag reports when a visitor submits a form: the capture method, honeypot field, Google Tag Manager, Cookiebot, and cookie consent. Each site has its own settings, because the form on your main site usually isn't the form on a landing page. 1. Select **Edit capture**. 2. Pick a **Capture method**: * **No form capture**: the tag runs analytics only. * **A form in the site's own markup**: enter the **CSS selector** that matches the form, like `#enquiry` or `form.contact-form`. * **A HubSpot form**: optionally enter the **HubSpot form GUID (optional)**. Leave it blank to capture every HubSpot form on the page. HubSpot Forms V4 isn't supported. 3. Fill in any optional fields the site needs: * **Honeypot input name (optional)**: the name of the site's bot-trap input. A submission with it filled in is dropped. * **Google Tag Manager container id (optional)**: adds Tag Manager to this site's snippet. * **Cookiebot id (optional)**: adds Cookiebot to this site's snippet. 4. Pick a **Cookie consent** setting: **No cookie banner, track every visit** or **Wait for the cookie banner's answer**. Adding a Cookiebot id switches it to wait. You can change it back. 5. Select **Save**. The section shows "Capture settings saved." Tag Manager, Cookiebot, and consent settings change the snippet itself. After you change one, copy the site's snippet again and replace the old one on the site. For what each setting does on the site, see [Install the site tag](/docs/install-the-site-tag). ## Track AI assistant fetches Under **AI assistant tracking**, a site built on Next.js 16 or later gets a file that records each AI assistant fetch in your PostHog project. Copy the file, deploy it, then select **Check AI assistant tracking**. For the steps and what each result means, see [Track AI assistant traffic](/docs/track-ai-assistant-traffic). ## Check a site's health Select **Site audit** next to the site's name to open that site under **Analysis** > **Website**. The badge next to the name shows the site's latest readiness score. For what that page shows, see [Check site readiness](/docs/check-site-readiness) and [Site audit](/docs/site-audit). # Install the site tag > One script tag that runs analytics through Mark's domain and reports when your existing lead form is submitted, so Mark can attribute it. Source: https://docs.use-mark.com/docs/install-the-site-tag The site tag is a single script you paste on your site. It does two things: it starts analytics for your pages through Mark's own domain, and it listens to the lead form you already have, so the traffic source that produced an enquiry is attributed correctly. It does not create the lead. Your form still submits to your CRM exactly as it does today — the tag only watches for the submission and reports it to Mark's analytics as an attribution event. It does not change your form either: your markup, your styling, your validation, and your thank-you page all stay exactly as they are. ## Paste the snippet Copy the snippet from your site's row on the Websites page and put it in the `
` of every page, in the order it is given. To find that row, see [Manage websites](/docs/manage-websites). Mark's own line looks like this: ```html ``` If your site uses Google Tag Manager or Cookiebot and Life With Data has your container id or Cookiebot id, the snippet also carries those blocks: Consent Mode defaults first, then Cookiebot, then the Tag Manager loader, then Mark's tag. Keep that order, and paste the snippet above any other script: Cookiebot needs to load first. Loaded before Tag Manager, Cookiebot hands a returning visitor's saved choice to your tags on the first page they view. The consent defaults are pasted once, here. After that, Cookiebot tells your tags each time a visitor makes a choice. Mark never changes consent itself. If you pasted an earlier snippet with Tag Manager above Cookiebot, move the Cookiebot block up above the Tag Manager block, or copy the snippet again from the Websites page. Fixes to Mark's tag itself reach your site on their own within a few minutes; you only paste again when the snippet's blocks change. The snippet appears only once analytics is set to run through your own domain. Until then the Websites page says what is still needed. This sequencing matters: the tag sends events to that domain, so a snippet pasted earlier would sit on your pages doing nothing. The key identifies your site and is safe in client-side code, the same way any analytics key is. If your site already loads PostHog, remove that snippet when you add this one. Two copies of the analytics library on one page split a single visitor into two people, and the lead you care about ends up attached to whichever copy happened to answer first. ## Tell Mark which form to capture Life With Data configures this for you, but it is worth knowing what they need. There are two ways the tag can hear about a submission. ### A form in your own markup Most sites. Mark needs a **CSS selector** that matches your form element, for example `#enquiry` or `form.contact-form`. The tag attaches one listener and reads the form's named inputs when it is submitted. These input names become their own property on the attribution event: | Input name | Becomes | | ------------------------------------- | -------------------------------------------------------------------- | | `email` | The visitor's email. Required — a submission without one is ignored. | | `name`, or `firstName` and `lastName` | The visitor's name. A split pair is joined into one. | | `phone` | The visitor's phone. | | `message` | The enquiry text. | | `personaId` | The persona, if your form asks. | | anything else with a `name` | An answer, filed under that input's name. | Password inputs and hidden inputs are never read. If your form has a honeypot field, tell Life With Data its name: the tag drops a submission with a filled one instead of reporting it. ### A HubSpot form If your enquiry form is a HubSpot embed, a plain listener cannot see it, so the tag listens for HubSpot's own submission event instead. Life With Data needs to know you use HubSpot, and optionally the **form GUID** if you have more than one HubSpot form and only one of them is your lead form. HubSpot's `email`, `firstname`, `lastname`, `phone`, and `mobilephone` properties map onto the event the same way; every other property on the submission becomes an answer. This works with both HubSpot embed styles. It does **not** work with HubSpot Forms V4, which stopped broadcasting the event the tag listens for — if your embed code mentions V4, tell Life With Data before you install. ### No form yet Leave the capture setting unset. The tag still runs analytics; it simply attaches no form listener and never reports a submission. ## Cookie banners Each site has a **Cookie consent** setting with two choices. **No cookie banner, track every visit** is where every site starts until you give Life With Data a Cookiebot id. The tag starts full analytics on page load and does not wait for a banner to answer. If a banner does ask and the visitor declines, the tag switches to cookieless from then on. **Wait for the cookie banner's answer** is what the site switches to once it has a Cookiebot id. Life With Data can also pick it for a site that runs HubSpot's banner instead. The tag then follows the banner: | Banner | What the tag does | | ----------------------- | ---------------------------------------------------------------------------------------- | | Cookiebot | Waits for statistics consent. Full analytics on accept; cookieless analytics on decline. | | HubSpot's cookie banner | Waits for the analytics category. Full analytics when granted; cookieless when denied. | | Anything else, or none | Starts immediately. | That last row matters. The tag only recognises the banners listed above, so if you use a different consent tool the tag will not see it and will begin capturing straight away. Tell Life With Data which tool you use and support for it can be added. Cookieless means nothing is stored on the visitor's device: no cookie, no local storage. Page views are still counted, keyed by a server-side hash that rolls over daily, so a decline does not make the visit vanish from your numbers. Google's tags follow the same setting. The Consent Mode defaults in the snippet start granted on a site that tracks every visit, and denied on a site that waits. The snippet is pasted once, so if the setting changes, paste the new snippet from the Websites page to bring Google's tags in line. Two details a privacy review usually asks about: * The analytics library is **fetched** before consent is answered, but it is loaded switched off — it sends no events and sets no cookies until consent is granted. That is the analytics vendor's own documented pattern. * If your banner loads more slowly than the tag, a single page view can be recorded before the banner has an answer. Declining still stops everything from that point on, and the recorded view is discarded with the visitor's other data. A visitor who declines still has their submission reported if they go on to submit your form — submitting a form is its own act of consent. The tag keeps the click ids and UTM parameters from the page the visitor landed on in memory and attaches them to the submission, so the source survives even when the banner was declined or an ad blocker dropped the first page view. ## Updates The tag is served from Mark, not copied into your pages, so improvements reach your site on their own within a few minutes. You never need to paste it again. The `v1` in the URL only changes if the tag ever changes in a way that needs your attention, and Life With Data would tell you first. ## Turning it off Delete the script tag from your pages and the integration stops immediately; nothing on Mark's side depends on it still being there. If Life With Data needs to withdraw a change to the tag itself, they revert it and every page picks up the correction within five minutes without you doing anything. ## Checking it works 1. Open a page with the tag on it and look at your browser's network panel. You should see requests to the analytics domain on your own site (the one Life With Data set up as the reverse proxy) and none at all to `posthog.com`. 2. Submit your form with a real email address. 3. The `lead_submitted` event appears in your PostHog project, and your own thank-you page and CRM still work exactly as before — the tag only reports the submission for attribution, it never touches either. A submission your own form rejects — failed validation, or a failed bot challenge — is not reported, so your validation stays the gate on what counts. If the form submits but nothing reaches PostHog, the selector is the usual culprit — check it still matches after any redesign. To post a lead to Mark directly instead of relying on the tag — for a form that has no `submit` event, or a vendor the tag has no adapter for — see the [lead capture contract](/docs/capture-leads). # Set up posting slots > Set the weekly times each channel posts, on the Calendar, and change or remove them later. Source: https://docs.use-mark.com/docs/set-up-posting-slots A posting slot is a weekday and a time when a channel posts, repeating every week. Slots are how you say how often a channel posts: three Instagram slots means three Instagram posts a week. An empty slot shows on the [Calendar](/docs/use-the-calendar) as a gap to fill. Slots live on the Calendar: **Content** > **Calendar**. Times are in your workspace timezone. ## Set up a schedule Select **Posting schedule** at the top right of the Calendar. The panel lists every channel's slots, like "Instagram, 2 a week", with a form to add more: 1. Pick a **Channel**. 2. Pick a **Day**, Monday through Sunday. 3. Set a **Time**. It starts at 09:00. 4. Select **Add slot**. The slot appears in the list and on the Calendar. The form keeps your channel so you can add the next day's slot straight away. To remove a slot, select the **×** on its row. ## Add one slot from a day Hover over a day on the Calendar and select **Add slot** at the bottom of the day. Pick a **Channel** and a **Time**, then select **Add slot**. The slot repeats on that weekday every week. ## Change or remove a slot Select an empty slot on the Calendar. Change its **Day** or **Time** and select **Save**, or select **Remove slot**. A change applies to every week. ## When a slot can't be saved * "Pick a channel, a weekday, and a time." Mark couldn't read one of the three. Check them and try again. * "That channel already has a slot at this weekday and time." The slot exists already. * "You must be signed in to an organization." Your session ended. Sign in, pick your organization, and try again. # Set KPI targets > Save a monthly goal for each metric on the Targets page, change it, or delete it. Source: https://docs.use-mark.com/docs/set-kpi-targets A KPI target is a goal for one metric in one month. Open **Strategy** > **Targets** in the sidebar to set them. Targets are no longer on **Performance**, and no report compares your actual numbers against them. ## Add a target 1. Pick a **Metric**: **Posts per week**, **Impressions**, **Engagement rate**, **Leads**, **Qualified**, **Rejection rate**, or **Cost per lead**. 2. Pick a **Month**. It defaults to the current month in your workspace's time zone. 3. Enter a **Value**: zero or a positive number with up to 4 decimal places. 4. Select **Save target**. The target appears in the table below the form, with columns for **Month**, **Metric**, and **Target**. Until you save one, the page shows "No targets yet." ## Change a target Save the same metric and month again with a new value. It replaces the old one, so there's no separate edit button. ## Delete a target 1. Select **Delete** on the target's row. 2. Confirm with **Delete**. The dialog warns "This cannot be undone." # Create and publish content > Write posts, send them to review, approve them, and see when each one goes out. Source: https://docs.use-mark.com/docs/create-and-publish-content Every post is approved before it publishes, by a person or, on a channel set to **Auto**, by Mark. Then Mark publishes it at its scheduled time. For how the statuses fit together, read [Review and approval](/docs/concepts/review-and-approval). * [Create and submit a post](/docs/create-and-submit-a-post): write a draft for a channel, attach media, set a time, and send it to review. * [Create and assign angles](/docs/create-and-assign-angles): add an angle for a persona and pillar, and pick it on a post. * [Review and approve posts](/docs/review-and-approve-posts): approve, request changes, or reject, one post at a time or several at once. * [Use the calendar](/docs/use-the-calendar): see posts and open posting slots by day or week, and move a post into a slot. * [Manage assets](/docs/manage-assets): upload images and video and find any file in your workspace. # Create and submit a post > Start a draft for a channel, write the body, attach media, set a time, and send it to review. Source: https://docs.use-mark.com/docs/create-and-submit-a-post Write a post in the post editor, then submit it for review. For what each status means, see [Review and approval](/docs/concepts/review-and-approval). Open your posts from the sidebar: **Content** > **Posts**. Tabs split them by where each one is: * **Needs review**: submitted and waiting for a decision. See [Review and approve posts](/docs/review-and-approve-posts). * **Drafts**: drafts, and posts sent back with changes requested. * **Scheduled**: approved and scheduled posts, soonest first. * **Published**: posts that went out, newest first. * **All**: every post, newest change first. Each row shows the **Post** (its first line, or "Untitled post" if the body is empty), the **Channel**, the **Status**, and when it **Goes out**. On a phone, the channel shows as its logo and the time is hidden. Filter any tab by **Channel** and scheduled date. If there are no posts yet, **All** says "No posts yet. Start one with New post." ## Start a draft 1. Select **New post**. 2. Pick a **Channel**. 3. Select **Create draft**. The post opens in the editor. To switch channels later, change **Channel** in the editor. Fields that the new channel doesn't use are cleared. ## Write the post The editor shows the post's status at the top, next to **Channel**. * **Body**: write the post. The counter shows its length against the channel's limit, like 180 / 2200 on Instagram. Over the limit, the counter turns red and the editor says "The body is over the 2200 character limit for instagram." **Save draft** and **Submit for review** can't be selected until you shorten it. See [Social post text](#social-post-text) for how the body is sent and counted. * **Angle**: pick an angle for the post, or leave it on **No angle**. Angles come from **Strategy** > **Angles**. For setting them up, see **Create and assign angles**. * **Scheduled time**: pick the date and time the post should go out, in your timezone. Leave it empty if you don't know yet. * **Media**: select **Attach media**. In the dialog, drag files in to upload them, or select files this workspace already uploaded. Select **Done**. To take a file off the post, select the remove button (**×**) in the corner of its thumbnail. If uploading isn't available in your workspace, the dialog says so. Files that are already uploaded are still there to pick. * **Details**: fields for the channel you picked, so they change when the channel does. Fields marked with **\*** are required. A field that reads "One value per line", like Instagram's **Collaborator usernames**, takes each value on its own line. The preview beside the editor updates as you type. See [Preview the post](#preview-the-post). ## Social post text Instagram, X, Facebook, LinkedIn, TikTok, Pinterest, and YouTube bodies are plain text. Mark sends them exactly as you type them. These platforms don't format Markdown, so `**bold**` or `[text](link)` would show up as those characters. Use line breaks for structure and paste links as the full URL. Blog posts, FAQs, and competitor pages are different. Their body is a formatted editor, and the website renders the formatting. ### X counting and threads X counts characters its own way, and the counter follows it: * Every link counts as 23 characters, however long it is. * An emoji or a Chinese, Japanese, or Korean character counts as 2. To post a thread, write the first post in **Body**, then write each reply in **Replies** under **Details**. Each reply has its own box and keeps its line breaks. Select **Add to replies** for another box, or **Remove** beside one to drop it. Each reply is counted on its own against X's 280 limit. Empty replies are dropped when you save. ### TikTok videos TikTok publishes videos only to everyone. For a post with a video, set **Who can view** to **Everyone**. Any other choice stops the save with "TikTok only publishes videos to Everyone." The other choices work for photo posts. ## Preview the post The preview shows the post the way the channel you picked shows it, with its media laid out for that channel, and several Instagram images or videos as a carousel. It counts characters the same way as the counter. On X, it shows the first post, then each reply with its own count. * On X, a post with no media shows a link card for its last link. * On Facebook, a post with no media shows a link card for its first link. * Required **Details** fields that are still empty are listed under the preview, like "Who can view is required." A preview shows what Mark will send. It doesn't guarantee the platform accepts the post. ## Save or submit * Select **Save draft** to keep your work. **Saved** appears next to the buttons. The post stays a draft and stays editable. * Select **Submit for review** when it's ready. Mark saves the post first, then sends it to review. The status changes to in review. If the channel's **Approval policy** is **Auto**, Mark can approve it right away instead. See [Connect social accounts](/docs/connect-social-accounts). If something needs fixing, the editor says so above the buttons. "Some fields need attention." means a **Details** field has a problem. The message shows under that field. Once you submit, the post is locked. Trying to save it shows "This post is locked for review. It can be edited again after a reviewer requests changes." To see what happens next, read [Review and approve posts](/docs/review-and-approve-posts). ## Edit a post later Select a post in the **Posts** list to open it in the editor. Drafts and posts with changes requested stay editable. Other posts are locked. After a reviewer requests changes, fix the post and select **Submit for review** again. # Create and assign angles > Add an angle for a persona and pillar, keep it active or retire it, and pick it on a draft post. Source: https://docs.use-mark.com/docs/create-and-assign-angles An angle is the bet a post makes, tied to one persona and one pillar. Open **Strategy** > **Angles** in the sidebar to manage them. ## Before you start Every angle needs a persona and a pillar. Set those up first under **Strategy** > **Personas** and **Strategy** > **Pillars**. The angle form only offers the ones that already exist. ## Create an angle 1. Select **Add angle**. 2. Enter a **Name**. The **Slug** fills in from the name. Edit the slug if you want a different one. After that, changing the name no longer changes it. 3. Pick a **Persona** and a **Pillar**. 4. Leave **Active** checked to offer the angle on posts right away, or clear it to save the angle without offering it yet. 5. Select **Save angle**. The page shows "Angle saved." Each angle in the list shows its slug, persona, and pillar. ## Edit an angle 1. Select **Edit** on the angle's row. 2. Change the **Name**, **Persona**, **Pillar**, or **Active** setting. 3. Select **Save angle**. You can't change the slug. The form explains why: "Set when the angle was created. Changing it later would split this angle across two values, so it cannot be edited." To use a different slug, create a new angle. ## Deactivate or reactivate an angle Select **Deactivate** on the angle's row. An inactive angle drops out of the **Angle** list in the post editor, so other posts can't pick it. A post that already uses the angle keeps it. Select **Reactivate** to offer the angle on posts again. ## Delete an angle 1. Select **Delete** on the angle's row, or at the bottom of the **Edit angle** panel. 2. Confirm with **Delete**. The dialog warns "This cannot be undone. If posts still use it, you can deactivate it instead." If posts still use the angle, the delete fails with "Can't delete this angle because posts still use it. Deactivate it instead." When the delete succeeds, the page shows "Angle deleted." ## Assign an angle to a post A post's angle can change while the post is a draft or after a reviewer requests changes. 1. Open the post from **Posts**. 2. In the **Angle** field, pick an angle, or **No angle** to clear it. The list shows active angles, plus the post's current angle if it has since been deactivated. 3. Select **Save draft** to keep working, or **Submit for review** to send the post to a reviewer. For what happens after you submit, see [Review and approval](/docs/concepts/review-and-approval). # Review and approve posts > Find the posts waiting for review, approve several at once, or open one post, check what will go out, and approve, request changes, or reject it. Source: https://docs.use-mark.com/docs/review-and-approve-posts Posts waiting for review are on the **Needs review** tab of **Posts**. Approve several at once from there, or open a post's review page to check it and decide on it alone. For what each status means, see [Review and approval](/docs/concepts/review-and-approval). Open it from the sidebar: **Content** > **Review**. A pulsing red dot next to **Review** means posts are waiting. When the **Content** section is closed, the dot shows on **Content** instead. The **Needs review** tab shows how many are waiting, and **Posts** opens on it whenever any are. If nothing is waiting, it says "Nothing is waiting for review." ## Filter the list 1. Pick a **Channel**, or leave it on **All channels**. 2. Set **Scheduled from** and **Scheduled through** to limit the list to a date range. Set one, both, or neither. 3. Select **Apply**. On a phone, select **Filters** first to show them. Select **Clear** to remove the filters. The list shows up to 100 posts at a time. If there are more, it says so. Narrow the filters to see the rest. Each row shows the channel, when it's scheduled, and the start of the post. Posts with no time yet show **Not scheduled**. A **Claim flagged** badge means the post has an open claim flag. ## Approve posts in bulk 1. Select the box on each post you want to approve. To pick every post in the current list, select the box at the top. 2. Select **Approve selected**. It stays off until you pick a post, and reads **Approving…** while it works. 3. Read the summary, like "3 approved, 1 skipped." Under it, each post shows whether it was approved or skipped, and why. Approved posts leave the list, and the count and the sidebar dot update. Mark skips a post instead of approving it when: * It has open claim flags. The reason lists them. Resolve them first. * Someone already decided on it. * It changed after you opened the list. Reload and check it again. * It's no longer waiting for review. * It couldn't be approved for another reason. Try it from its review page. ## Open a post's review page Select a post on the **Needs review** tab to open its review page. On the **Calendar**, posts that aren't drafts or waiting on changes also open here. See [Use the calendar](/docs/use-the-calendar). The top of the page shows the channel, the status, and the revision number, like **rev 3**. If there's nothing to decide on, the page says **Not in review** instead. The line under it says why, usually one of these: * "This instagram post has no frozen revision yet, so there is nothing to approve. It enters review when it is submitted." The post was written in Mark but hasn't been submitted yet. * "This instagram post was created outside Mark, so it does not go through review here." It's an external post, brought in from the channel. External posts never enter review, whether they're scheduled, published, or failed, so there's nothing to approve, request changes on, or reject. If the post is live on the channel, **View live post** shows under the message. ## Check the post Before you decide, check each part of the page. **Media**, **What we will send**, **History**, and **Comments** start collapsed. Open them to see what's inside. * **Preview** shows the post the way its channel shows it, with the same media layout and link card you saw in the editor. For an X thread, each reply follows the first post. For channels with a length limit, a line under it counts the caption the way that channel does, like "Caption 180 of 2200 characters for instagram." On X, links count as 23 and emoji as 2. See [Social post text](/docs/create-and-submit-a-post#social-post-text). * **Delivery** shows the time in the workspace timezone (**Scheduled (tenant)**) and in yours (**Scheduled (yours)**), plus the **Account** it posts from. If no account is set up for the channel, it reads "No account configured". Channel fields like **First comment** are listed here too. * **Claims (N open)** lists open claim flags. "No open claim flags on this post." means there are none. * **Media (N)** lists each image or video with its dimensions. If the shape doesn't fit the channel, you'll see "Ratio mismatch." or "Possible ratio mismatch." This is a warning only. It doesn't block approval. * **What we will send**, when it's there, shows the exact content Mark sends to the channel. ## Decide The **Decision** box sits beside the post, or at the bottom of the screen on a phone. * If the post has open claim flags, **Approve** is turned off and the box says "Approve is blocked by N open claim flag(s)", followed by the flags. Resolve the flags first. Otherwise, select **Approve**. * To send the post back, select **Request changes**. Fill in **What needs to change?**, then select **Submit**. * To turn the post down, select **Reject**. Fill in **Why is this rejected?**, then select **Submit**. The note is required for **Request changes** and **Reject**. Select **Cancel** to go back without deciding. Once your decision is saved, the box says "Decision recorded." ## Comment and read the history To leave a comment, open **Comments (N)**. Type in **Write a comment**, then select **Post comment**. Each comment shows who wrote it, the revision, and when. Open **History (N revisions)** to see each revision, who edited it, and when. Older revisions read "Differs from rev N in:" followed by the fields that changed. If the body changed, you'll also see the lines that changed since the previous revision. Under **Decisions**, each past decision is listed with who made it, when, and their note. ## Edit or reschedule The top of the review page has two more actions. Saving an edit or a new time sends the post back to review, so someone has to approve it again. * **Edit** opens the post in the editor. * **Reschedule** asks for a **New time (your timezone)**. Pick the date and time, then select **Reschedule and reopen review**. ## View the live post Once a post is published, the review page shows **View live post**. It opens the post on the channel in a new tab. # Use the calendar > Read your posts and posting slots by day, three days, or week, and move a post into an open slot. Source: https://docs.use-mark.com/docs/use-the-calendar The **Calendar** shows your posts and your posting slots day by day. Open it from the sidebar: **Content** > **Calendar**. Times are in your workspace timezone, shown next to the channel list. ## Change what you see Pick **Day**, **3 days**, or **Week** at the top right. If you haven't picked one, the calendar chooses by the space it has: a week on a wide screen, three days on a narrow one, and one day on a phone. Your pick is remembered on this browser. Select the arrows to go back or forward by the length of the view, and **Today** to come back. Keyboard shortcuts work anywhere on the page, except while you're typing in a field: | Key | Does | | ----------------------------------------- | -------------- | | **1** or **D** | Day view | | **3** | 3-day view | | **7** or **W** | Week view | | **T** | Today | | **←** / **→**, or **K** / **J** | Back / forward | ## Read a day Each day lists its posts and empty slots in time order. A post card shows its channel, time, status, the first line of the post, and a thumbnail when it has an image. Select a card to open the post. A dashed card is a post published outside Mark, marked with where it came from. An empty posting slot shows its channel and time, with one of three labels: * **Gap**: the slot is in the next 7 days and has no post yet. * **Open**: the slot is more than 7 days away. * **Missed**: the slot's time passed with nothing in it. Above the days, each channel shows how many of its slots are filled this week, like **Instagram 2/3**. A slot counts as filled once its post is approved, scheduled, or published. A draft or a post in review sits on the slot but doesn't fill it yet. A channel with no slots shows its post count instead. Select a channel to hide it from the calendar, and again to show it. To add, change, or remove slots, see [Set up posting slots](/docs/set-up-posting-slots). ## Move a post A post can move to an empty future slot on its own channel. Published posts, external posts, and posts with changes requested can't move. To drag a post, grab its card and drop it on a slot that reads **Drop here**. Only the slots that can take it light up. To move a post without dragging: 1. Open the **…** menu on the post card. 2. Under **Move to slot**, choose a slot. The list has only the slots in view that can take the post. The calendar refreshes with the post in its new slot. ## What moving does to review If the post is a draft, it only gets the new time. Nothing else changes. Any other post goes back to review with the new time. That includes posts that were already approved or scheduled, so someone has to approve it again before it can publish. For how review works, see [Review and approval](/docs/concepts/review-and-approval). ## When a move is refused If Mark can't make the move, the calendar shows why under the days: * "Choose a slot on the same channel." A post can only move within its own channel. * "Choose an empty future slot." The slot's time has passed. * "That posting slot is already occupied." Another post took the slot first. Pick a different one. * "Published posts are read-only." The post already went out. * "External posts are read-only." The post was published outside Mark. * "This post changed. Refresh the calendar and try again." Someone else changed the post while you were moving it. Refresh the page and move it again. * "That post or posting slot is no longer available." The post or the slot was deleted. Refresh the page. * "Mark couldn't move that post. Try again." Something went wrong on our side, and we've been told. # Manage assets > Upload images and video, find any file in your workspace, and rename or delete the ones you uploaded. Source: https://docs.use-mark.com/docs/manage-assets **Assets** lists every file in your workspace: your uploads, URL imports, and files synced from Google Drive. Open it from the sidebar under **Library** > **Assets**. The newest files are at the top, unless you're searching. ## Upload files 1. Open **Library** > **Assets**. 2. Drag images or video onto the box that says **Drop images or video here, or click to choose files**. Or select the box to pick files from your computer. On a phone there's nothing to drag, so the page shows a **Choose files to upload** button instead. Tap it to pick photos or videos from your phone. Upload several files at once, up to 400 MB each. Each file shows a progress bar while it uploads, and it appears at the top of the table when it's done. The box takes images and video only. Other file types are skipped. ## Read the table Each row is one asset: * A small preview. Images show a thumbnail. Video, audio, and documents show an icon for their kind. If an image preview can't load, the tile shows a crossed-out image icon instead of staying blank. * **Name**: select it to open the asset's details. * **Source**: **Google Drive**, **Upload**, or **URL import**. * **Drive path**: the folder path in Google Drive, for synced files. * **Added**: the date the asset came into Mark. ## Search, filter, and page through assets A search box and two sets of filters sit above the table. Use them together to narrow the list: * Search: the **Search assets** box, which shows **Search by name or folder**. * Source: **All**, **Google Drive**, **Upload**, or **URL import**. * Kind: **All**, **Images**, **Video**, **Audio**, or **Documents**. When there are more assets than fit on one page, select **Older** to go further back and **Newer** to come forward again. Paging keeps your filters. Changing a filter takes you back to the first page. ### Search by name or folder 1. Type part of the asset's name, or the name of any Google Drive folder it sits in, in the search box. 2. Press Enter. The search matches a file's name or its Google Drive folders, never what's inside the file. It finds names that start with what you typed, names and folders that contain it, and close spellings too. Your Source and Kind filters still apply, and changing a filter keeps your search. The search term goes in the page address as `q`, so you can bookmark or share a search. While a search is active, the table lists the best matches first instead of the newest, and **Older** and **Newer** don't show. There are no pages, only the top matches. If there are 50 or more, the page shows the first 50 and asks you to type more of the name. ### When nothing matches If a search finds nothing, the page says **No assets match "…".** with your search term in the quotes. Select **Clear search** to drop the term and keep your filters, or **Clear filters** to see everything again. If you haven't searched and no assets match your filters, the page says **No assets match these filters.** Select **Clear filters** to reset them. That's different from an empty library, which says **No assets yet** and points you to **Connections** if you want to sync files from Google Drive. ## See an asset's details Select an asset's name in the table. The detail page shows a preview and the facts Mark stores about the file. A field only appears when it applies, so an upload has no Drive path and a document has no dimensions. * **Kind**: image, video, audio, or document. * **MIME type**: the file's format, for example image/png. * **Dimensions**: width and height in pixels, for images and video. * **Duration**: for video and audio. * **Size** * **Source** * **Source URL**: where Mark got the file, for URL imports and files synced from Google Drive. * **Drive path** and **Drive modified**: for files synced from Google Drive. * **Added** Video and audio play in the preview. Nothing plays until you select play. If your browser can't play a file, such as an iPhone video in a format it doesn't support, the preview says "This file can't play here. Use Open file." Select **Open file** to play or download the file in a new tab. Some files, such as video, audio, and large files, open through a link that only works for a short time. If you copy that link and open it later, it can stop working. Go back to the asset and select **Open file** again for a fresh one. Below the details, **Used in** lists where the asset is used. If it is your brand logo, **Brand logo** comes first and opens your brand settings. Then come the posts that attach it, newest edit first, each with its channel, status, and the start of its text. A post in draft or changes requested opens in the editor. Any other post opens its review page. Posts in every status count, including scheduled and published ones. A post that attached the asset in an earlier version but no longer does is not listed. Mark shows 20 posts and counts the rest. If nothing uses the asset, it says "No posts use this asset." This is the same check Mark runs before it lets you delete an asset. ## Rename an asset 1. In the table, open the actions menu at the end of the asset's row. 2. Select **Rename**. 3. In **Rename asset**, type the new name and select **Save**. Renaming changes the name in Mark only. The file itself doesn't change. If you clear the name and save, the dialog asks you to **Enter a name.** ## Delete assets To delete one asset: 1. Open the actions menu at the end of the asset's row. 2. Select **Delete**. 3. Confirm with **Delete**. The file is gone from Mark for good. To delete several at once, select the checkbox on each row you want, or the checkbox in the header to select every asset on the page. A bar shows how many are selected. Select **Delete** in that bar, then confirm. Mark won't delete an asset that's still in use: * If the asset is the brand logo or is attached to posts, the dialog says it's in use and nothing is deleted. It lists the brand logo and up to three posts that use it, with each post's channel and status, and a count of any more. * When you delete one asset and only posts in draft or changes requested use it, the dialog offers a button with the post count, such as **Remove from 2 posts and delete** or **Remove from 1 post and delete**. Select it to take the asset off those posts and delete it in one step. * If it's the brand logo, or a post in any other status uses it, that button doesn't show. Other statuses include in review, approved, scheduled, and published. Select the brand logo or each listed post to open it, remove the asset there, then try again. * If anything using the asset changed after you opened the dialog, it says **Something changed since you opened this. Nothing was removed or deleted.** Try again. * In a bulk delete, assets in use and files synced from Google Drive are skipped, and the rest are deleted. The dialog then shows how many were deleted and why each skipped asset stayed. ## Files synced from Google Drive Mark can't rename or delete a synced file. Its actions menu says **Synced from Google Drive. Rename or remove it in Drive.** Make the change in Google Drive instead. # Grow search and AI visibility > Find the keywords worth writing for, track where you rank, and fix what stops search engines and AI assistants from reading your site. Source: https://docs.use-mark.com/docs/grow-search-and-ai-visibility These pages cover Google search and the AI assistants that answer your buyers' questions, such as ChatGPT and Perplexity. * [Research and save keywords](/docs/research-and-save-keywords): get keyword ideas from a few seed terms and save the ones you want. * [Check your keyword rankings](/docs/track-keyword-rankings): see where each tracked keyword ranks and how it moved. * [Research a competitor's domain and your backlinks](/docs/research-competitors): see what a competitor ranks for and who links to you. * [Check site readiness](/docs/check-site-readiness): see what stops AI answer engines from reading a website. * [Site audit](/docs/site-audit): crawl a site, read its health score, and work through its issues. * [Inspect a URL](/docs/inspect-a-url): check whether Google indexed one page. * [Track AI assistant traffic](/docs/track-ai-assistant-traffic): see which AI assistants fetch your pages. * [Verify your site in Bing and use IndexNow](/docs/verify-in-bing-webmaster): add your site to Bing and tell it about changed pages. # Research and save keywords > Get keyword ideas from a few seed terms, save the ones you want, check who ranks for them, then filter, tag, remove, and track them for rank checks, and add buyer questions from People Also Ask. Source: https://docs.use-mark.com/docs/research-and-save-keywords **Keywords** is where you find search terms worth writing for and keep a list of them. Select **Analysis** > **Research** in the sidebar. **Research** has four tabs: **Keywords**, **Competitors**, **Buyer questions**, and **Rankings**. **Keywords** is the first tab. It has two views: **Research** gets new keyword ideas, and **Saved** is your list. For **Buyer questions**, see [Add buyer questions from People Also Ask](#add-buyer-questions-from-people-also-ask). Each run of keyword research is a paid lookup, and so is each audience check. Nothing is requested until you select **Run keyword research** or **Check Google top 10**. Opening either view, saving, tagging, removing, and tracking are free. ## Research keyword ideas 1. Select the **Research** view. 2. Enter one to five seed terms in **Seed terms (1–5, one per line)**. The line under the box counts them. You'll see "Enter at least one seed term." until you add one. 3. Choose a **Location** and a **Language**. They start at United States and English. 4. Choose a **Result count**: 10, 25, 50, or 100 ideas. 5. Optionally select **Include SERP overview (may increase provider cost)**. It adds a summary of each keyword's Google results, and it costs more. 6. Select **Run keyword research**. The button reads **Running keyword research…** until the results arrive. A line under the button says how many ideas came back and what the lookup cost. If it says "No keyword ideas were returned for these seed terms and settings.", try broader seed terms or another location. ## Read the results Each idea has one row: * **Keyword** is the search term. * **Volume** is how many people search for it each month. * **CPC** is the average cost per click for ads on it. * **Competition** is how crowded the ads are for it, as a percentage. * **Difficulty** is how hard it is to rank for it. Higher is harder. * **Intent** is what the searcher is likely after, like informational or commercial. * **SERP** shows **Available** when the SERP overview came back for that keyword. A dash means no figure came back for that keyword. ## Save keywords 1. Select the box next to each keyword you want, or the box above the table to select all. 2. Select **Save selected**. A line confirms how many were newly saved, and how many were already saved if any. Keywords save with the location and language of the run. Find them under **Saved**. ## Find saved keywords Select **Saved**. The newest saved keywords are at the top. Until you save one, it says "No keywords saved yet. Research keywords and save them here." To narrow the list: * To search, type part of the keyword in the search box and press Enter. Your filters stay applied. * To filter, fill in any of these, then select **Apply filters**. Your search stays applied. * **Tags**: one or more tag names, separated by commas. * **Source**: **All sources**, **Research**, **Domain**, **Agent**, or **Search Console**. **Domain** means you saved it from a domain lookup on the **Competitors** tab. A keyword keeps the source it was first saved from. * **Audience verdict**: **All verdicts**, **Unchecked**, **Keep**, or **Kill**. See [Check who a keyword's searchers are](#check-who-a-keywords-searchers-are). Select **Clear** to reset the search and every filter. If nothing matches, you'll see "No saved keywords match these filters." Sort by **Keyword**, **Volume**, or **Saved** by selecting the column heading. Select it again to reverse the order. Keywords without a volume sort last either way. Use **Previous** and **Next** under the table to move between pages. ## Check who a keyword's searchers are A keyword can match your product word for word and still be searched by the wrong people. Search volume doesn't tell you who they are, and volume tools can disagree by about four times on the same query. In Mark, volume only orders your list. It never decides that a page should exist. The audience check shows you who Google ranks for the keyword today, so you can judge whether that crowd is your buyer. 1. On the keyword's row, select **Check** in the **Audience** column. It says **Review** once the keyword has been checked. 2. Select **Check Google top 10**. It is one DataForSEO call, about $0.004. The keyword's own location and language are used. 3. Read the results. Each of the top 10 organic results shows its position, title, domain, and a rough page type: **Article**, **Product or service**, **Directory or listing**, **Forum**, **Video**, or **Government or edu**. **SERP features** lists which of People Also Ask, AI Overview, Local pack, Video, and Shopping appeared. 4. Decide. Select **Keep** or **Kill**. **Kill** needs a reason of up to 200 characters, like "Ranking pages are DIY forums, not homeowners hiring." The reason is optional for **Keep**. The **Audience** column shows **Unchecked**, **Keep**, or **Kill** for each keyword. Mark never sets a verdict for you. Volume, difficulty, and every other metric leave it alone. Select **Re-check** to fetch the results again. The new results replace the old ones, and your verdict stays. If DataForSEO fails, you'll see a message, nothing is saved, and you can try again. ## Tag saved keywords 1. Select the keywords. 2. Enter a **Tag name**. 3. Select **Add to selected** or **Remove from selected**. To remove one tag from one keyword, select the **×** on the tag in the **Tags** column. ## Remove saved keywords 1. Select the keywords. 2. Select **Remove selected**. 3. Confirm with **Remove**, or select **Cancel**. Removing deletes the keywords, their tags, and any rank history from your saved list. It does not undo. ## Track keywords for rank checks Tracked keywords get Mark's own Google rank checks for one of your sites. The results show on the **Rankings** tab and on **Performance** > **Search**. See [Read performance](/docs/read-performance). 1. If you have more than one site, pick the rank tracking site from the row of site buttons at the top of **Saved**. 2. Select the keywords. 3. Select **Track selected** or **Untrack selected**. To track or untrack one keyword, select **Track** or **Untrack** on its row. The **Rank tracking** column shows **Tracked** or **Not tracked** for the site you picked. Tracking is free. To run rank checks, see [Check your keyword rankings](/docs/track-keyword-rankings). ## Add buyer questions from People Also Ask **Buyer questions** is the list of questions your buyers ask AI tools. When AI answer checks are on, Mark asks each active question every week on ChatGPT, Gemini, Google AI Overview, and AI Mode. Select the **Buyer questions** tab to see the list. To leave a question out of the next check, select **Deactivate** on its row. **Reactivate** brings it back. To add your own question, type it in **Question** and select **Add question**. Once you track keywords and a rank check has run, the tab also shows **Suggested from People Also Ask** when there are any. These are the questions Google showed in People Also Ask for your tracked keywords on the latest rank check for each site and locale. Mark saves them during the check at no extra cost, so viewing suggestions never starts a paid lookup. See [Check your keyword rankings](/docs/track-keyword-rankings). A suggestion is not a buyer question. Mark never asks it in an AI answer check and never adds it for you. 1. Read the question. **Seen for** shows the tracked keyword whose results showed it, plus a count like **+2** if more keywords showed it too. 2. Decide if a buyer would ask it in those words. Once added, a question can't be edited, only deactivated. 3. If the wording is close but not right, type your own version in **Question** and select **Add question**. Otherwise, select **Add** to put the suggestion on your list as written. It starts active. Suggestions leave out any question already on your list, active or not. The questions Google showed most often come first. Mark shows up to 50. When there are more, a line under the table gives the total, like "Showing 50 of 64." # Check your keyword rankings > See where each tracked keyword ranks in Google for your site, run a check, set a weekly schedule, and read a keyword's position history. Source: https://docs.use-mark.com/docs/track-keyword-rankings **Rankings** shows where each tracked keyword ranks in Google for one of your sites. Select **Analysis** > **Research** in the sidebar, then the **Rankings** tab. Opening the tab is free. It shows positions from checks that already ran. Only two things spend money: **Run now** and a **Weekly** schedule. ## Before you start Rankings only checks keywords you track. Track them first from **Research** > **Keywords** > **Saved**. Tracking is free. Until you track a keyword, the tab says no keywords are tracked yet for your site and links to Saved keywords. ## Pick a site and locale If you have more than one site, choose it in the site picker at the top. If a site is tracked in more than one locale, pick the locale from the row of buttons under it. The box above the table shows the **Site**, **Locale**, **Last checked**, and **Next check** for what you picked. ## Check positions now 1. Select **Run now**. You'll see "Check started." If a check is already running, you'll see "A check is already running. Showing its progress." 2. Watch the progress line under the button, like "Checking 12 keywords: 5 done, 1 failed." The page refreshes on its own until the check ends. 3. Read the result line when it finishes: * "Last check finished for all 12 keywords." Every keyword got a new result. * "Last check finished with 2 of 12 keywords failed." The failed keywords show **Check failed** in the table. Run the check again to retry them. * "Last check failed. No new positions were recorded." Every keyword shows **Check failed**. Earlier positions stay in each keyword's history. Run the check again later. Each check also saves the **People Also Ask** questions Google showed for your tracked keywords, at no extra cost. They appear as suggestions on **Research** > **Buyer questions**. Nothing joins your buyer questions until you select **Add** on a suggestion. See [Add buyer questions from People Also Ask](/docs/research-and-save-keywords#add-buyer-questions-from-people-also-ask). ## Set a schedule 1. Under **Schedule**, choose one: * **Manual: only when you click Run now** * **Weekly: runs a paid check once a week** 2. Select **Save schedule**. With **Weekly**, **Next check** shows the date and time of the next check. With **Manual**, it says **Manual**. Saving a schedule doesn't start a check. ## Read the table Each tracked keyword has one row: * **Position** is where your site ranked in Google on the last check, like **#4**. * **Change** compares the last two checks: **Up 3**, **Down 2**, or **No change**. It shows a dash unless both checks found your site. * **Ranking URL** is the page on your site that ranked. * **Last checked** is the date and time of the keyword's latest check. **Position** can also show one of these: * **Not checked yet**: this keyword has never been checked. * **Not in top 100**: the check ran, and your site wasn't in the first 100 Google results. * **Check failed**: the latest check couldn't get a result for this keyword. Sort by **Keyword** or **Position** by selecting the column heading. ## See a keyword's history Select a keyword's name to open its history under the table. Once the keyword has ranked in at least two checks, a chart shows its position over time, with #1 at the top. The **Checked** list shows every check with its position and ranking URL. Select **Close** to hide it. # Research a competitor's domain and your backlinks > Look up what a competitor's domain ranks for, save its keywords, drill into its top pages, and see who links to your own site. Source: https://docs.use-mark.com/docs/research-competitors **Competitors** shows what any domain ranks for in Google, and who links to your own site. Select **Analysis** > **Research** in the sidebar, then the **Competitors** tab. The domain lookup is at the top. **Backlinks** is below it. Opening the tab is free. It shows results you already fetched. These buttons fetch new data, and each press is a paid lookup: * **Look up** * **Look up top pages** * **Keywords** on a row of **Top pages** * **Refresh backlinks** Opening an entry in **Recent lookups** is free. ## Look up a domain 1. Enter a domain like `example.com` in **Domain**, or paste a URL. The line under the box shows the domain Mark will look up. 2. Keep or change **Location** and **Language**. The form starts from the lookup on screen. With no earlier lookup, it starts at United States and English. 3. Select **Look up**. **Rank by** sorts the keywords by **Traffic**, **Search volume**, or **Position**. **Keyword contains** is optional. It keeps only keywords with that word in them. If you change a field after a lookup, you'll see "Settings changed — look up again to apply." The results on screen stay as they were until you select **Look up** again. ## Read the results The line above the results shows when the data was fetched. The data updates weekly. Three cards sit at the top: * **Estimated organic traffic**: estimated visits per month from Google. * **Organic keywords**: how many keywords the domain ranks for, with counts of new, lost, up, and down. * **Position spread**: a bar chart of ranked keywords by Google position, so it shows how many rank near the top and how many sit further down. Below the cards, the table lists up to 100 ranked keywords: * **Position** is where the domain ranks in Google for the keyword. * **Volume** is how many people search for the keyword each month. * **Difficulty** is "How hard it is to reach the top 10 for this keyword, from 0 to 100. Under 30 is easy, 70 and up is hard." Point at the score to see **Easy**, **Medium**, or **Hard**. * **Traffic** is "Estimated monthly visits this ranking brings the domain, from search volume and the click rate at its position." * **URL** is the domain's page that ranks. To narrow the table, select **Show in table** on a **Top pages** row to see one page's keywords, or type part of a URL, like `/blog`, in **Filter by URL**. Both filter the keywords already shown, so they are free and make no new lookup. Each has its own **Clear**, and selecting **Look up** again resets both. ## Save keywords Rows already saved for the shown location and language show a **Saved** badge. 1. Select the box next to each keyword you want, or the box above the table to select all. 2. Select **Save selected**. The keywords save to the location and language shown next to the button. A line confirms how many were newly saved and how many were already saved. Find them under **Research** > **Keywords** > **Saved**, where new ones show **Domain** as their source. ## Look up top pages 1. Optionally enter part of a URL in **URL contains**, like `/blog`, to see only matching pages. 2. Select **Look up top pages**. It uses the same domain, location, and language as the form. **Top pages** lists the domain's pages by estimated traffic per month, with how many keywords each page ranks for. To see one page's keywords, select **Keywords** on its row. A panel opens with that page's ranked keywords, by traffic. Rows already saved for that location and language show **Saved**. ## Reopen an earlier lookup **Recent lookups** lists your workspace's 25 most recent domain lookups, with each one's location, language, **Rank by**, **Contains**, and date. Select one to show its stored results. **Showing** marks the one on screen. ## Check your backlinks **Backlinks** shows who links to your own site. If you haven't added a site yet, it says "No website yet." Add one under **Settings** > **Websites** first. See [Manage websites](/docs/manage-websites). 1. If you have more than one site, pick it from the row of site buttons. 2. Select **Refresh backlinks**. Until the first refresh, the line next to the button says there's no backlink snapshot yet for your site. When the refresh finishes, you'll see "Updated just now." The line next to the button shows when the snapshot was captured. ## Read your backlinks **Overview** shows the totals for your site: **Backlinks**, **Referring domains**, **Referring pages**, **Rank**, **Broken backlinks**, **Broken pages**, and **Spam score**. Two charts sit next to it: * **Backlink growth** plots backlinks and referring domains at each refresh. It needs at least two refreshes to draw a line. * **Links first seen** counts the links in this snapshot by the month they were first picked up. Under the charts, two tabs split the links: * **Backlinks** lists each link: **Source**, **Target**, **Anchor**, **Flags**, **Link rank**, **Domain rank**, **Spam**, and **First seen**. **Flags** shows **Nofollow** when the link is nofollow. **Spam** is the link's spam score. * **Top pages** lists the pages on your site that get the most links, with **Referring domains** and **Best domain rank** for each. # Check site readiness > See what stops AI answer engines from reading one of your websites, and scan it again after you fix something. Source: https://docs.use-mark.com/docs/check-site-readiness The **Site readiness** card lists the agent-parseability issues on one website: the things that make it harder for AI answer engines to read and use the site. The card names the site's domain, which opens the site in a new tab, and shows **Scanned** with the date of the last scan. ## Find the card * **Home** shows the card for your primary website only, the one with the **Primary** badge in **Settings** > **Websites**. Select **See more** on the card to open that site's page. * **Analysis** > **Website** opens your primary site's page. Select the site's name at the top to switch to another site. There the same issues sit inside the [site audit](/docs/site-audit) report, under the **AI readiness** category, scored with the rest of the audit. If you haven't added a website yet, **Home** shows "No website yet. Add one to see how ready it is for AI answer engines." Select **Add one** to go to **Websites**. ## Run the first scan A site with no report yet shows "No site readiness report yet for", then the site's domain. Select **Run scan** to check it. ## Read the issues If the scan finds issues, the card shows a summary such as "3 issues found", with a count for each tier that has issues: * **essential**: an agent can't work around it. Fix these first. * **recommended**: lower stakes than essential. * **bonus**: lowest stakes. Select the summary to show or hide the list. It starts hidden. Each issue in the list shows its name, its tier as a badge, what the scan found, and what to change. Essential issues come first. If the scan finds nothing, the card says "No agent-parseability issues found." ## Scan again After you change the site, check it again: 1. Go to **Home**. 2. Select **Scan again**. The button reads **Scanning…** while it works. On a site's page, select **Check now** on the **AI readiness** tile of the site audit report instead. When it finishes, the card says "Updated just now." and shows the new results. If the scan can't run, the card says "Could not check right now. Try again in a few minutes." and keeps the last results on screen. # Site audit > Run an audit of a website or schedule one weekly, read its health score by category and its action plan, and work through its issues by check or by page. Source: https://docs.use-mark.com/docs/site-audit A site audit crawls up to 50 pages of one website with JavaScript turned on, the way a browser sees them, and scores what it finds together with the site's latest AI readiness scan. Select **Analysis** > **Website** in the sidebar to find the **Site audit** report. ## Run an audit 1. Select **Analysis** > **Website**. It opens your primary site. If you have more than one site, select the site's name at the top to switch. 2. In **Site audit**, select **Run audit**. After the first audit the button reads **Run audit again**. While the audit runs, the report shows **Crawling with JavaScript**, how many of the 50 pages are done, and a progress bar. **Checked** shows how long ago Mark last asked the crawler for progress. The page updates on its own every few seconds while it's open. You can't start a second audit on the same site while one is running. The report header shows when the audit finished, how many pages it crawled, and when AI readiness was last scanned. ## Run audits on a schedule Each audit is a paid crawl, so a site starts on **Manual** and audits only when you select **Run audit**. To audit it once a week instead: 1. In **Site audit**, under **Schedule**, choose one: * **Manual: only when you click Run audit** * **Weekly: runs a paid audit once a week** 2. Select **Save schedule**. With **Weekly**, **Next audit** shows the date and time of the next audit, one week after you save. With **Manual**, it says **Manual**. Saving a schedule doesn't start an audit, and selecting **Run audit** doesn't move the next scheduled one. A scheduled audit shows up in the report the same way as one you started. If it fails, the next one runs a week later. It isn't retried sooner, since every retry is another paid crawl. Select **Try again** to rerun it yourself. ## Read the health score The health score runs from 0 to 100. Next to it are seven category tiles, each with its own score and a count of issues per severity: * **Crawlability & indexing**: broken pages, redirects, and canonicals. * **Rendering**: whether pages show their content without JavaScript. * **On-page content**: titles, descriptions, headings, and text. * **Structured data**: errors in the page's schema markup. * **Performance & page weight**: load time, page size, and compression. * **Security**: HTTPS links. * **AI readiness**: the issues from the site's AI readiness scan. Each issue lowers the score by its weight: a Critical issue counts most, then Warning, then Notice. An issue on every page costs its full weight, and an issue on a few pages costs a share of it. A category with nothing checked shows **n/a** and doesn't count toward the health score. The site's page shows the health score as a badge next to the site's name. Select a tile to show only that category's issues. Select it again, or select **Show all**, to see every issue. ## Read the action plan Below the health score, **Action plan** says what to fix first. It's written by AI from this audit's findings, so check it before acting on it. It starts with a short summary, then sorts the fixes into three columns: * **This week**: Critical issues, and anything that stops search engines from reading the site. * **Next**: Warnings. * **Later**: Notices and polish. Each fix names the issues it solves, under **Fixes**, and how many pages they affect. Select an issue's name to jump to its row in **By issue** and open it. When the site shows a blank page without JavaScript, the first fix names a way to prerender pages for the tools the site is built with. The plan only points at issues this audit found. It appears a minute or two after the crawl finishes, and until then says **Writing the action plan…**. If it can't be written, the report says so; every issue below is still complete, and the next audit tries again. An audit with no issues has nothing to plan. Audits that ran before the action plan existed don't show one. ### AI judged issues The same review adds up to four kinds of issue that need a reader rather than a rule. They carry an **AI judged** badge: * **H1 does not match the title's topic**: the page's heading and its title name different things. The row shows both, and a suggested heading. * **Structured data lacks a type that fits the page**: for example, a product page with no Product schema. The row lists the types to add. * **Organization structured data is incomplete**: your Organization schema lists no social profiles in sameAs, or its logo isn't a logo. * **Page text does not cover what the page is for**: a page whose main text doesn't back up its title and heading, for example a product page with one sentence about the product. The row says what to add and how many words the page's main text has, leaving out the header and footer. Mark reads the main text of every page that loaded, and judges only pages with fewer than 400 words in total or in the main text. The review is told to leave contact, login, checkout, and legal pages alone, since their job needs little text. They count toward the health score like any other issue. When the plan couldn't be written, these checks weren't run, so they don't raise the score either. The same goes for the page text check on audits reviewed before it existed. ## Severity Every issue carries one of three words: * **Critical**: the page or site is broken, or search engines can't read it. For example, a page that returns an error, or a site that shows a blank page without JavaScript. * **Warning**: hurts how search engines read or reach the page. For example, a missing meta description or a slow page. * **Notice**: hygiene. For example, images without alt text. AI readiness issues use the same words: essential is Critical, recommended is Warning, and bonus is Notice. ## Work through the issues The list has two views. **By issue** shows one row per check, Critical first. Within a severity, issues that affect the whole site come first, then the ones on the most pages. The **Pages** column says how many pages have the issue, for example "7 of 50", or **Site-wide**. Select a row to see: * what the audit found, in plain words; * one sentence on how to fix it, with a **Learn how** link to a public reference page; * up to 10 of the affected pages, then how many more there are. For an AI readiness row, the link opens the full AI readiness report instead. **By page** lists the pages that have issues, worst first. Select a page to see its issues. Site-wide issues aren't in this view. Both views show 10 rows at a time. Use **Previous** and **Next** below the list to see the rest. Under both views, the report counts the pages with no issues, for example "12 pages had no issues". ## See what changed since the last audit When you rerun an audit, the report compares it with the finished audit just before it. Audits that are still running or that failed are skipped. Above the health score, one line gives the result, for example "Since the audit on Sep 17, 2026: 3 new issues · 4 fixed". If nothing changed, it reads "No new or fixed issues since the audit on Sep 17, 2026". * In **By page**, a page with new issues shows how many next to its issue count, for example "2 new". Open the page and each new issue has a **New** badge. * **Fixed since** lists each issue that went away, as the page address and the issue. Select it to open the list. It's hidden when nothing was fixed. Only pages crawled by both audits are compared. The 50-page limit can reach different pages from one run to the next, so an issue on a page that only one audit crawled counts as neither new nor fixed. That includes a page you published since the last audit. Site-wide issues aren't compared either. The first audit of a site has nothing to compare with. Neither does an audit run after the site's address changed, or one that shares no crawled page with the audit before it. Those show no comparison. While a new audit runs, **Last finished audit** keeps its own comparison. ## The blank page alert If search engines that don't run JavaScript see a blank page, a red alert sits at the top of the report. It says how many sample pages were fetched without JavaScript and how to fix it: serve each page's own HTML through prerendering or server rendering. Select **See the issue** to jump to its row. This is the most damaging finding an audit can report. Until it's fixed, those search engines see the same empty page at every address on the site. ## Redirect and trailing-slash checks Three site-wide checks look at how the site's addresses redirect. Each row lists up to five example addresses with the status code they answered and where they point, then how many there are in total. * **Internal URLs use temporary redirects (302, 303 or 307)**, a Warning: a page on the site redirects to another page on the site with a temporary status. Search engines can keep the old address as the one they show. Change it to a 301 or 308, which moves the address for good. * **Pages load both with and without a trailing slash**, a Warning: for example, `/pricing` and `/pricing/` both show the page instead of one redirecting to the other. Search engines see two copies. Pick one form, 301 redirect the other to it, and link to that form everywhere. * **Canonical points to a URL that redirects temporarily**, a Notice: a page's canonical tag names an address that answers 302, 303 or 307. Point the canonical at the address the redirect ends at. To find these, the audit reads the crawl's internal links and requests up to 20 addresses that redirected in the crawl or its links or that canonical tags name, and the other slash form of up to 20 crawled pages. It only reads them; it never changes anything on your site. A path your links use in both forms is listed too, even when one form redirects. ## Internal link opportunities When Search Console is connected, the audit suggests links between your own pages. It reads 28 days of Search Console data, ending 3 days ago since Google's newest days are still filling in, and looks for two kinds of page: * **Strong**: at least 20 clicks, at an average position of 10 or better. * **Stuck**: an average position from 11 to 30, with at least 100 impressions. These are just past the first page of results. It pairs a strong page with a stuck page only when they're related: the strong page ranks for one of the stuck page's top five searches, or the two sit in the same section of the site (the same first part of the address) and their titles share at least two words. A strong page that already links to the stuck page is left out. **Internal link opportunities** lists up to five pairs. Each shows the page to link from, the page to link to, the link text to use (the shared search, when there is one), and why the pair makes sense. Once a stuck page holds a top 10 position for about 4 weeks, move the link to another stuck page. These are suggestions only. Mark doesn't change your site; you add the links yourself. If Search Console isn't connected, has no property picked, or its property is for a different domain, the section says so instead. When the audit finds no pairs, the section doesn't show. Audits that ran before this section existed don't show it either. ## Check AI readiness The **AI readiness** tile has a **Check now** button. It runs a new AI readiness scan and rescores the report. When it finishes, the tile says "Updated just now." If the scan can't run, it says "Could not check right now. Try again in a few minutes." and keeps the last results. A site that has an AI readiness scan but no audit yet shows the AI readiness tile and its issues on their own. Select **Run audit** to add the crawl. ## When an audit doesn't finish If the crawl fails, the report says **The audit didn't finish** and shows why, for example when the site's robots.txt blocks the crawler, the site can't be reached, or the crawl timed out. Fix the cause if there is one, then select **Try again** to run a new audit. While a new audit runs, or after one fails, the last finished audit stays below it under **Last finished audit**, with the date it finished. Select it to open it. Audits that ran before site-wide checks existed show the issues they found on each page, without site-wide rows. # Inspect a URL > Check whether Google has indexed one page of your site, and see what blocks it if not. Source: https://docs.use-mark.com/docs/inspect-a-url **Inspect a URL** asks Google Search Console about one page and shows whether Google has indexed it, and why or why not. It shows Google's last recorded view of the page. It doesn't run a fresh test. ## Find the section 1. In the sidebar, select **Analysis** > **Website**. It opens your primary site. To switch sites, select the site's name at the top of the page. 2. **Inspect a URL** is the first section, above **Site audit**. **Performance** also links here. When Google is connected, select "inspect a URL on" and your primary site's name at the bottom of **Search**. See [Read Performance](/docs/read-performance). ## Before you start * Google must be connected with Search Console access. * A Search Console property must be chosen on the Google connection. When both are in place, the section header shows "Search Console property:", then the property. Every inspection uses that one property, whichever site's page you're on. The URL you enter must be a page in that property. ## Inspect a page 1. Enter the full page URL, including https\://. 2. Select **Inspect**. The button reads **Inspecting…** while it runs. The result appears below the form, under the URL you checked. ## Read the result Three values sum it up: * **Verdict**: **Indexed**, **Not indexed**, or **Unknown**. * **Coverage**: Google's own wording for the page's index status. * **Last crawl**: when Google last crawled the page, in your workspace timezone. **Never** means Google hasn't crawled it. The details below show why: * **Crawl allowed**: **Yes**, or "No: blocked by robots.txt". * **Page fetch**: whether Google could load the page. For example, **Successful** or "Failed: not found (404)". * **Indexing allowed**: **Yes**, or a reason such as "No: noindex in robots meta tag". * **User-declared canonical**: the canonical URL the page names, or **None**. * **Google-selected canonical**: the URL Google chose as the canonical. * **Sitemaps**: sitemaps where Google found the page. * **Referring pages**: pages Google saw linking to it. A "—" means Google returned no value for that field. **Sitemaps** and **Referring pages** list at most 5 URLs. If Google knows of more, the list ends with "Showing 5 of", then the total. If a value starts with "No:" or "Failed:", fix that on your site, then inspect the page again after Google recrawls it. When Google returns a link to its full report, **Open in Search Console** shows below the details. It opens in a new tab. ## If something goes wrong If the URL doesn't start with http\:// or https\://, the form says "Enter a full page URL, like `https://example.com/page`." If Google can't inspect the page, the form says "Search Console could not inspect that URL. It must be a page on", then your property, then "Try again." Check that the URL belongs to that property. If the Google connection isn't set up, the section shows one of these messages. Select **Open the Google connection** to fix it in **Settings** > **Connections** > **Google**: * Not connected: "Connect Google to see search clicks and impressions." * No Search Console access: "Your Google connection does not include Search Console. Reconnect Google and allow Search Console access." * No property chosen: "Choose the Search Console property Mark should read on the Google connection." * Access revoked or expired: "Google access was revoked or expired. Reconnect Google to see search data." If Search Console doesn't answer, the section says "Search Console did not answer. Reload to try again." Reload the page. For the rest of the site's page, see [Site audit](/docs/site-audit) and [Check site readiness](/docs/check-site-readiness). # Track AI assistant traffic > Install the tracking file on a Next.js site, check that it works, and read which AI assistants fetch your pages. Source: https://docs.use-mark.com/docs/track-ai-assistant-traffic AI assistants like ChatGPT, Claude, and Perplexity fetch web pages, but they don't run the site tag, so the tag never sees them. A small file on your site records each fetch in your PostHog project. **Performance** then shows the hits in its **AI assistant traffic** section. A hit means an assistant fetched a page. It doesn't mean the assistant cited or recommended you. ## Before you start * The site runs Next.js 16 or later. Other site builders aren't supported yet. * PostHog is connected in **Connections** > **PostHog**. Without it, the site shows "Connect PostHog" instead of the file. ## Install the file 1. Open **Settings** > **Websites**. 2. Pick the website from the menu on its name if you have more than one. 3. Under **AI assistant tracking**, select **Copy** on the file. 4. Save it as `proxy.ts` at the root of the site's project and deploy. If the site already has a `proxy.ts`, the comment at the top of the file says how to merge the two. The file already holds your PostHog project's public token, the same one the site tag uses. Copy a fresh file from Mark rather than editing it by hand. ## Check the install Select **Check AI assistant tracking**. Mark loads the site's home page as **Mark-Probe**, then waits up to 30 seconds for that visit to reach PostHog. Mark-Probe is Mark's own check. It never counts as an assistant. | Result | What it means | | ------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------- | | **Receiving** | An AI assistant fetched a page in the last 7 days. | | **Installed** | Mark's check reached PostHog. No assistant has visited in the last 7 days yet; on a small site that can take days. | | **Not installed** | The site answered, but nothing reached PostHog. Deploy the file, or check again in a minute if you just did. | | **Blocked by the site's firewall** | The site refused Mark's check, so Mark can't tell. [Let Mark-Probe through](#let-assistants-and-mark-probe-through-your-firewall), then check again. | | **Site didn't answer** or **Site couldn't be reached** | Mark couldn't load the home page. Check that the site is up. | | **Check failed** | Mark couldn't read your PostHog project. Check again in a few minutes. | Each website keeps its own last result under the button, with the time Mark checked. If the page says **The check didn't finish**, Mark has no result for that run; select the button again. ## Let assistants and Mark-Probe through your firewall A firewall in front of your site runs before the tracking file. When it blocks a request, the file never sees it and no hit is recorded. Mark's check only tests **Mark-Probe**, so a firewall can block real assistants while the check still says **Installed**. If **Performance** shows no hits for weeks, check the firewall first. Let these user agents through: GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-SearchBot, Claude-User, PerplexityBot, Perplexity-User, and Mark-Probe. Rules that match on a user agent let in anyone who sends that name, so allow only these. ### Vercel Firewall 1. Open the site's project in Vercel and select **Firewall**. 2. Select **Configure**, then **Add New** > **Rule**. 3. Under **If**, pick **User Agent**, choose a contains operator, and enter `Mark-Probe`. Add one condition per assistant name, joined with **OR**. 4. Under **Then**, pick **Bypass**. 5. Select **Save Rule**, then **Review Changes** and **Publish**. 6. Drag the rule above any rule that denies or challenges traffic. A **Bypass** rule gets a request past your other custom rules and past **Bot Protection**. Under **Bot Management**, keep **AI Bots Ruleset** on **Allow**. **Attack Mode** lets known bots through, but it may still challenge Mark-Probe, so check again after you turn it off. ### Cloudflare 1. In **Security Settings**, open **Configure AI bot policies**. Set **Search** and **Agent** to **Allow (do not block)**. Agent covers ChatGPT-User, Claude-User, and Perplexity-User, which fetch a page when a person asks about it. **Training** covers GPTBot and ClaudeBot; allow it if you want to count those too. 2. If you use **AI Crawl Control**, open **Crawlers** and set each assistant to **Allow**. 3. On the Free plan, turn off **Bot fight mode** under **Security Settings** > **Bot traffic**. Cloudflare doesn't let a rule skip it. 4. On Pro and above, add a skip rule instead. Open **Security rules** > **Create rule** > **Custom rules**, enter the expression `http.user_agent contains "Mark-Probe"`, pick **Skip**, and select **All Super Bot Fight Mode rules**, **All managed rules**, and **All remaining custom rules**. Add the assistant names with `or`. Place the rule first. ### Arcjet Arcjet's rules live in your site's code, not a dashboard. * In `detectBot`, add `"CATEGORY:AI"` to `allow`. It covers all eight assistants. * Arcjet has no allow entry for Mark-Probe. Mark-Probe only loads your home page, so skip `protect` when the path is `/` and the user agent contains `Mark-Probe`. Or run the tracking file before Arcjet in your proxy, which records the hit even when Arcjet then denies the request. After you change a firewall, select **Check AI assistant tracking** again. ## Read AI assistant traffic Open **Performance** and pick a range. The **AI assistant traffic** section shows: * **Hits**: every assistant fetch in the range, split into **Verified** and **Unverified**. * Hits, verified, and unverified per assistant, split by kind: * **Crawler** collects pages for training or an index (GPTBot, ClaudeBot, PerplexityBot). * **Search** builds the assistant's own search results (OAI-SearchBot, Claude-SearchBot). * **User fetch** loads a page because a person asked the assistant about it (ChatGPT-User, Claude-User, Perplexity-User). * **Top pages**: the 10 pages fetched most. * A "Data through" line with the newest hit. With no hits in the range, the section says so and links to the Website connection. Select a path in **Top pages** to see that one page. Each assistant gets a row with its hits on the page in the range and the date of its newest fetch, or "None in range". Pick a 30-day range to see which assistants haven't fetched the page in 30 days. **All pages** goes back, and the range and filters stay as you set them. The one-page view shows hits only, not verified and unverified. A hit counts when the request's user agent names an assistant. Anyone can send a request that claims to be GPTBot, so Mark also checks where it came from. ## Verified and unverified hits OpenAI, Anthropic, and Perplexity each publish the IP addresses their bots use. A hit is **verified** when it came from an address on the list for its assistant. Mark reloads the lists once a day. A hit is **unverified** when Mark can't match it to a list. That happens when: * Someone sent a fake assistant user agent. * The request had no IP address. * The vendor's list couldn't be loaded. The section says so. Mark checks the same hits again once the list loads. * The site's PostHog project has **Discard client IP data** turned on. Every hit is then unverified. Anthropic publishes one list for all its bots. A verified ClaudeBot, Claude-SearchBot, or Claude-User hit came from Anthropic, but the list can't show which of the three sent it. OpenAI and Perplexity publish a list per bot. Verified doesn't mean the assistant cited or recommended your site. It only means the fetch really came from that company. # Verify your site in Bing and use IndexNow > Add your site to Bing Webmaster Tools by importing it from Google Search Console, then tell Bing about changed pages from Mark. Source: https://docs.use-mark.com/docs/verify-in-bing-webmaster Microsoft Copilot and Bing's AI answers read Bing's index. Verifying your site in Bing Webmaster Tools shows you what Bing sees, and IndexNow tells Bing when a page changes so it recrawls sooner. Both are free. ## Verify your site in Bing Webmaster Tools The fastest path imports sites you already verified in Google Search Console. You need a Microsoft, Google, or Facebook account to sign in, and access to the site's Search Console property. 1. Go to [bing.com/webmasters](https://www.bing.com/webmasters) and sign in. 2. Under **Import your sites from GSC**, select **Import**. 3. Sign in to Google with the account that has the Search Console property, and allow Bing to read it. 4. Select the sites to import, then select **Import**. Bing verifies each imported site and brings its sitemaps along. There's no file or DNS record to add. If you'd rather not connect Google, choose **Add your site manually** instead and follow Bing's steps for an XML file, a meta tag, or a DNS record. ## What the AI Performance report shows Once the site is verified, **AI Performance** in Bing Webmaster Tools shows how often your pages are cited in Microsoft Copilot, AI summaries in Bing, and some partner AI experiences: * **Citations**: how many times an AI answer used one of your pages. * **Cited pages**: which pages were cited, and how that changes over time. * **Grounding queries**: the searches Copilot ran behind the scenes to find sources for its answers. The data is summarized. It doesn't show individual answers or the prompts people typed, and it doesn't cover ChatGPT, Perplexity, or Google AI Overviews. Mark doesn't read this report yet. Open it in Bing Webmaster Tools. ## Tell Bing about changed pages with IndexNow IndexNow is a shared protocol: one submit reaches Bing and the other search engines that support it. Mark gives each site its own IndexNow key. 1. In the sidebar, select **Analysis** > **Website**, then the site. The **IndexNow** section is below **Inspect a URL**. 2. Copy the **Key**. Host a plain text file at the **File to host** address, `https://