Bug reports that actually help.
Every report carries a screenshot with markers, the page URL, browser with operating system, viewport size with pixel density and time. Stored on your own server.
“The form doesn't submit.” Three words that tell you nothing.
With PagePin the same report arrives with a screenshot, a marker on the form and the browser and viewport it happened in. No more “works on my machine”.
For developers, by developers
Built with the tools and workflows you already use.
Keyboard shortcuts
Report a bug without leaving the keyboard. The toolbar opens on top of the page, markers are numbered in the order you set them.
- Ctrl+Alt+F, on a Mac Cmd+Option+F, opens the toolbar
- Keys 1, 2 and 3 pick bug, OK or note
- Ctrl+Z and Ctrl+Y undo and redo, on a Mac Cmd+Z and Cmd+Shift+Z
Self-hosted
Your server, your database, no external dependencies.
No API keys
Install, activate, check the Next steps list. Nothing to sign up for.
Code standards
WordPress Coding Standards 3.0 and PHPStan level 5.
Two capture methods
The browser's Screen Capture API, with html2canvas as fallback.
Clean uninstall
Deleting the plugin removes its tables, options and screenshots. Deactivating keeps your data.

In the admin
Every bug report gets a status, until it is fixed.
Pinshots move from new to sent to resolved. Filter by status, open the screenshot and close many reports at once with bulk actions.
Pinpoints carry colored tags such as Bug, Design or Urgent, and a counter in the admin bar shows what is still open.
Webhooks and hooks
PagePin sends events to your endpoints and offers one action and two filters in PHP.
Does PagePin have webhooks?
Yes. Up to 10 HTTPS endpoints per site, each with its own events, signing secret, optional extra header and a choice between JSON and Slack compatible text. Deliveries run through WP-Cron, with retries after 1 minute up to 6 hours and a log of the last 50 deliveries.
How do I check the signature?
PagePin follows the Standard Webhooks scheme and sets webhook-id, webhook-timestamp and webhook-signature. The signature is v1, plus the Base64 HMAC-SHA256 of id.timestamp.body with the decoded secret; compare it with hash_equals() and reject timestamps older than five minutes.
Which action does PagePin fire?
pagepin_event fires for every event with its type, such as pinshot.created, and its data, whether webhooks are set up or not. The data includes e-mail addresses, so treat it as personal data.
My site runs behind a proxy or CDN. Which IP address counts?
PagePin uses REMOTE_ADDR only, because forwarded headers can be faked. Name the header your proxy sets with the pagepin_trusted_proxy_headers filter, for example HTTP_CF_CONNECTING_IP behind Cloudflare.
Can the editor metabox show on custom post types?
Yes. The pagepin_metabox_post_types filter returns the post types that get the Pinpoints metabox, post and page by default.
Free and open source
Debug faster. Ship sooner.
Let your QA team pin the issue right on the page, and read it with the context you need.
