Documentation

Everything you need to build on Pressly.

Technical reference for editorial admins, developers, and platform operators. Start with the quickstart and go as deep as you need.

Architecture

How Pressly is structured

Multitenancy

Domain-based tenant resolution via ResolveTenant middleware. Every request web and API gets app('tenant') bound automatically. Demo mode falls back to the first active tenant.

Domain-based routing
Tenant-isolated data
Demo mode fallback
Per-tenant settings and integrations

URL Structure

/ Product marketing site
/{tenant} Publication homepage
/{tenant}/{slug} Single post
/{tenant}/admin Tenant admin panel
/api/v1/posts Headless API
/platform Super admin console

Tech Stack

Backend

Laravel 13 (PHP 8.4) + PostgreSQL

Frontend

Tailwind CSS 4, Alpine.js, TipTap v3, Vite 8

Auth

Laravel Sanctum + Socialite (Google/Facebook/GitHub)

Payments

Stripe Checkout + Billing Portal

AI

OpenAI PHP content generation & SEO

Media

intervention/image, Spatie Tags & Permissions

Database 29 migrations

tenants users posts categories comments media settings plugins tenant_plugins newsletter_subscribers newsletter_campaigns subscriptions subscription_plans content_access_logs api_tokens page_analytics post_revisions activity_logs push_subscriptions notifications redirects ads imports roles permissions taggables tags personal_access_tokens post_collaborators

Editorial & Content

Publishing workflow

Ghost-style Post Editor

Full-width TipTap v3 WYSIWYG editor with a sticky toolbar, right-side publish panel, featured image picker, tag input, and a live SEO score ring. Auto-saves every 60 seconds with full revision history.

  • TipTap v3 rich text (bold, italic, headings, lists, code blocks, blockquote, links, images)
  • Right sidebar: draft/publish toggle, scheduled publish, author, category, tags
  • Featured image with alt text and caption
  • SEO panel: custom title, meta description, slug, OG image, live keyword score
  • AI slide-over: generate title, intro, outline, or full draft from a prompt
  • Revision history compare and restore previous saves
  • Auto-save every 60s with dirty-state indicator

Media Manager

Full file manager at /admin/media for uploading, browsing, and inserting images into content. Powered by intervention/image for server-side processing.

  • Upload images, documents, and files
  • Browse and search tenant media library
  • Insert media directly into TipTap editor
  • Image processing and resizing via intervention/image
  • Alt text and caption fields per upload
  • Tenant-scoped each publication has its own library

Roles & Permissions

Built on Spatie Permissions. Three default roles ship with demo accounts. Roles gate admin panel access, post ownership, and user management.

Admin

admin@demo.com

Full access settings, users, all content, subscriptions

Editor

editor@demo.com

Manage all posts, categories, comments, media

Author

author@demo.com

Create and edit own posts only

Comment Moderation

Reader comments on posts with admin moderation queue. Email notifications fire to the post author on new comment and to the commenter on approval.

  • Guest and authenticated comment submission
  • Approval queue in admin at /admin/comments
  • Author notified by email on new comment (CommentPosted)
  • Commenter notified on approval (CommentApproved)
  • Bulk approve, reject, or delete
  • Per-post comment enable/disable toggle

REST API

Headless CMS endpoints

All 17 endpoints are under /api/v1/. The ResolveTenant middleware runs on every API request. Bearer token auth via Laravel Sanctum.

Interactive docs
GET
/api/v1/posts

List posts with pagination, category, and tag filters

POST
/api/v1/posts

Create a new post (auth required)

GET
/api/v1/posts/{slug}

Single post with full content

PUT
/api/v1/posts/{slug}

Update post (auth required)

DELETE
/api/v1/posts/{slug}

Delete post (auth required)

GET
/api/v1/posts/{slug}/comments

Comments on a post

POST
/api/v1/posts/{slug}/comments

Submit a comment

GET
/api/v1/categories

All categories

GET
/api/v1/categories/{slug}

Category with its posts

GET
/api/v1/tags

All tags

GET
/api/v1/tags/{slug}

Tag with its posts

GET
/api/v1/search?q=

Full-text search across posts

POST
/api/v1/auth/login

Exchange credentials for a Bearer token

POST
/api/v1/auth/register

Create a subscriber account

GET
/api/v1/auth/me

Authenticated user (token required)

POST
/api/v1/auth/logout

Revoke current token

Revenue

Monetization stack

Stripe Subscriptions

Stripe Checkout Sessions, Billing Portal, and webhooks. Keys are stored per-tenant in the integrations JSON field no shared platform keys.

/subscribe
/subscribe/{plan}/checkout
/subscribe/success?session_id=
/subscribe/portal
/webhooks/stripe

Paywalls

