{"id":356189,"date":"2026-10-15T17:59:52","date_gmt":"2026-10-15T17:59:52","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/vakanssi-hiring-applicant-tracking\/"},"modified":"2026-10-23T16:05:00","modified_gmt":"2026-10-23T16:05:00","slug":"vakanssi","status":"publish","type":"plugin","link":"https:\/\/eu.wordpress.org\/plugins\/vakanssi\/","author":23551840,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.5","stable_tag":"1.2.5","tested":"7.1.3","requires":"6.6","requires_php":"7.4","requires_plugins":null,"header_name":"Vakanssi: Careers Page, Hiring & Applicant Tracking","header_author":"Vakanssi","header_description":"All-in-one Hiring & ATS for WordPress: job listings, a careers page with Google-for-Jobs schema, applicant tracking with a drag-and-drop pipeline, confirmation and notification emails, and privacy tools.","assets_banners_color":"e4f2ed","last_updated":"2026-10-23 16:05:00","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/vakanssi.com\/","header_author_uri":"https:\/\/savvy.co.il\/en\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":370,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.37.15":{"tag":"0.37.15","author":"vakanssi","date":"2026-10-15 17:59:26","revision":3749093},"1.0.0":{"tag":"1.0.0","author":"vakanssi","date":"2026-10-15 21:58:26","revision":3749387},"1.0.1":{"tag":"1.0.1","author":"vakanssi","date":"2026-10-16 13:59:18","revision":3750538},"1.1.0":{"tag":"1.1.0","author":"vakanssi","date":"2026-10-17 09:07:34","revision":3751679},"1.1.1":{"tag":"1.1.1","author":"vakanssi","date":"2026-10-17 11:06:30","revision":3751832},"1.1.2":{"tag":"1.1.2","author":"vakanssi","date":"2026-10-18 07:39:30","revision":3752695},"1.2.0":{"tag":"1.2.0","author":"vakanssi","date":"2026-10-21 19:21:00","revision":3758961},"1.2.1":{"tag":"1.2.1","author":"vakanssi","date":"2026-10-22 08:04:15","revision":3759515},"1.2.2":{"tag":"1.2.2","author":"vakanssi","date":"2026-10-22 13:11:08","revision":3759958},"1.2.3":{"tag":"1.2.3","author":"vakanssi","date":"2026-10-22 19:57:08","revision":3760470},"1.2.4":{"tag":"1.2.4","author":"vakanssi","date":"2026-10-23 08:02:41","revision":3761144},"1.2.5":{"tag":"1.2.5","author":"vakanssi","date":"2026-10-23 16:05:00","revision":3761995}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3749092,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3749092,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3749092,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3749092,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3749092,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3762033,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"landingPage\":\"\\\/wp-admin\\\/admin.php?page=vakanssi-candidates&view=board\",\"preferredVersions\":{\"php\":\"8.3\",\"wp\":\"latest\"},\"phpExtensionBundles\":[\"kitchen-sink\"],\"steps\":[{\"step\":\"login\",\"username\":\"admin\",\"password\":\"password\"},{\"step\":\"defineWpConfigConsts\",\"consts\":{\"VAKANSSI_STORAGE_DIR\":\"\\\/vakanssi-private\"}},{\"step\":\"setSiteOptions\",\"options\":{\"blogname\":\"Northwind\"}},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"vakanssi\"},\"options\":{\"activate\":true}},{\"step\":\"runPHP\",\"code\":\"<?php require_once '\\\/wordpress\\\/wp-load.php'; delete_transient( 'vakanssi_activation_redirect' ); $result = ( new \\\\Vakanssi\\\\Admin\\\\SampleContent() )->seed(); if ( is_wp_error( $result ) ) { throw new Exception( 'Vakanssi sample data: ' . $result->get_error_message() ); }\"}]}"}},"all_blocks":{"vakanssi\/jobs":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"vakanssi\/jobs","version":"1.0.0","title":"Job Listings","category":"vakanssi","icon":"businessperson","description":"A filterable list of your open positions, the same output as the [vakanssi_jobs] shortcode.","keywords":["jobs","careers","positions","hiring","vacancies"],"textdomain":"vakanssi","supports":{"align":["wide","full"],"html":false},"attributes":{"layout":{"type":"string","default":"list"},"limit":{"type":"number","default":20},"paginate":{"type":"boolean","default":true},"filters":{"type":"boolean","default":true},"filterControls":{"type":"array","default":["search","department","remote","sort"],"items":{"type":"string"}},"showLocation":{"type":"boolean","default":true},"showType":{"type":"boolean","default":true},"orderby":{"type":"string","default":"date"},"order":{"type":"string","default":"DESC"},"includeExpired":{"type":"boolean","default":false},"department":{"type":"array","default":[],"items":{"type":"string"}},"location":{"type":"array","default":[],"items":{"type":"string"}}},"editorScript":"vakanssi-jobs-block"}},"tagged_versions":["0.37.15","1.0.0","1.0.1","1.1.0","1.1.1","1.1.2","1.2.0","1.2.1","1.2.2","1.2.3","1.2.4","1.2.5"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3749092,"resolution":"1","location":"assets","locale":"","width":3200,"height":2000},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3749092,"resolution":"2","location":"assets","locale":"","width":3200,"height":2000},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3749092,"resolution":"3","location":"assets","locale":"","width":3200,"height":2000},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3749092,"resolution":"4","location":"assets","locale":"","width":3200,"height":2000},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3749092,"resolution":"5","location":"assets","locale":"","width":3200,"height":2000},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3749092,"resolution":"6","location":"assets","locale":"","width":3200,"height":2000}},"screenshots":{"1":"The hiring pipeline. Drag candidates between your own stages, with a live count on each and ratings, attachments and dates at a glance.","2":"A candidate. CV on file with an inline preview, rating, notes, interviews and the full history, without leaving the board.","3":"Your careers page. Branded, filterable, and marked up for Google for Jobs.","4":"The application form. Secure CV upload, LinkedIn and cover letter, on your own job page.","5":"Interviews. Schedule an interview and send a real calendar invite, with internal notes only your interviewers see.","6":"Setup. Three short steps. It looks at your site first and offers to connect an existing careers page instead of creating a duplicate."}},"plugin_section":[],"plugin_tags":[16501,9022,16503,139851,12264],"plugin_category":[],"plugin_contributors":[286969],"plugin_business_model":[],"class_list":["post-356189","plugin","type-plugin","status-publish","hentry","plugin_tags-applicant-tracking","plugin_tags-ats","plugin_tags-careers","plugin_tags-hiring","plugin_tags-recruiting","plugin_contributors-vakanssi","plugin_committers-vakanssi","plugin_support_reps-roeeyossef"],"banners":{"banner":"https:\/\/ps.w.org\/vakanssi\/assets\/banner-772x250.png?rev=3749092","banner_2x":"https:\/\/ps.w.org\/vakanssi\/assets\/banner-1544x500.png?rev=3749092","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/vakanssi\/assets\/icon.svg?rev=3749092","icon":"https:\/\/ps.w.org\/vakanssi\/assets\/icon.svg?rev=3749092","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/vakanssi\/assets\/screenshot-1.png?rev=3749092","caption":"The hiring pipeline. Drag candidates between your own stages, with a live count on each and ratings, attachments and dates at a glance."},{"src":"https:\/\/ps.w.org\/vakanssi\/assets\/screenshot-2.png?rev=3749092","caption":"A candidate. CV on file with an inline preview, rating, notes, interviews and the full history, without leaving the board."},{"src":"https:\/\/ps.w.org\/vakanssi\/assets\/screenshot-3.png?rev=3749092","caption":"Your careers page. Branded, filterable, and marked up for Google for Jobs."},{"src":"https:\/\/ps.w.org\/vakanssi\/assets\/screenshot-4.png?rev=3749092","caption":"The application form. Secure CV upload, LinkedIn and cover letter, on your own job page."},{"src":"https:\/\/ps.w.org\/vakanssi\/assets\/screenshot-5.png?rev=3749092","caption":"Interviews. Schedule an interview and send a real calendar invite, with internal notes only your interviewers see."},{"src":"https:\/\/ps.w.org\/vakanssi\/assets\/screenshot-6.png?rev=3749092","caption":"Setup. Three short steps. It looks at your site first and offers to connect an existing careers page instead of creating a duplicate."}],"raw_content":"<!--section=description-->\n<p>Vakanssi is a complete applicant tracking system (ATS) for WordPress: branded job listings with Google-for-Jobs\nstructured data, a native application form, an applications inbox with a configurable drag-and-drop\npipeline board, templated emails, and tools for handling candidate data (export, erasure and\nscheduled retention), all on your own server, with no per-seat SaaS fees.<\/p>\n\n<p><strong>A complete hiring workflow:<\/strong><\/p>\n\n<ul>\n<li><strong>Jobs &amp; careers<\/strong>: a <code>vakanssi_job<\/code> post type, a branded careers archive (at <code>\/jobs\/<\/code> by default, or on\nyour own careers page) and <code>[vakanssi_jobs]<\/code> shortcode, and valid Google-for-Jobs <code>JobPosting<\/code> structured data that is\nwithheld automatically when a job is not eligible (expired, no location, no apply path, \u2026).<\/li>\n<li><strong>Application intake<\/strong>: a native application form with a secure CV upload (type-verified by magic\nbytes, randomised filename, owner-only permissions), spam\/honeypot\/rate-limiting, and candidate\nde-duplication by email.<\/li>\n<li><strong>Applications inbox &amp; pipeline board<\/strong>: a sortable, filterable inbox plus a build-free React\nKanban board with a candidate profile drawer; configurable stages; bulk move\/delete.<\/li>\n<li><strong>Interviews &amp; calendar invites<\/strong>: schedule an interview from the candidate's record and send a\nreal <code>.ics<\/code> invite that Google, Outlook and Apple render as an actionable event, with no OAuth and\nno connected account. Reschedule, cancel, and keep internal notes that reach your interviewers'\ncalendars and never the candidate's.<\/li>\n<li><strong>Application data &amp; export<\/strong>: export applications to CSV, print or save any application as a PDF, and edit application details, right from the inbox.<\/li>\n<li><strong>Email<\/strong>: templated confirmation\/recruiter\/rejection\/offer emails with personalization tags and\nan SMTP-compatible sender, logged and de-duplicated.<\/li>\n<li><strong>Candidate data controls<\/strong>: consent capture, WordPress core data export\/erase integration (with a\ncomplete cascade across all candidate data), a retention-purge cron, and an audit log. These are\ntools you operate; they do not by themselves make a site compliant with any particular law.<\/li>\n<li><strong>Blocks, page builders &amp; themes<\/strong>: a Job Listings block for the block editor, native <strong>Elementor<\/strong>\nwidgets for the listing, the application form and the job details (Elementor Pro Theme Builder\narchive\/single templates are respected too), a <strong>Divi<\/strong> module, and shortcodes for everywhere else.\nBlock themes on WordPress 6.7 and later get editable Site Editor templates; classic themes get the\nbuilt-in archive.<\/li>\n<li><strong>First-run setup wizard<\/strong>: sender identity and a careers page in a few clicks, with optional\nsample content and a prompt to post your first job.<\/li>\n<li><strong>Foundations<\/strong>: scale-ready custom tables (engineered for 10k+ applications), a modular\narchitecture (disabled modules load no code\/assets), capability-based roles (Recruiter, Hiring\nManager, HR\/Compliance), and a <code>vakanssi\/v1<\/code> REST API with per-route\npermission checks.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>Vakanssi does not contact any external service on its own. Everything it stores stays on\nyour server. One optional integration talks to a third party, and only after you switch it\non and enter your own credentials:<\/p>\n\n<p><strong>Cloudflare Turnstile<\/strong> (optional spam protection for the public application form)<\/p>\n\n<p>Turnstile is off by default. It activates only once you enter a Turnstile site key and\nsecret under Hiring \u2192 Settings \u2192 Application form. While it is enabled:<\/p>\n\n<ul>\n<li>each visitor's browser loads the challenge script from\n  https:\/\/challenges.cloudflare.com\/turnstile\/v0\/api.js;<\/li>\n<li>when someone submits an application, the resulting challenge token, the visitor's IP\naddress and your secret key are sent to\n  https:\/\/challenges.cloudflare.com\/turnstile\/v0\/siteverify so Cloudflare can confirm the\nsubmission is not automated;<\/li>\n<li>when an administrator uses \"Test these keys\" on the settings screen, that admin's browser\nloads the same challenge script, and the resulting token, the admin's IP address and the\nsecret key being tested are sent to the same address, so the key pair can be checked\nwithout waiting for a real application.<\/li>\n<\/ul>\n\n<p>No application content (no name, email, CV, or answers) is sent to Cloudflare. Turning the\nsetting off stops all contact with the service.<\/p>\n\n<p>Service: https:\/\/www.cloudflare.com\/products\/turnstile\/\nTerms of service: https:\/\/www.cloudflare.com\/terms\/\nPrivacy policy: https:\/\/www.cloudflare.com\/privacypolicy\/<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>vakanssi<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install through the Plugins screen.<\/li>\n<li>Activate the plugin. Activation creates the database tables, installs roles, provisions protected\nfile storage, and opens a short setup wizard.<\/li>\n<li>Complete <strong>Hiring \u2192 Setup<\/strong> (sender email, careers page), post your first job, then review\n<strong>Hiring \u2192 Tools \u2192 Status<\/strong> for system status.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20removing%20the%20plugin%20delete%20my%20candidate%20data%3F\"><h3>Does removing the plugin delete my candidate data?<\/h3><\/dt>\n<dd><p>No. Uninstalling removes roles, capabilities, and plugin settings, but your hiring data is kept\nunless you explicitly enable <strong>Hiring \u2192 Settings \u2192 General \u2192 Delete all data on uninstall<\/strong>.\nWhile another copy of Vakanssi is still installed (for example in a second plugin folder),\ndeleting a copy removes nothing, so the copy you keep runs with its settings and data.<\/p><\/dd>\n<dt id=\"are%20uploaded%20cvs%20protected%20from%20direct%20download%3F\"><h3>Are uploaded CVs protected from direct download?<\/h3><\/dt>\n<dd><p>Yes, with defence in depth. Candidate files are stored in a protected <code>vakanssi<\/code> folder in\nyour uploads directory, under random 128-bit file names, with an Apache deny rule, index guards and a\ngenerated Nginx rule. Vakanssi then <strong>verifies over HTTP<\/strong> that the folder is not directly reachable,\nand shows an admin warning (with the exact Nginx rule to add) if it is. The plugin itself only serves\nCVs through an authenticated, permission-checked download link.\nTo keep them outside your public site entirely, define <code>VAKANSSI_STORAGE_DIR<\/code> as an absolute path in <code>wp-config.php<\/code>; moving your existing CVs is covered at https:\/\/docs.vakanssi.com\/admin\/move-cv-storage\/<\/p><\/dd>\n<dt id=\"who%20on%20my%20team%20can%20see%20candidate%20applications%20and%20cvs%3F\"><h3>Who on my team can see candidate applications and CVs?<\/h3><\/dt>\n<dd><p>Anyone you grant a hiring role to. Vakanssi ships three roles (Recruiter, Hiring Manager, and HR \/ Compliance)\nplus Administrator, and any user with the \"view applications\" capability can see <strong>every<\/strong> candidate\nand download <strong>every<\/strong> CV in the pipeline. In other words, Vakanssi does not restrict staff to only\nthe jobs or candidates assigned to them: it assumes your hiring team is trusted, which is the right\ndefault for most small teams. Only grant these roles to people who should see all applicants.<\/p><\/dd>\n<dt id=\"how%20do%20i%20report%20a%20security%20issue%3F\"><h3>How do I report a security issue?<\/h3><\/dt>\n<dd><p>Email <strong>security@vakanssi.com<\/strong> rather than posting in the support forum, so a fix can ship before\nthe details are public. Please include the Vakanssi version, your WordPress and PHP versions, and\nsteps to reproduce. You will get an acknowledgement within three business days and an initial\nassessment within a week, and you will be credited in the changelog for the release that fixes it\nunless you would rather not be. Only the most recent release receives security fixes, so updating\nis always part of the answer.<\/p><\/dd>\n<dt id=\"what%20personal%20data%20is%20included%20in%20a%20gdpr%20data-export%20request%3F\"><h3>What personal data is included in a GDPR data-export request?<\/h3><\/dt>\n<dd><p>When you run <strong>Tools \u2192 Export Personal Data<\/strong> for a candidate's email, Vakanssi includes their\nprofile (name, email, phone, location), every application (position, stage, status, date, and whether\nconsent was given), the cover letter, their LinkedIn profile, each uploaded CV\/attachment (the file itself, with its\nfilename and upload date), the submission context stored with the application (the page the application was sent from), the\nrecruiter notes and interview notes written about them, their interviews, and the emails Vakanssi\nsent them. Other details stored with an application or the candidate are included too, under\n\"Additional application data\". The export deliberately does <strong>not<\/strong> name the staff member who wrote a note, gave a\nrating, or conducted an interview. That is a third party's personal data, not the candidate's.<\/p>\n\n<p>The matching <strong>Erase Personal Data<\/strong> tool removes all of it, including the CV files on disk. Export\nand erasure share one list of the tables that hold notes, interviews and emails about a candidate,\nso the two stay in step.<\/p><\/dd>\n<dt id=\"does%20it%20work%20on%20wordpress%20multisite%3F\"><h3>Does it work on WordPress multisite?<\/h3><\/dt>\n<dd><p>Yes, activated per site or network-wide. Each site keeps its own jobs, candidates, CVs and\nsettings (data is never shared between sites), and each site chooses independently whether\ndeleting the plugin also deletes its hiring data. There is no network-level configuration screen; settings are per site.<\/p>\n\n<p>Network activation is the recommended setup: deleting a site then removes that site's Vakanssi\ndata with it. With per-site activation, a site deleted where Vakanssi is not active keeps its\nVakanssi tables, and its CVs when they are in a custom storage folder, until you remove them by\nhand. A single site turned into a network keeps finding the CVs it stored before, and Site Health\nnames the folder to move them from.<\/p><\/dd>\n<dt id=\"does%20it%20work%20on%20nginx%3F\"><h3>Does it work on Nginx?<\/h3><\/dt>\n<dd><p>Yes. Nginx ignores <code>.htaccess<\/code>, so add the generated <code>location<\/code> block to your server config. The\nplugin's screens show the rule, and Site Health flags the folder, when it is reachable.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20my%20theme%20and%20page%20builder%3F\"><h3>Does it work with my theme and page builder?<\/h3><\/dt>\n<dd><p>Yes, and you do not have to fall back to a shortcode. The block editor gets a <strong>Job Listings<\/strong>\nblock. <strong>Elementor<\/strong> gets three native widgets (the listing, the application form, and the job\ndetails) grouped under a Vakanssi section in the panel, and they work with the free Elementor; if\nyou run Elementor Pro, your Theme Builder archive and single templates for jobs are used instead of\nours. <strong>Divi<\/strong> gets a Jobs module. Shortcodes (<code>[vakanssi_jobs]<\/code>, <code>[vakanssi_job_apply]<\/code>,\n    [vakanssi_job_details]) still work anywhere else, including builders with no dedicated\nintegration.<\/p>\n\n<p>Themes need nothing special. Block themes on WordPress 6.7 and later get editable \"Jobs archive\" (while the archive page is on)\nand \"Single job\" templates in the Site Editor, built from your own header and footer; classic themes get the built-in archive. The\ncandidate-facing pages are styled so they survive a theme's own CSS reset, so the listing and the\napply button look the same whichever theme you run.<\/p><\/dd>\n<dt id=\"can%20i%20restyle%20the%20careers%2Fjob%20pages%2C%20and%20will%20custom%20css%20slow%20my%20site%20down%3F\"><h3>Can I restyle the careers\/job pages, and will custom CSS slow my site down?<\/h3><\/dt>\n<dd><p>Yes. Under <strong>Hiring \u2192 Settings \u2192 Jobs &amp; Careers \u2192 Appearance<\/strong> you can turn off Vakanssi's front-end stylesheet\nentirely, if your theme styles the markup. For your own styling, use WordPress's built-in editor at\n<strong>Appearance \u2192 Customize \u2192 Additional CSS<\/strong>, which adds no extra request. Vakanssi keeps its own\nselectors deliberately low-weight and its class names stable. Match their weight, such as\n    .vakanssi-apply-form .vakanssi-apply-button for the application form's Submit button or\n    .vakanssi-apply .vakanssi-apply-button for a job's Apply link, and style <code>:hover<\/code>, <code>:focus<\/code> and\n    :active as well, since Vakanssi sets those too. On most pages that is enough without <code>!important<\/code>.<\/p>\n\n<p>The same <code>vakanssi-<\/code> class names are on the careers and job pages under block themes and classic\nthemes alike, so one rule covers both. On a block theme your theme keeps control of the page width\nand spacing and Vakanssi adds no styling of its own to those wrappers, so your rules apply exactly\nas you write them.<\/p><\/dd>\n<dt id=\"do%20i%20need%20any%20special%20server%20setup%20for%20a%20production%20site%3F\"><h3>Do I need any special server setup for a production site?<\/h3><\/dt>\n<dd><p>Two things are worth doing on a live hiring site, and both are standard WordPress production\nhygiene rather than Vakanssi requirements. First, switch WordPress to a real cron trigger:\nout of the box, WordPress runs scheduled tasks only when someone visits your site, so on a\nquiet careers site scheduled work can run late. Vakanssi relies on it to purge candidate data once\nits retention period is up. Add <code>define( 'DISABLE_WP_CRON', true );<\/code> to <code>wp-config.php<\/code> and trigger\n    wp-cron.php every few minutes; most managed hosts offer this as a checkbox. Second, if your\nhost offers a persistent object cache (Redis or Memcached), enable it: Vakanssi uses\ntransients for its dashboard counters, and an object cache keeps those out of the database\nunder heavy traffic. Apply-form rate limits always use the database, so they hold either way. Nothing breaks without either step.<\/p><\/dd>\n<dt id=\"can%20i%20disable%20the%20%2Fjobs%2F%20archive%20page%3F\"><h3>Can I disable the \/jobs\/ archive page?<\/h3><\/dt>\n<dd><p>Yes: <strong>Hiring \u2192 Settings \u2192 Jobs &amp; Careers \u2192 Job URLs<\/strong> \u2192 \"Archive page\". Single job pages stay\nlive under your job URL base (e.g. \/jobs\/job-title\/); the archive URL becomes available for your own\npage, such as a Careers page using the [vakanssi_jobs] shortcode.<\/p><\/dd>\n<dt id=\"what%20stops%20two%20recruiters%20overwriting%20each%20other%20on%20the%20board%3F\"><h3>What stops two recruiters overwriting each other on the board?<\/h3><\/dt>\n<dd><p>Every save carries the state the screen was showing when you started editing. If someone else\nchanged that candidate first, the save is refused and you are shown what changed instead of\nquietly losing one of the two edits. This runs over ordinary REST requests, so it needs nothing\nspecial on your server and works on any host that runs WordPress normally.<\/p><\/dd>\n<dt id=\"is%20there%20a%20pro%20version%3F\"><h3>Is there a Pro version?<\/h3><\/dt>\n<dd><p>Yes. Vakanssi Pro is a separate plugin, coming soon, for teams that need more. Everything in this plugin stays free and fully working. Get notified when it launches at https:\/\/vakanssi.com\/#notify<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.5<\/h4>\n\n<ul>\n<li>Fixed: editing a location, even just its description, no longer changes the city of jobs in the locations under it, and editing \"Remote\" no longer gives remote jobs the city \"Remote\".<\/li>\n<li>Fixed: saving a job without changes keeps all of its locations, for example after an import, instead of keeping only the first one alphabetically.<\/li>\n<li>Fixed: you can clear a job's location, and a deleted location no longer comes back the next time a job is saved. Deleting a location also removes it as the city of the jobs that used it.<\/li>\n<li>Changed: Quick Edit and Bulk Edit on All Jobs no longer offer locations, because they changed a job's location without its city. Set the location in the job editor.<\/li>\n<li>Fixed: a location or department name with no letters or numbers is skipped (the import log says so) instead of filing the job under an unrelated place or team.<\/li>\n<li>Fixed: an \"&amp;\" in a location now shows as \"&amp;\" in Google for Jobs data, the REST API, job filters and the Jobs block, and location names over 200 characters save.<\/li>\n<li>Fixed: changing a job's city over the REST API also updates its location, and CSV import keeps backslashes in names, so importing the same file again finds the existing jobs.<\/li>\n<li>Fixed: picking a team on the careers page also shows its sub-teams' roles and roles that list it as a second team, matching the shortcode's department setting.<\/li>\n<li>Fixed: visitors can no longer list departments used only by draft, private, password-protected, expired or sample jobs through the REST API, or read department descriptions there.<\/li>\n<li>Changed: the Departments and Locations screens explain each field in plain words, and saving jobs says \"Job published\" and \"2 jobs updated\" instead of \"Post\".<\/li>\n<\/ul>\n\n<h4>1.2.4<\/h4>\n\n<ul>\n<li>New: Departments and Locations are in the Hiring menu.<\/li>\n<li>Fixed: the importer checks each CV's contents. A PDF or Word file saved under the wrong one of those extensions is kept under its real type; anything else is skipped, and the import log says why.<\/li>\n<li>Fixed: Simple Job Board import no longer adds \"Jobapp Status\" to every application's notes.<\/li>\n<li>Fixed: an interview title longer than 191 characters is shortened to fit. Before, scheduling failed with \"Could not save the interview.\"<\/li>\n<li>Fixed: a note made only of invisible characters says \"The note is empty.\" instead of a generic error.<\/li>\n<li>Fixed: a CSV import, or a CV on Add application, that is larger than the server's upload limit now usually goes back to its form with the \"too large\" message instead of a blank page.<\/li>\n<li>Fixed: if removing all applicant data leaves a CV behind, its folder keeps its protection files.<\/li>\n<li>Fixed: Site Health no longer reports outbound requests as blocked when the site can still reach itself, and names a block_local_requests filter when that is the cause.<\/li>\n<li>Fixed: a job whose title is only invisible characters shows as \"(no title)\" in filters and on the board.<\/li>\n<li>Fixed: the support report lists the modules that are actually running, and a module that fails to load no longer causes a \"translation loading triggered too early\" notice.<\/li>\n<li>Fixed: the Tools screen runs three fewer database queries.<\/li>\n<li>Changed: REST API. A rating outside 0 to 4 is refused, a stale expected rating returns a conflict, an interview created without a length uses the default from your settings, and conflict responses all have the same shape.<\/li>\n<\/ul>","raw_excerpt":"A full applicant tracking system for WordPress: careers page, pipeline, interviews, hire. Self-hosted, with no per-seat fees.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/356189","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=356189"}],"author":[{"embeddable":true,"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/vakanssi"}],"wp:attachment":[{"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=356189"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=356189"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=356189"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=356189"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=356189"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=356189"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}