This is a Next.js project bootstrapped with webflow cloud init.
Create a .env (based on .env.example) with:
# Pipedrive
PIPEDRIVE_X_API_TOKEN=...
PIPEDRIVE_DEFAULT_USER_ID=...
# Google Sheets (fallback for @gmail.com submissions)
GMAIL_CONTACT_SPREADSHEET_ID=...
GMAIL_CONTACT_SPREADSHEET_RANGE=Sheet1!A:D
GOOGLE_SERVICE_CLIENT_EMAIL=...
GOOGLE_SERVICE_PRIVATE_KEY_2=...
# CORS
ALLOWED_ORIGINS=https://your-site.webflow.io,https://your-domain.com
# Teamtailor (for /api/get-job-offers)
TEAMTAILOR_API_KEY=...
TEAMTAILOR_COMPANY_CUSTOM_FIELD_API_ID=... # optional, needed for company filtering
# Optional — Teamtailor /v1/jobs list filters (see https://docs.teamtailor.com/ )
# Defaults on Teamtailor’s side: filter[status]=published, filter[feed]=public.
# Use when jobs are internal-only, unlisted, etc. (may require an Internal-scoped API key).
# TEAMTAILOR_JOBS_FILTER_STATUS=published
# TEAMTAILOR_JOBS_FILTER_FEED=publicFirst, run the development server:
npm run devOpen http://localhost:3000 with your browser to see the result.
You can start editing the page by modifying app/page.tsx. The page auto-updates as you edit the file.
You can deploy your app by running webflow cloud deploy.
POST /api/submit-contact-formGET /api/get-pipedrive-user?userId=123GET /api/calendar?to=123GET /api/get-job-offers?company=kaiko
GET /api/get-job-offers returns:
{
"count": 0,
"hasOffers": false,
"offers": []
}When no company query is provided, it returns all offers.
To verify the Webflow UI wiring without calling Teamtailor, load the careers page with:
?mockJobs=1
Example:
https://<your-webflow-domain>/careers?mockJobs=1
When mockJobs=1 is present, public/job-offers.js renders mock offers (2 roles) so you can confirm:
- tabs appear
- job rows clone/render correctly
- “no offers” state behavior
When testing the real API response, you can filter jobs by company:
GET https://<your-cloud-domain>/app/api/get-job-offers?company=kaiko
Notes:
companymatches the optional Teamtailor custom field value (TEAMTAILOR_COMPANY_CUSTOM_FIELD_API_ID)- if
companyis omitted, the API returns every offer from Teamtailor (no company filter)
This repo now includes public/job-offers.js to render offers in Webflow only when offers are available.
Expected markup:
<div data-job-offers-wrapper data-company="kaiko" style="display:none;">
<template data-job-offer-template>
<a data-job-offer-item data-job-link href="#">
<span data-job-position></span>
<span data-job-title></span>
<span data-job-salary></span>
</a>
</template>
<div data-job-offers-list></div>
</div>
<div data-job-offers-empty style="display:none;">
No open roles right now.
</div>Then include:
<script src="https://<your-cloud-domain>/job-offers.js"></script>