Two paywall modes via PaywallService: metered (view-count based) and hard paywall per post. Content preview is gracefully truncated for non-subscribers.

  • Hard paywall full block for non-subscribers
  • Metered paywall configurable free view limit
  • Content preview truncation with upgrade prompt
  • PaywallService tracks per-reader access via ContentAccessLog
  • Paywall bypass for authenticated subscribers
  • Per-post paywall toggle in post editor

Ad Management

Full ad CRUD at /admin/ads with impression and click tracking. Use the <x-ad-slot> Blade component in any theme.

Placements

header before_content inline after_content sidebar between_posts footer

Audience & SEO

Growth and discoverability

SEO Engine

SeoService generates JSON-LD schema, Open Graph tags, canonical URLs, and a live keyword density score in the editor sidebar.

  • XML sitemap at /sitemap.xml
  • robots.txt
  • AMP pages at /amp/{slug}
  • Per-post meta title + description
  • OG image support

Newsletter Engine

Full campaign system create drafts, compose in WYSIWYG or raw HTML, send to all active subscribers instantly.

  • Campaign CRUD at /admin/newsletter
  • Welcome email on subscribe
  • Responsive HTML email templates
  • Unsubscribe token flow
  • Subscriber stats strip

Push Notifications

Web Push API with VAPID keys and a service worker at public/service-worker.js. NewPostPublished notification class ready.

  • POST /push/subscribe save subscription
  • GET /push/vapid-key serve public key
  • Service worker handles push events
  • Per-tenant PushSubscription model

Tracking Codes

Centralized partial injected before </head> in all 15 theme templates. Configure in Settings → Integrations.

  • Google Analytics 4 (GA4)
  • Google Tag Manager (GTM)
  • Facebook Pixel
  • Twitter/X Pixel
  • Hotjar
  • Google Search Console meta tag

AI & Integrations

Connections & automation

AI Writing Assistant

OpenAI-powered slide-over panel in the post editor. Trigger with the ✦ toolbar button. Generate, refine, or summarize content without leaving the editor.

✦ Generate title
✦ Write intro paragraph
✦ Expand outline into draft
✦ Summarize for SEO meta
✦ Suggest related tags
✦ Rewrite for tone

Social Login (Socialite)

OAuth sign-in via Laravel Socialite. Configure client IDs/secrets in .env. Redirect and callback routes are pre-registered.

Google
Facebook
GitHub

Text-to-Speech

Browser Web Speech API player injected into all 15 theme post pages when tts_enabled = 1. Play/pause/stop, speed 0.75×–2×, animated waveform. ElevenLabs field ready for premium TTS.

WordPress Import

WXR XML upload up to 50 MB, or auto-pull from any public WordPress REST API. Full pagination, bulk DB inserts, and in-memory slug maps for zero per-item lookups.

  • WXR XML files up to 50 MB via /admin/imports
  • URL pull from WP REST API (/wp-json/wp/v2)
  • Bulk insert (chunks of 50–100) wrapped in DB transaction
  • Http::pool() for parallel REST pagination
  • Author email deduplication
  • SSRF protection on URL inputs

Email Notifications

Four notification classes ship out of the box. Configure SMTP or Mailgun per-tenant in Settings → Integrations → Email.

WelcomeUser

Fires on new user registration

WelcomeSubscriberMail

Fires on newsletter subscribe

CommentPosted

Post author notified of new comment

CommentApproved

Commenter notified when approved

NewsletterCampaignMail

Sent to all active subscribers on campaign send

NewPostPublished

Ready for push notification integration

Frontend

15 pluggable themes

Every theme ships with home, post, category, search, and tag views. Active theme is set per-tenant in tenants.active_theme. Shared partials handle ads, menus, tracking codes, and the TTS player.

blog

General purpose blog with sidebar

magazine

Editorial grid with featured hero

corporate

Clean B2B publication layout

newsletter

Email-first story presentation

news

Breaking news with standard pagination

minimal

Distraction-free reading mode

photography

Visual-first full-bleed layout

tech

Dev-focused monospace aesthetic

lifestyle

Warm editorial with card grid

docs

Sidebar-nav documentation layout

apex

Premium news with dark hero

meridian

Bold serif editorial

pulse

Live-news ticker style

slate

Clean minimal corporate

vanguard

Bold magazine with full-width imagery

Migration

From WordPress, Ghost, or custom

Pressly ships a fully-featured import engine. Upload a WXR export or point us at a public WordPress REST API and we handle the rest posts, authors, categories, tags, and media references, all mapped cleanly.

Full migration guide →
1

Audit content types, plugins, and subscriber dependencies

2

Upload WXR XML or provide WordPress REST API URL

3

Bulk import: posts, authors, categories, tags in one transaction

4

Rebuild navigation with the drag-and-drop menu builder

5

Validate SEO paths 301 redirects generated automatically

6

Go live under your tenant slug or custom domain

Can't find what you need?

We answer every enquiry no chatbots, just engineers who know the platform.