@extends('admin.layout', ['menuKey' => 'integrations']) @section('title', 'Job Sync') @section('content') @php $pill = fn ($s) => ['active' => 'on', 'paused' => 'wait', 'failing' => 'bad'][$s] ?? 'off'; @endphp
Employers

Job Sync

Verified organizations' own connections: their applicant tracking system, job feeds and the API. Their jobs go on the board as their own posts, in their own words, and follow their system: new jobs appear, changes update, and a job comes down after it's missing from two reads in a row. Connections are read every {{ config('sync.connection_hours') }} hours.

{{ number_format($sources->total()) }}
Connections
{{ number_format($planOrgs->count()) }}
Organizations with a plan
${{ number_format($ai['spent'], 2) }}
Claude this month (filling in job details), of ${{ $ai['budget'] }}
{{ implode(', ', array_column($connectors, 'label')) ?: 'None' }}
Connection kinds installed
@include('partials.errors')

Connections

@if ($sources->isEmpty())

No connections yet.

@else
@foreach ($sources as $s) @endforeach
OrganizationKindStatusJobsLast readApply
{{ $s->organization?->display_name ?? $s->name }}
{{ $s->owner_email }}@if ($s->board) · {{ $s->board }}@endif
{{ $s->kindLabel() }} {{ $s->statusLabel() }}@if (! empty(((array) $s->config)['review_first'])) Jobs reviewed first@endif @if ($s->status_reason)
{{ $s->status_reason }}
@endif
{{ $s->live_count }} live @if ($s->held_count)· {{ $s->held_count }} in review @endif @if ($s->attn_count)· {{ $s->attn_count }} need a fix @endif @if ($s->over_count)· {{ $s->over_count }} over the limit @endif {{ $s->last_success_at?->diffForHumans() ?? 'never' }}
@csrf
@foreach (array_filter(['read' => 'Read now', $s->status === 'paused' ? 'resume' : 'pause' => $s->status === 'paused' ? 'Resume' : 'Pause']) as $a => $label)
@csrf
@endforeach @if (! empty(((array) $s->config)['review_first']))
@csrf
@endif
@csrf
{{ $sources->links() }} @endif

Jobs that need a fix or a free slot

@if ($attn->isEmpty())

None.

@else
@foreach ($attn as $i) @endforeach
OrganizationJobWhy
{{ $i->source?->name }} {{ \Illuminate\Support\Str::limit((string) (($i->raw ?? [])['title'] ?? $i->external_id), 70) }} @if ($i->url)↗@endif {{ $i->reason }}
@csrf
@endif

Systems employers asked for

Careers pages that run on a system Job Sync can't connect to yet, counted each time an employer checks one.

@if ($requests->isEmpty())

None yet.

@else
@foreach ($requests as $rq) @endforeach
SystemTimesOrganizationsLatest
{{ $rq->system }}{{ number_format((int) $rq->total) }}{{ number_format((int) $rq->orgs) }}{{ $rq->latest ? \Illuminate\Support\Carbon::parse($rq->latest)->diffForHumans() : '' }}
@endif
@csrf

Give an organization a Job Sync plan

Organizations normally subscribe on their Job Sync page. A plan given here has no subscription and no charge, and billing never changes it. Organizations paying by subscription are managed in Stripe. Only verified organizations can connect.

@if ($planOrgs->isNotEmpty())

Organizations with a plan

@endif
@csrf

Settings

Claude fills in each synced job's details (title, category, shift…) without changing its words. Well under a cent a job.

Latest reads

@if ($reports->isEmpty())

None yet.

@else
    @foreach ($reports as $r)
  • {{ $r->created_at->diffForHumans() }} · {{ $sourceNames[$r->sync_source_id] ?? '#'.$r->sync_source_id }} · {{ $r->result ?? $r->status }}
  • @endforeach
@endif
@endsection