How we built an integration between Drupal and

How we built an integration between Drupal and is one of the biggest global jobs and careers websites and gets a large amount of traffic from job seekers. Most recruitment agencies have a presence on and advertise their jobs on the platform, either on a free tier or by sponsoring jobs to have them appear more prominent on the website.

We recently worked with a recruitment agency who use but wanted to make better use of their own website to display open positions and allow candidates to apply. Although the traffic from was important to them, they wanted to make their own website the main place where they posted jobs, but also have the jobs appear on without duplicating effort. provide a system called Enterprise ATS Integration which includes the ability to provide an XML feed to containing all of your open jobs.

The Extensible Markup Language (XML) is a simple text-based format for representing structured information: documents, data, configuration, books, transactions, invoices, etc. Its basically a way of sending data that a software program can understand.

The Indeed XML feed lists job information that will be displayed on Indeed. By maintaining an XML feed, you have greater control over how jobs are displayed. You can also choose to add the Indeed Apply label to jobs.

Utilising this option, we were able to build a solution that allowed our client to post their jobs to their own website, which are then picked up automatically from an XML feed and added to the website, without having to post the jobs twice in two different places.

The Job Post Data Structure

The first part of the solution was to build a data structure for the job posts on the clients own website which we built for them on the Drupal platform, so they could use a simple form to add a new job. refer to the fields in the job post as "job elements", the table below shows a partial extract of what they expect to receive in the XML feed.

Element Required Description Example value
<title> Yes The title of the job. Do not include other types of information, such as salary, employment type, job location, job descriptions, copies, or headlines. <![CDATA[Sales Executive]]>
<date> Yes The date on which this job was first published.
Note: If the publish date is posted on your site, the date on the site must match what's in the XML.
<![CDATA[Fri, 19 Dec 2014 22:49:39 GMT]]>
<referencenumber> Yes A unique identifying number for this instance of the job. Indeed uses this element to identify each job. The same job posted in multiple locations must have a unique value for this element. Do not change the number once you've set it. <![CDATA[unique123131]]>
<requisitionid> Yes The requisition id for a job (formerly `external job ID`). Your system likely uses it to track the original role and its applicants. Might be the identifier that shows up on your public-facing career page.
Must be the same for each posting of a job across different feeds and different locations. Might not be unique.
<apijobid> No The job id used when performing API calls to your ATS. Only provide a value for this element when <apijobid> is different from <requisitionid>. <![CDATA[ab1212]]>
<url> Yes The URL for this job listing on your site. Use the URL for the job description page, not the application page. Include the source=Indeed token to track clicks from Indeed. <![CDATA[

There are quite a few more fields than listed above, not all of the fields are required, but some are mandatory.

We built a custom content type on Drupal that closely matches what require, these are mostly fields you would expect to see in any job post.

Drupal is prefect for building custom content types like this with its very flexible and robust entity and fields system.

One of the requirements was to have a job automatically disappear from both the clients jobs page on their own website, and also from the XML feed once the closing date for the jobs has passed. We achieved this using a Drupal module called Scheduler which allowed the client to choose a date to "unpublish" the job, and therefore remove it from all listings.

Another requirement from our client was to be able to add salary ranges as both monthly and per hour, as well as in both GBP and EUR currencies. To do this in an elegant and user friendly way we used the Conditional Fields module, so when the client chooses a particular currency or salary frequency, the relevant input fields are displayed, instead of creating different job posting content types for each scenario.

The XML Feed

The next part of the solution was generating the actual XML feed from the clients website that would contain the data for the jobs.

Drupal has a very powerful component called Views which is perfect for listing data from a Drupal website in whatever way you need to.

Out of the box, Views does not provide any capability to generate an XML feed, so we utilised another additional Drupal module called XML Feed Views which gave us control over exactly how the XML feed would be generated.

We then added all of the relevant fields into the view and wrote the custom XML around the field placeholders based on the Indeed developer documentation. The end result was an XML feed matching the required specification, containing all of the open jobs on the clients own website.

The XML feed is accessed at a specific URL (link) on the clients website, and we simply provide this URL to the account manager who adds it to their system. Once reviewed and accepted, the URL is automatically checked every 3 hours for new jobs.

The Job Application Process

The XML feed provided to must contain a link to the clients website to allow an applicant to apply for the job (if you don't want to use Indeed Apply, which processes the application on instead).

Our client wanted to take control of the applications on their own website, so we needed to build a way for an applicant to apply for a job.

Using the Drupal Webform module we built custom application forms which are specific to each job and appear below the job description. This form contains the following fields:

  • Name
  • Email address
  • Cover letter
  • CV upload

The applicant simply fills out the form and uploads their CV from their computer and clicks submit. A notification email is then sent to our clients administrative staff informing them that someone has applied. Webform is a very powerful module and allows staff to view submissions in an administrative area of the clients website as well as the ability to flag submissions and add notes, these features are very useful for screening candidates etc and are essentialy a very basic applicant tracking system (ATS).

A CV contains personal details so we were very mindful of the requirement for robust security around handling these files. Drupal provides the facility to store private files which can not be accessed on the website publicly. The solution we built requires the client to log into the website using a user account with sufficient permissions in order to access the CV documents.

The private file system stores files outside of the folder structure which is accessible over the web, so these files are always protected behind a login system.


Drupal is an ideal platform to build a solution like this, and using some additional modules along with studying the developer documentation allowed use to build a system which achieved the clients aims of using their own website as the main source of job postings, but also harnessing the marketing power of to direct applicants to their own website, without duplication of effort and posting jobs twice in two different places.

If you run a recruitment agency, or even just a business that uses a lot, and you are interested in having a similar solution built for your company, get in touch.

Subscribe to stay informed

* indicates required