Perplexity is the easiest AI engine to monitor and one of the hardest to optimise for, and both facts come from the same place: it links generously and documents its selection logic barely at all.
The generous linking means your presence is observable. Answers carry numbered inline citations, and clicks arrive as ordinary referrals you can see in analytics. Compare that to an engine that grounds in your content and shows nothing. You can build a real measurement loop here.
The thin documentation means most of what circulates about “how Perplexity picks sources” is inference dressed as fact. Let us separate the two.
What Perplexity actually documents
The primary source is its bots guide, and it is short. Two agents, two jobs.
PerplexityBot is described as “designed to surface and link websites in search results on Perplexity”. This is the index-building crawler. Perplexity recommends allowing it in robots.txt. Its published IP ranges live at perplexity.com/perplexitybot.json.
Perplexity-User supports user actions within Perplexity, fetching a page when someone’s request requires visiting it. Its documentation says “this fetcher generally ignores robots.txt rules”, on the reasoning that the request is user-initiated rather than a crawl. IP ranges at perplexity.com/perplexity-user.json.
Perplexity also states that neither crawler is used to crawl content for AI foundation models. That is a meaningful distinction if your crawler policy was written to keep your content out of training data, because on this vendor those are not the same bots. Blocking PerplexityBot to avoid training accomplishes nothing except making you ineligible for citation. See AI user agents for why this mistake is so common and so expensive.
What the documentation pointedly does not say
Nothing about JavaScript rendering. Not a word, in either direction. No commitment that PerplexityBot executes JavaScript, no statement that it does not.
This is the gap that quietly kills sites. Undocumented is not the same as no, and I am not going to tell you it cannot render. What I will tell you is that you cannot verify it, you cannot get a commitment, and you have no recourse when it does not work. If your product claims, pricing, or comparison tables only exist after a client-side fetch, you are betting your citation eligibility on an undocumented behaviour. Serve the substance in the initial HTML. See which AI crawlers render JavaScript for how each vendor’s documentation compares on this.
Nothing about ranking or source selection. No description of how candidates are scored, no weighting of domain authority, freshness, or structure. Any article telling you Perplexity weights a specific factor by a specific amount is describing an experiment somebody ran, at best, or a guess, at worst.
Nothing about llms.txt or any special file. The documented controls are robots.txt and user agents.
Two agents means two different monitoring signals
This is the practical payoff of reading the docs, and most people miss it.
PerplexityBot hitting your pages means you are being indexed. It is a leading indicator of eligibility. If it never visits, nothing downstream can happen.
Perplexity-User hitting a specific URL means a human asked something that required your page right now. That is not an index signal, it is a demand signal. A spike of Perplexity-User fetches on one URL tells you a live conversation is happening about the topic that page covers.
Splitting those in your log analysis gives you two distinct metrics: coverage and pull. Most log dashboards mash them into one “Perplexity traffic” line and destroy the distinction.
Verify both by IP against the published JSON before trusting either. A user agent string is a self-report, and both of these names are trivially forged.
The monitoring stack
Layer 1: server logs, split by agent. Track PerplexityBot fetches by URL and status code, and Perplexity-User fetches separately. What you are looking for is coverage gaps, non-200 responses, and pages that were fetched but served without content. Verify by IP.
Layer 2: referral analytics. Perplexity links, so clicks arrive with a referrer. Segment them out and track landing pages. This is the only hard traffic number in the whole exercise, and it is worth more than any presence percentage because it is measured on your own property rather than sampled from theirs.
Layer 3: prompt sampling. Run a fixed set of questions your customers actually ask and record which domains get cited and where you appear in the citation list. Freeze the method: same prompts, same cadence, and note that results vary run to run. Log the competitor domains every time. Movement in the competitor set is the highest-value output.
Layer 4: the gap analysis. Compare layers. Fetched heavily but never cited means a usability problem, not an access problem. Cited but no referrals means the answer resolved without a click, which is a real outcome you should stop treating as a failure. Never fetched at all means go fix robots.txt and stop reading optimisation advice.
What appears to influence selection
Honest framing: nobody outside Perplexity knows the weighting. What follows is reasoning from how retrieval-augmented systems work in general, plus what the documentation implies. Treat it as a prior, not a fact.
Retrievability first. The crawler has to reach the page and get content. This is the only part that is documented and it is the part most often broken.
Passage-level specificity. Grounded answers are assembled from spans of source text. Content that states a checkable claim in a self-contained sentence maps onto that better than content that develops an argument across five paragraphs. See AI grounding.
Corroboration across independent sources. Being described consistently in places the engine already retrieves from, comparison posts, directories, forums, review sites, gives retrieval more paths to you and attribution more reason to name you. In my experience this does more work than anything on your own domain, and it is also the slowest to build.
Freshness where the question is time-sensitive. For “best X in 2026” style queries, recently updated pages appear to fare better. Unsurprising, unverified.
What I am not going to tell you is a word count, a schema type, or a heading structure that wins. Those claims are unfalsifiable from outside and I have no evidence for them.
The mistakes worth avoiding
Blocking the wrong bot. Blocking PerplexityBot to protect against training. Perplexity says these crawlers are not used for foundation model training, so this trade gets you nothing and costs you eligibility.
Blocking Perplexity-User and expecting it to work. The documentation says it generally ignores robots.txt. If you want it out, you need network-level controls, and you should understand you are blocking a fetch a human explicitly requested.
Chasing an appearance percentage. Your prompt panel is a sample of a distribution nobody has published. Track its trend, not its level. Same caution as AI share of voice.
Treating zero referrals as zero value. An answer that resolves without a click still shaped a buying decision using your framing. Read citation insights for how to value that.
The short version
Allow PerplexityBot, verify it by IP, and split its log traffic from Perplexity-User so you can tell coverage from demand.
Serve your content in HTML, because Perplexity has committed to nothing about rendering. Then measure with referrals as the hard number and prompt sampling as the soft one, and be suspicious of anyone claiming to know the ranking factors of a system whose operator has published none.