ATS
Get Offer Details from ATS
Get offer details from any ATS for employee onboarding and Gifting / Swag workflows
Get Offer Details from ATS
Implementation: Sync Offer Data and Trigger Welcome Gifts
Step 1: Sync Application Offers Data from ATS
Use Knit's Sync API to pull application and offer data from any connected ATS platform. Subscribe to application_offers model (part of ats_applications data type) to receive offer status changes, acceptance events, and candidate start date information.
API Endpoint: POST https://api.getknit.dev/v1.0/sync.start
// Initialize sync for ATS application offers
const initializeATSSync = async (integrationId) => {
const response = await fetch('https://api.getknit.dev/v1.0/sync.start', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_API_KEY',
'x-knit-integration-id': integrationId
},
body: JSON.stringify({
data_type: 'ats_applications',
models: ['application_info', 'application_offers', 'application_jobs'],
honorScheduler: true
})
});
return await response.json();
};
// Webhook endpoint receives synced ATS data
app.post('/webhooks/knit/ats-sync', (req, res) => {
const { event, data, model } = req.body;
// Focus on offer-related events
if (model === 'application_offers') {
if (event === 'record.new' || event === 'record.updated') {
processOfferUpdate(data);
}
}
res.status(200).send('Received');
});
// Process offer data and detect acceptances
const processOfferUpdate = async (offerData) => {
const offer = {
offerId: offerData.id,
applicationId: offerData.applicationId,
status: offerData.status,
startDate: offerData.startDate,
hireDate: offerData.hireDate,
offerDate: offerData.offerDate,
sentAt: offerData.sentAt,
closedAt: offerData.closedAt
};
// Detect offer acceptance
if (offer.status === 'SIGNED') {
await handleOfferAcceptance(offer);
}
};
Step 2: Filter for Accepted Offers and Extract Candidate Details
Process offer status updates to identify accepted offers (status: "SIGNED"), then extract all relevant candidate information needed for gift fulfillment—name, shipping address, start date, role details, and personalization preferences.
// Handle offer acceptance event
const handleOfferAcceptance = async (offer) => {
// Fetch related candidate and job information
const application = await getCandidateApplication(offer.applicationId);
const candidate = application.candidate;
const job = application.job;
// Create new hire record
const newHire = {
offerId: offer.offerId,
candidateId: candidate.id,
firstName: candidate.firstName,
lastName: candidate.lastName,
email: candidate.email,
phone: candidate.phone,
address: {
street: candidate.address?.street,
city: candidate.address?.city,
state: candidate.address?.state,
postalCode: candidate.address?.postalCode,
country: candidate.address?.country
},
jobTitle: job.title,
department: job.department,
hiringManager: job.hiringManager,
location: job.location,
startDate: offer.startDate,
offerAcceptedAt: offer.closedAt || new Date(),
employmentType: job.employmentType
};
// Store new hire information
await storeNewHireRecord(newHire);
// Trigger welcome gift workflow
await triggerWelcomeGift(newHire);
// Notify talent acquisition team
await notifyTATeam({
candidateName: `${newHire.firstName} ${newHire.lastName}`,
jobTitle: newHire.jobTitle,
startDate: newHire.startDate,
welcomeGiftTriggered: true
});
};
Step 3: Trigger Welcome Gift Workflow with Delivery Timed Before Start Date
Once an offer is accepted and gift package determined, initiate the fulfillment workflow. Handle shipping logistics, personalization, approval routing (if required), and delivery tracking to ensure gifts arrive before the new hire's start date.
// Trigger welcome gift workflow for accepted offers
const triggerWelcomeGift = async (newHire) => {
// Calculate optimal gift delivery date (3-5 days before start)
const deliveryDate = calculateDeliveryDate(newHire.startDate);
// Determine gift package based on role and department
const giftPackage = determineWelcomeGiftPackage(newHire);
// Create gift workflow
const welcomeGiftWorkflow = {
workflowType: 'new_hire_welcome',
recipientId: newHire.candidateId,
offerId: newHire.offerId,
recipientName: `${newHire.firstName} ${newHire.lastName}`,
recipientEmail: newHire.email,
recipientPhone: newHire.phone,
shippingAddress: newHire.address,
jobTitle: newHire.jobTitle,
department: newHire.department,
hiringManager: newHire.hiringManager,
startDate: newHire.startDate,
targetDeliveryDate: deliveryDate,
giftPackage: giftPackage,
budgetTier: giftPackage.budgetTier,
approvalRequired: giftPackage.requiresApproval,
personalizedMessage: generateWelcomeMessage(newHire),
status: giftPackage.requiresApproval ? 'pending_approval' : 'approved',
createdAt: new Date()
};
// Store gift workflow
await storeGiftWorkflow(welcomeGiftWorkflow);
// If approval required, notify hiring manager
if (giftPackage.requiresApproval) {
await notifyHiringManager(welcomeGiftWorkflow);
} else {
// Auto-approve and proceed to fulfillment
await initiateGiftFulfillment(welcomeGiftWorkflow);
}
};
// Determine gift package based on role and department
const determineWelcomeGiftPackage = (newHire) => {
// Executive packages
if (isExecutiveRole(newHire.jobTitle)) {
return {
type: 'executive_premium',
name: 'Executive Welcome Experience',
budgetTier: 'premium',
budgetRange: '$300-500',
items: [
'Premium branded welcome box',
'Personalized letter from CEO',
'High-end company merchandise',
'Local experience voucher',
'Executive onboarding guide'
],
requiresApproval: true,
estimatedDeliveryDays: 3
};
}
// Engineering packages
if (newHire.department === 'Engineering' || newHire.department === 'Product') {
return {
type: 'engineering_toolkit',
name: 'Developer Welcome Kit',
budgetTier: 'standard_plus',
budgetRange: '$100-150',
items: [
'Company-branded laptop stickers',
'High-quality mechanical keyboard',
'Developer swag bundle',
'Technical book selection',
'Welcome guide with tech stack overview'
],
requiresApproval: false,
estimatedDeliveryDays: 3
};
}
// Standard package for all other roles
return {
type: 'standard_welcome',
name: 'New Hire Welcome Kit',
budgetTier: 'standard',
budgetRange: '$50-75',
items: [
'Company-branded welcome box',
'Essential company swag',
'Welcome letter',
'Employee handbook',
'First-week onboarding guide'
],
requiresApproval: false,
estimatedDeliveryDays: 3
};
};
Key Data Models and APIs
Knit provides unified access to candidate offer data across 18+ ATS platforms through standardized data models:
| Data Model / API | Description |
|---|---|
application_offers |
Offer records associated with applications, including id (unique offer identifier), status (IN_PROGRESS, SIGNED, DENIED, DEPRECATED, NOT_SPECIFIED), startDate (employment start date for delivery timing), hireDate, offerDate, sentAt, closedAt (acceptance timestamp). |
application_info |
Core application details linking offers to candidates and jobs. Includes application stage, status, and timestamps. Use to connect accepted offers to candidate profiles and job details. |
application_candidates |
Candidate profile data including firstName, lastName, email, phone, and address (street, city, state, postalCode, country). Essential for gift personalization and shipping fulfillment. |
application_jobs |
Job details including title, department, location, hiringManager, and employmentType. Use to personalize welcome gifts based on role, department, and seniority level. |
POST /v1.0/sync.start |
Initiates data synchronization for ATS applications and offers. Specify data_type: "ats_applications" and include application_offers, application_info, application_candidates, and application_jobs models for complete new hire data. |
| Webhook Events | Receive record.new events when offers are created and record.updated events when offer status changes from IN_PROGRESS to SIGNED. Real-time webhooks enable same-day welcome gift triggering. |
| Offer Status Enum | Standardized across all ATS platforms: SIGNED indicates acceptance (trigger gifts), DENIED indicates rejection, IN_PROGRESS indicates pending decision, DEPRECATED indicates offer withdrawn. |
Wrapping Up: Create Memorable Pre-Boarding Experiences
Automating new hire welcome gifts through ATS offer acceptance data transforms gifting platforms from reactive onboarding tools into proactive pre-boarding experience engines. No more waiting for HR to notify your team about accepted offers, no more missed delivery windows, no more new hires starting without welcome kits. With Knit's unified ATS data sync, your platform detects offer acceptances in real-time and triggers timely welcome gifts that arrive before day one—creating memorable first impressions that reduce drop-off and accelerate new hire engagement.
Key capabilities unlocked:
- Unified API for 18+ ATS Platforms: Connect once to Knit, sync offer acceptance data from Greenhouse, Lever, Workable, Ashby, BambooHR, and more without building individual integrations
- Real-Time Offer Acceptance Detection: Receive instant webhook notifications when candidates accept offers (status changes to SIGNED), enabling same-day welcome gift workflows
- Standardized Offer Status Tracking: Knit normalizes offer statuses across ATS platforms into consistent enum values, eliminating complexity of tracking different status conventions
- Complete Candidate Data Sync: Access not just offer status, but complete candidate profiles including shipping addresses, contact information, and job details
- Role-Based Gift Personalization: Automatically determine appropriate welcome gift packages based on job title, department, and seniority level from ATS data