Forms and payments
Connect applications, contact, alerts and posting to a form service, and take payments with Stripe.
How the forms work
Every form validates in the browser, shows an error summary, and posts to an endpoint you configure. Without an endpoint it runs in demo mode: it validates and shows success, but sends nothing.
Copy .env.example to .env and fill in what you use:
| Variable | Form | Body |
|---|---|---|
PUBLIC_APPLY_ENDPOINT |
Job application, with the CV file | multipart |
PUBLIC_CONTACT_ENDPOINT |
Contact page | multipart |
PUBLIC_NEWSLETTER_ENDPOINT |
Weekly roles signup | multipart |
PUBLIC_ALERTS_ENDPOINT |
Saved-search alerts | JSON |
PUBLIC_POST_JOB_ENDPOINT |
Post a job wizard | JSON |
Requests are sent with Accept: application/json, and any 2xx answer counts as success.
On your host, set the same variables in its environment settings: .env is not committed. These values are public URLs, not secrets.
Recipes
Formspree. Create a form and use https://formspree.io/f/<id>. Accepting CV uploads needs a paid Formspree plan.
Web3Forms. Use https://api.web3forms.com/submit and add a hidden access_key input to the forms you connect.
Your own API. Any URL that answers 2xx. The alert and posting bodies are documented in .env.example.
Job alerts
Alerts are saved in the visitor’s browser so the dashboard can list them, and posted to PUBLIC_ALERTS_ENDPOINT with the email, frequency (daily or weekly), the search query string and a readable label. Sending the emails is up to your backend or email tool.
Stripe Payment Links
Take payment for job postings without a server:
- In Stripe, create one product and one Payment Link per plan.
- Set
PUBLIC_STRIPE_LINK_STANDARD,PUBLIC_STRIPE_LINK_FEATUREDandPUBLIC_STRIPE_LINK_TEAM.
After the wizard submits a listing, the employer is sent to the plan’s payment link with prefilled_email and client_reference_id. The reference matches the reference field in the listing sent to PUBLIC_POST_JOB_ENDPOINT, so you can match payments to listings.
Plan prices are shown from PLANS in src/config/site.ts. Keep them in line with your Stripe prices.