ATS

Get Offer Details from ATS

Get offer details from any ATS for employee onboarding and Gifting / Swag workflows

Get Offer Details - Knit ATS Integration

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

Built for Scale, Speed,
and Simplicity

Ready to Get Started?
Book a 1-on-1 demo today