Free plan

WordPress

Upload PDFs to WordPress and share them as tracked, secure links with built-in analytics and embeds.

The EveryPage WordPress plugin uploads PDFs to your EveryPage account from wp-admin, gives you tracked share links, and embeds documents inline or as buttons. Readership is readable in two places: a per-file report on the EveryPage Files screen, and an "EveryPage - Recent reads" widget on the WordPress dashboard.

Version 1.1.0 is awaiting review by WordPress.org, so the plugin is not yet in the plugin directory — searching wp-admin for "EveryPage" will not find it. Install it from the plugin zip instead (Plugins → Add New → Upload Plugin), or by copying the everypage folder into /wp-content/plugins/, then activate it.

Requirements and setup

The plugin requires WordPress 6.6 or later and PHP 7.4 or later. After activating, go to EveryPage → Settings, paste your API key (it starts with ep_live_), and save. Create a key from your EveryPage account page.

The key is stored in WordPress options and used only server-side: every call to EveryPage is made by PHP over HTTPS. The block editor and the Media Library screens never hold the key — they go through the plugin's own REST proxy (everypage/v1), which makes the upstream call for them. The one place the key appears in a page is the Settings field itself, which is prefilled for the administrator who set it.

Permissions follow WordPress capabilities: reading files and uploading PDFs needs upload_files; changing a document's viewer settings, and rewriting post content, needs manage_options. The EveryPage admin pages themselves are manage_options.

Settings screen

The Settings screen holds the API key field. Once a key is saved, it shows the connection state beneath it — either "Connected as <email> (<plan> plan)" or the error EveryPage returned, such as an invalid or revoked key. Account details are cached briefly, so after changing a key on the EveryPage side, re-save the settings to refresh what is shown.

Files screen

The Files screen lets you upload a PDF and lists your documents with their name, view count and expiry date. Every row has the same three share actions:

  • Copy the share link. This is your custom-domain vanity URL when the document has both a slug and a verified custom domain, and the durable short-ID link otherwise.
  • Show the QR code, and download it as a PNG.
  • Copy a ready-made iframe embed snippet. The snippet always uses the durable /embed/ URL, never a vanity slug.

Click the settings icon on a row to open that file's settings drawer.

Per-document settings

The settings drawer on the Files page is where you control per-document behaviour — everything your EveryPage plan includes. It has four sections:

Viewer: viewer mode (Standard, Flipbook, Swipe or Magazine), background colour and image effects, page style, mode-specific options (flip speed and layout, page-turn sound, right-to-left reading, swipe auto-advance), logo placement, and branding such as accent colour and toolbar theme.

Protection: allow or block downloads, disable the right-click menu, suppress printing, disable text selection, blur pages when the tab loses focus, set a password, cap the number of views before the link burns, and watermark pages with the reader's email.

Capture: require an email address to read, restrict the gate to specific email domains, attach a lead-capture form, get an email when someone reads the file, and ask readers to confirm receipt.

Link: expiry date or never-expire, a vanity slug, and a page range that limits which pages are served.

Controls your plan doesn't include are disabled rather than hidden, so you find out before you have embedded the document in a post rather than after.

EveryPage Document block

In the Gutenberg editor, add the EveryPage Document block from the Embed category. Pick one of your existing PDFs or upload a new one directly from the editor.

Choose how it displays in the Mode & height panel:

  • Embedded viewer: renders the tracked document viewer inline in an iframe. Height is adjustable from 240 to 1200 pixels and defaults to 600.
  • Button / link: renders a styled button or a plain link, with your own label, that opens the document in a new tab.

The block's Viewer panel carries the viewer settings — mode, theme colours, background effects, page style, flipbook and swipe options, logo, on-screen protection and toolbar theme. It does not carry password, expiry, view limit, gate or slug settings; those live on the Files-screen drawer. Changing a viewer setting here writes it to the document itself, so it applies everywhere that document is shared, not just in this block. Because the key is shared across the whole site, only administrators can change these.

Match my theme's colours reads your theme's colour palette and suggests a viewer background, plus an accent colour on Pro. It shows the swatches it picked before writing anything, and it needs at least a Basic plan to apply them. Themes that expose no palette produce no suggestion.

The block is dynamic: the front end renders through the same shared renderer as the shortcode, so block and shortcode output can never drift apart. Inline embeds always point at the /embed/ path with the short ID or UUID — never a vanity slug — because the bare share page refuses to load in a frame.

Media Library integration

Any PDF already in your WordPress Media Library can be shared via EveryPage. You'll find the sharing option in three places:

  • A "Share via EveryPage" row action on each PDF in the Media list
  • A button in the attachment details pane (visible in the Media modal and the attachment edit screen)
  • A bulk action when you select multiple PDFs

The row action and the attachment button open a modal holding the share link, its QR code (viewable and downloadable), and a "Copy embed code" button. The Media list also gains an EveryPage column showing the view count of each shared PDF, or "Not shared".

Sharing a Media Library PDF uploads a copy of it to your EveryPage account, so it counts against your plan's file count and per-file size limit.

The "Replace links in content" tool finds posts and pages whose content links to the original attachment file and repoints those URLs at the tracked EveryPage share link. Open it from the Replace links in content… button inside the share modal, after the PDF has been shared. Only administrators can run it.

It runs in two steps. First a dry run lists every affected post and page with its link count, and nothing is changed. After you confirm, the links are rewritten with wp_update_post, so each updated post's revision history keeps the version from before the change.

Shortcode

Use the [everypage] shortcode where the block editor is unavailable — the classic editor, or a widget.

[everypage uuid="550e8400-e29b-41d4-a716-446655440000" text="View proposal" button="yes"]

Attributes:

  • uuid (required): the document's identifier. A full UUID, a short ID, or a vanity slug. An identifier containing any other character is rejected and the shortcode renders nothing, rather than silently producing a broken link.
  • text (optional): link text or button label. Defaults to "View document".
  • button (optional): yes, true or 1 renders a styled button. Anything else, including the default, renders a plain text link.

The shortcode only ever produces a link or a button, never an inline viewer — for that, use the block's embedded-viewer mode. It shares the block's renderer, so a shortcode button and a block button are identical.

oEmbed

Paste an everypage.co share link on its own line in the editor and the tracked viewer embeds automatically. The plugin makes this work by registering everypage.co as a trusted oEmbed provider on activation.

The registration is what matters. Without the plugin, WordPress still discovers the oEmbed endpoint from the page's HTML, but an unregistered provider is untrusted, so WordPress wraps the result in a sandboxed iframe. That gives the frame an opaque origin, and the viewer cannot boot inside it — cross-origin requests for its assets and public endpoints are refused for a null origin. Registering the provider skips the sandbox, and the embed renders like any first-class provider's.

The registered pattern covers everypage.co links only. A share link on your own custom domain is not matched and will not auto-embed; use the block or the embed snippet for those.

Plan limits

The plugin is a client for your EveryPage account, so your plan's limits apply unchanged: 3 active files on Free, 100 on Basic, unlimited on Pro, each with its own per-file size cap. Summary readership is available on every plan; trends, the read-through funnel, breakdowns and per-page stats need Basic, and reader identities, CSV export and the email-capture gate need Pro.

The plugin reads your plan from the API and disables the controls above it, with a link to upgrade. See Plans and limits for the full table.