Integrating with Indeed

by Mike Ryan — 15 March 2022

We’re excited to announce we’ve recently integrated with Indeed via their Sponsored Jobs Integration. This allows our users to advertise their jobs on Indeed directly from Fountain, using our platform to allocate money to promote these jobs, receive applicants, review the performance of their job campaigns, and pay for the campaigns.

A recent internal survey of our customers found Indeed to be the most used resource for finding candidates, while a Fountain survey of job applicants found Indeed to be the most popular place to look for jobs.

This blog post provides a high-level outline of our technical approach to this integration. We hope this will be useful to engineers and product managers interested in integrating with Indeed or how we work at Fountain. For more information on the business aspects of the integration, please see this blog post.

Below, we break the integration down into six phases or components: Publishing Jobs Via an XML Feed; Exposing an API Endpoint for Receiving Indeed Apply Applicants; Publishing Campaigns; Retrieving Campaign Statistics from Indeed; Billing; and Monitoring.

1. Publishing Jobs Via an XML Feed

Indeed has useful documentation on how to publish an XML feed to let them know about the jobs you are advertising on your site.

We have a dedicated microservice that receives jobs and renders them in XML or JSON with fields and formatting specific to various external partners, one of which is Indeed. For the integration, Indeed needed to take a closer look at our XML feed to approve it for auto source claiming, a feature that makes it easier to connect campaigns to jobs in the XML feed.

One fix we had to make was to ensure the URL for a job in our XML points to a page whose description matches the description we have in the XML. We also had some escaped HTML characters in our job descriptions and titles, and we had to make a second fix to ensure these were unescaped. (These criteria are noted in Indeed’s XML documentation.)

2. Exposing an API Endpoint for Receiving Indeed Apply Applicants

Indeed has a feature called Indeed Apply that allows applicants to apply directly from Indeed, with applicant data sent to an API endpoint you specify.

Indeed provides an XML testing tool that made it easy to ensure that this was working correctly, particularly verification of the post data’s signed header. A job’s Indeed Apply URL is included in its XML entry. Indeed’s documentation on this can be found here.

Applicants can arrive in Fountain via several channels, so we attribute applicants created via this API as Indeed-sourced applicants.

3. Publishing Campaigns

To implement this component and the rest of the components, it’s necessary to have ‘master account’ credentials for the Sponsored Jobs Integration, and crucial to have a good understanding of the Sponsored Jobs API.

A campaign can target any number of jobs and can include jobs according to the same sorts of filters one would use to search for them. For our purposes, we have a single campaign corresponding to a single job, as specified by the job’s reference number in the XML.

Each customer posting a campaign must have a subaccount connected to the master account. Our process is to ensure that a company’s subaccount exists when they create a campaign; we create the subaccount for their first campaign, save the subaccount data, and reuse it for subsequent campaigns.

4. Retrieving Campaign Statistics from Indeed

Retrieval of statistics is important because it gives clients insight into how their campaigns are performing in terms of total spend and number of applicants. Indeed has an API that returns the dates for which statistics are available for a campaign, and an API that returns statistics for each of these dates. We use two scheduled jobs to retrieve statistics: one that runs daily and retrieves statistics data for completed days and another that runs every six hours and retrieves statistics for the current day. We make this data available to users in a dashboard (see below).

Fountain Campaign Dashboard

5. Billing

A campaign’s final cost cannot be known in advance as it depends on how Indeed chooses to promote the campaign and how many candidates interact with it on their site. We bill our clients once per month for all their Indeed campaigns, and use the statistics data described above as the basis.

6. Monitoring

It is important to have visibility about whether campaigns are promoting jobs as expected. For this, we use the Indeed Sponsored Jobs Integration’s ‘jobCount’ endpoint, which reports the number of jobs associated with a campaign. We expect every campaign to have a job count of exactly one after allowing Indeed enough time to retrieve the job from the XML and process it.

Indeed retrieves our XML roughly every six hours, and can take up to an hour to process a job. We allow for two XML retrieval intervals plus the processing time (2 x 6 hours + 1 hour = 13 hours) before we consider it a problem for a job to still have a job count of zero, and have a scheduled task set up to check for such campaigns.

We’ve gotten very positive feedback about the Indeed integration, with many clients reporting that it has provided them with a surge of new applicants and has drastically lowered their average cost-per-applicant. Indeed was a good partner throughout the development process, providing us with comprehensive documentation and answering technical questions. We hope this overview is useful to you if you are considering integrating with Indeed or working with Fountain.