{"id":383479,"date":"2026-10-12T09:48:18","date_gmt":"2026-10-12T09:48:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/deploy-to-vercel\/"},"modified":"2026-10-12T10:05:14","modified_gmt":"2026-10-12T10:05:14","slug":"headless-deploy-panel-for-vercel","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/headless-deploy-panel-for-vercel\/","author":21181635,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.1","stable_tag":"1.2.1","tested":"7.1.3","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Headless Deploy Panel for Vercel","header_author":"Eurico S\u00e1 Fernandes","header_description":"Trigger and monitor Vercel deployments and revalidate Next.js pages from the WordPress admin.","assets_banners_color":"20262b","last_updated":"2026-10-12 10:05:14","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/eeeurico\/headless-deploy-panel-for-vercel","header_author_uri":"https:\/\/github.com\/eeeurico","rating":0,"author_block_rating":0,"active_installs":0,"downloads":29,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.2.1":{"tag":"1.2.1","author":"eeeurico","date":"2026-10-12 10:05:14","revision":3741048}},"upgrade_notice":{"1.2.0":"<p>The plugin is now called &quot;Headless Deploy Panel for Vercel&quot;. Settings from earlier versions are migrated automatically.<\/p>","1.1.0":"<p>Security update: your Vercel token and deploy hook are no longer exposed in the browser. Settings are migrated automatically. If your revalidation endpoint should only accept WordPress, set a revalidation secret.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3741048,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3741048,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3741048,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3741048,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.2.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3741048,"resolution":"1","location":"assets","locale":"","width":2560,"height":1040},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3741048,"resolution":"2","location":"assets","locale":"","width":2560,"height":1040},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3741048,"resolution":"3","location":"assets","locale":"","width":2560,"height":1520},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3741048,"resolution":"4","location":"assets","locale":"","width":2560,"height":2000}},"screenshots":{"1":"The Deploy Panel lists your latest Vercel deployments and their state.","2":"After you click Deploy, the panel follows the new deployment until it is ready.","3":"The Revalidate box on posts and pages refreshes that page on your Next.js site.","4":"Settings. The deploy hook, API token and revalidation secret are never shown again after saving."}},"plugin_section":[],"plugin_tags":[19981,141196,211409,275241,186251],"plugin_category":[],"plugin_contributors":[286071],"plugin_business_model":[],"class_list":["post-383479","plugin","type-plugin","status-publish","hentry","plugin_tags-deploy","plugin_tags-headless","plugin_tags-nextjs","plugin_tags-revalidate","plugin_tags-vercel","plugin_contributors-eeeurico","plugin_committers-eeeurico"],"banners":{"banner":"https:\/\/ps.w.org\/headless-deploy-panel-for-vercel\/assets\/banner-772x250.png?rev=3741048","banner_2x":"https:\/\/ps.w.org\/headless-deploy-panel-for-vercel\/assets\/banner-1544x500.png?rev=3741048","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/headless-deploy-panel-for-vercel\/assets\/icon-128x128.png?rev=3741048","icon_2x":"https:\/\/ps.w.org\/headless-deploy-panel-for-vercel\/assets\/icon-256x256.png?rev=3741048","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/headless-deploy-panel-for-vercel\/assets\/screenshot-1.png?rev=3741048","caption":"The Deploy Panel lists your latest Vercel deployments and their state."},{"src":"https:\/\/ps.w.org\/headless-deploy-panel-for-vercel\/assets\/screenshot-2.png?rev=3741048","caption":"After you click Deploy, the panel follows the new deployment until it is ready."},{"src":"https:\/\/ps.w.org\/headless-deploy-panel-for-vercel\/assets\/screenshot-3.png?rev=3741048","caption":"The Revalidate box on posts and pages refreshes that page on your Next.js site."},{"src":"https:\/\/ps.w.org\/headless-deploy-panel-for-vercel\/assets\/screenshot-4.png?rev=3741048","caption":"Settings. The deploy hook, API token and revalidation secret are never shown again after saving."}],"raw_content":"<!--section=description-->\n<p>Headless Deploy Panel for Vercel is for sites that use WordPress as a headless CMS with a front end hosted on <a href=\"https:\/\/vercel.com\/\">Vercel<\/a>.<\/p>\n\n<ul>\n<li><strong>Deploy:<\/strong> start a new deployment with one click, using a Vercel deploy hook.<\/li>\n<li><strong>Monitor:<\/strong> see your latest deployments and their state, updated while a deployment is running.<\/li>\n<li><strong>Revalidate:<\/strong> a \"Revalidate page\" button on posts and pages asks your Next.js site to refresh that page (on-demand revalidation), without a full deployment.<\/li>\n<\/ul>\n\n<p>Your Vercel API token, deploy hook and revalidation secret are stored on your server and are only used by WordPress itself. They are never sent to the browser.<\/p>\n\n<p>This plugin is not affiliated with or endorsed by Vercel Inc.<\/p>\n\n<p>Inspired by <a href=\"https:\/\/market.strapi.io\/plugins\/strapi-plugin-vercel-deploy\">Vercel Deploy for Strapi<\/a>.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to the following services. Nothing is sent until an administrator saves the settings, and then only when the actions below happen.<\/p>\n\n<h4>Vercel REST API<\/h4>\n\n<p>Used to list the latest deployments of your Vercel account or team.<\/p>\n\n<ul>\n<li><strong>What is sent:<\/strong> your API token (as an <code>Authorization<\/code> header) and, if set, the project name and team ID.<\/li>\n<li><strong>When:<\/strong> when an administrator opens the <strong>Deploy Panel<\/strong> page, and every few seconds while a deployment started from that page is running.<\/li>\n<li><strong>Endpoint:<\/strong> <code>https:\/\/api.vercel.com\/v6\/deployments<\/code><\/li>\n<\/ul>\n\n<h4>Vercel deploy hook<\/h4>\n\n<p>Used to start a new deployment of your project.<\/p>\n\n<ul>\n<li><strong>What is sent:<\/strong> an empty <code>POST<\/code> request to the deploy hook URL you entered (<code>https:\/\/api.vercel.com\/v1\/integrations\/deploy\/...<\/code>).<\/li>\n<li><strong>When:<\/strong> only when an administrator clicks <strong>Deploy<\/strong>.<\/li>\n<\/ul>\n\n<p>Both services are provided by Vercel Inc.: <a href=\"https:\/\/vercel.com\/legal\/terms\">Terms of Service<\/a>, <a href=\"https:\/\/vercel.com\/legal\/privacy-policy\">Privacy Policy<\/a>.<\/p>\n\n<h4>Your site's revalidation URL<\/h4>\n\n<p>Used for on-demand revalidation of your own front end, at the URL you entered in the settings. This is usually your own Next.js site; if it is hosted on Vercel, the Vercel terms and privacy policy above apply.<\/p>\n\n<ul>\n<li><strong>What is sent:<\/strong> the path and post type of the post, and the revalidation secret (as an <code>x-revalidate-secret<\/code> header) if you set one.<\/li>\n<li><strong>When:<\/strong> only when a user clicks <strong>Revalidate page<\/strong> on a published post.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin from <strong>Plugins \u2192 Add New<\/strong>, or upload the <code>headless-deploy-panel-for-vercel<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>In Vercel, create a <a href=\"https:\/\/vercel.com\/docs\/deploy-hooks\">deploy hook<\/a> for your project and an <a href=\"https:\/\/vercel.com\/account\/tokens\">access token<\/a>.<\/li>\n<li>Go to <strong>Deploy Panel \u2192 Settings<\/strong>, paste the deploy hook URL and the token, and save.<\/li>\n<li>Optionally fill in the project name and team ID to only list that project's deployments.<\/li>\n<li>Go to <strong>Deploy Panel<\/strong> and click <strong>Deploy<\/strong>.<\/li>\n<\/ol>\n\n<p>Only administrators (users who can manage options) can see deployments and start them. Anyone who can edit a post can revalidate it.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"which%20settings%20do%20i%20need%3F\"><h3>Which settings do I need?<\/h3><\/dt>\n<dd><p>The deploy hook URL and an API token are required for the deployments page. Project name and team ID are optional filters. The revalidation URL is only needed for the \"Revalidate page\" button.<\/p><\/dd>\n<dt id=\"how%20do%20i%20find%20my%20team%20id%3F\"><h3>How do I find my team ID?<\/h3><\/dt>\n<dd><p>Open your team in the Vercel dashboard and go to <strong>Settings \u2192 General<\/strong>. You can use the team ID or the team slug.<\/p><\/dd>\n<dt id=\"how%20does%20revalidation%20work%3F\"><h3>How does revalidation work?<\/h3><\/dt>\n<dd><p>When an editor clicks <strong>Revalidate page<\/strong>, WordPress sends a <code>GET<\/code> request to your revalidation URL with two query parameters:<\/p>\n\n<ul>\n<li><code>path<\/code>: the path of the post, for example <code>\/about\/team\/<\/code><\/li>\n<li><code>post_type<\/code>: the post type, for example <code>page<\/code><\/li>\n<\/ul>\n\n<p>If you set a revalidation secret, it is sent in the <code>x-revalidate-secret<\/code> header. Only published content can be revalidated.<\/p><\/dd>\n<dt id=\"can%20you%20show%20an%20example%20next.js%20route%3F\"><h3>Can you show an example Next.js route?<\/h3><\/dt>\n<dd><p>For the App Router, create <code>app\/api\/revalidate\/route.js<\/code>:<\/p>\n\n<pre><code>import { revalidatePath } from \"next\/cache\"\n\nexport async function GET(request) {\n  if (request.headers.get(\"x-revalidate-secret\") !== process.env.REVALIDATE_SECRET) {\n    return Response.json({ message: \"Invalid secret\" }, { status: 401 })\n  }\n\n  const path = request.nextUrl.searchParams.get(\"path\")\n  if (!path) {\n    return Response.json({ message: \"Missing path\" }, { status: 400 })\n  }\n\n  revalidatePath(path)\n  return Response.json({ revalidated: true, path })\n}\n<\/code><\/pre>\n\n<p>Set <code>REVALIDATE_SECRET<\/code> in your Vercel project to the same value as the plugin's \"Revalidation secret\" setting, then use <code>https:\/\/your-site.com\/api\/revalidate<\/code> as the revalidation URL.<\/p><\/dd>\n<dt id=\"can%20i%20show%20the%20revalidate%20box%20on%20custom%20post%20types%3F\"><h3>Can I show the revalidate box on custom post types?<\/h3><\/dt>\n<dd><p>Yes, with the <code>headless_deploy_panel_meta_box_post_types<\/code> filter:<\/p>\n\n<pre><code>add_filter( 'headless_deploy_panel_meta_box_post_types', function ( $post_types ) {\n    $post_types[] = 'product';\n    return $post_types;\n} );\n<\/code><\/pre><\/dd>\n<dt id=\"where%20is%20the%20source%20code%3F\"><h3>Where is the source code?<\/h3><\/dt>\n<dd><p>On <a href=\"https:\/\/github.com\/eeeurico\/headless-deploy-panel-for-vercel\">GitHub<\/a>. Issues and pull requests are welcome.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>The GitHub repository is now github.com\/eeeurico\/headless-deploy-panel-for-vercel, to match the new name.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Renamed from \"Deploy to Vercel\" to \"Headless Deploy Panel for Vercel\", as requested by the WordPress.org Plugins Team. The admin menu is now called \"Deploy Panel\".<\/li>\n<li>Changed: the settings option is now <code>headless_deploy_panel_settings<\/code>. Settings from earlier versions are migrated automatically.<\/li>\n<li>Changed: the meta box filter is now <code>headless_deploy_panel_meta_box_post_types<\/code>.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Security: the API token and deploy hook are no longer sent to the browser. All requests to Vercel are made by WordPress through new REST endpoints.<\/li>\n<li>Security: secret settings are shown as password fields and are never displayed again after saving.<\/li>\n<li>New: optional revalidation secret, sent in the <code>x-revalidate-secret<\/code> header.<\/li>\n<li>New: \"Settings\" link on the Plugins screen.<\/li>\n<li>Improved: the revalidation path is worked out on the server from the post, and only published content can be revalidated.<\/li>\n<li>Improved: after clicking Deploy, the page waits for the new deployment to appear and finish.<\/li>\n<li>Improved: scripts and styles only load on the plugin page and on edit screens that show the revalidate box.<\/li>\n<li>Improved: the admin interface is translatable, including the JavaScript.<\/li>\n<li>Changed: settings are stored in the <code>deploy_vercel_settings<\/code> option. Settings from 1.0.x are migrated automatically.<\/li>\n<li>Changed: the meta box filter <code>VDWP\/meta_box\/post_types<\/code> is now <code>deploy_vercel_meta_box_post_types<\/code>.<\/li>\n<li>Requires WordPress 6.0 and PHP 7.4.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Add \"Revalidate\" meta box to posts and pages for on-demand revalidation of a Next.js front end.<\/li>\n<li>Add Revalidation URL setting.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Changes recommended by the WordPress Plugin Directory team.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Rename the plugin as recommended by the WordPress Plugin Directory team.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"Trigger and monitor Vercel deployments of your headless front end, and revalidate single Next.js pages, from the WordPress admin.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/383479","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=383479"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/eeeurico"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=383479"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=383479"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=383479"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=383479"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=383479"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=383479"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}