@extends('layouts.app') @section('title', 'Job Sync | '.$org->display_name.' | healthcareers.app') @section('robots', 'noindex, nofollow') @php $pill = fn ($s) => ['active' => 'on', 'paused' => 'wait', 'failing' => 'bad'][$s] ?? 'off'; $itemPill = ['live' => 'on', 'held' => 'wait', 'pending' => 'wait', 'attn' => 'bad', 'over' => 'wait']; @endphp @section('content')
{{ $org->display_name }}

Job Sync

Connect your applicant tracking system or a job feed once. New openings post here on their own, filled jobs come down on their own, and edits flow through. · Organization · My posts

@if (! $blocker)
{{ $sources->isEmpty() ? 'Connect your jobs' : 'Add a connection' }}
@endif
@include('partials.errors') @if ($blocker && ! $verified)

Verify {{ $org->display_name }} first

Job Sync can post many jobs at once, so it's only open to verified organizations. Verification takes one of a company email, a DNS record or a small file on your website, and then a quick review by our team.

Verify your organization

@elseif ($blocker)

Job Sync needs a plan

Posting jobs by hand stays free. Job Sync is a monthly plan for verified organizations: we keep your jobs in step with your hiring system so your team doesn't have to.

@foreach ($offers as $o)
@csrf

{{ $o['name'] }}

{{ $o['summary'] }}

{{ $o['label'] }}

@if ($o['launch'])

Launch price for Charter and Founding employers, locked for {{ $o['months'] }} months from when you subscribe.

@endif
@endforeach

Billed monthly by card. Change plan any time (the difference is prorated), or cancel and it runs to the end of the month you paid for. Questions? Contact us.

@endif @if (\App\Services\Sync\Connections::hasPlan($org) && ! $org->logo_path && $org->canUploadLogo())
Your plan includes your logo on every synced job. Add your logo on your organization page.
@endif @if ($billing['source'] === 'subscription') @php $next = $billing['next']; @endphp

Your plan: {{ $billing['plan']['name'] ?? 'Job Sync' }} {{ $billing['status_label'] }}

@if ($billing['paused'])
Syncing is paused because a payment is overdue. Your jobs stay up as they are. Update your card and the bill is paid and syncing resumes straight away.
@elseif ($billing['status'] === 'past_due')
Your last payment didn't go through. Update your card by {{ $billing['grace_ends']?->timezone('America/New_York')->format('F j') }} to keep your jobs syncing. After that, syncing pauses until the bill is paid.
@endif

@if ($billing['status'] === 'canceling') Ends on {{ $org->sync_period_end?->timezone('America/New_York')->format('F j, Y') }}. Until then everything keeps syncing; after that your synced jobs come down. You won't be charged again. @elseif ($next) Next charge {{ \App\Support\Pricing::money($next[1]) }} on {{ $next[0]->timezone('America/New_York')->format('F j, Y') }}. @endif @if ($billing['launch_until'] && $billing['status'] !== 'canceling') Launch price until {{ $billing['launch_until']->timezone('America/New_York')->format('F j, Y') }}, then {{ \App\Support\Pricing::money((int) $org->sync_price_cents) }} a month. @endif

@if ($billing['status'] === 'canceling')
@csrf
@else @foreach ($otherPlans as $o)
@csrf
@endforeach @endif
@csrf
Invoices and receipts @if ($billing['status'] !== 'canceling')
@csrf
@endif
@elseif ($billing['source'] === 'admin')

Plan: {{ $billing['plan']['name'] ?? $org->sync_plan }}, set up by our team{{ $org->sync_until ? ' until '.$org->sync_until->timezone('America/New_York')->format('F j, Y') : '' }}. Contact us to change it.

@endif @if ($sources->isEmpty() && ! $blocker)

Nothing connected yet. Paste your careers page and we'll find the system behind it.

Connect your jobs

@endif @foreach ($sources as $s) @php $c = $counts[$s->id]; $limit = $s->slot_limit ?? $org->sync_slots; $used = $c['live'] + $c['held']; @endphp

{{ $s->kindLabel() }}@if ($s->board) · {{ $s->board }}@endif {{ $s->status === 'active' ? 'Syncing' : $s->statusLabel() }}

@if ($s->status_reason)

{{ $s->status_reason }}

@endif

{{ $c['live'] }} live @if ($c['held']) · {{ $c['held'] }} waiting for our review @endif · {{ $c['attn'] }} {{ $c['attn'] === 1 ? 'needs' : 'need' }} a fix @if ($c['over']) · {{ $c['over'] }} over your job limit @endif @if ($c['pending']) · {{ $c['pending'] }} being prepared @endif

{{ $limit === null ? 'No job limit' : $used.' of '.$limit.' job slots used' }} · Last read {{ $s->last_visit_at?->diffForHumans() ?? 'not yet' }}@if ($s->last_visit_at && $s->last_success_at && $s->last_success_at->lt($s->last_visit_at)) (last good read {{ $s->last_success_at->diffForHumans() }})@endif @if ($s->status === 'active' && $s->next_visit_at) · next {{ $s->next_visit_at->isPast() ? 'any minute' : $s->next_visit_at->diffForHumans() }}@endif · posted as {{ $s->owner_email }}

@if ($s->status !== 'paused')
@csrf
@csrf
@else
@csrf
@endif Jobs
@csrf
@csrf
@php $owners = array_values(array_unique(array_merge([\Illuminate\Support\Str::lower((string) $s->owner_email)], $ownerChoices))); @endphp
@csrf

You, or a confirmed owner, admin or recruiter on {{ $org->display_name }}. Its synced jobs are posted as this person.

@endforeach @if ($sources->isNotEmpty())

Last 30 days

Synced jobs live now{{ number_format($liveSynced) }}
Apply clicks to your site{{ number_format($applyClicks) }}
Jobs closed by sync{{ number_format($closed30) }}

Apply clicks count candidates who left for your site from a synced job. We can't see whether they finished applying there.

Needs a fix

@if ($attn->isEmpty())

Nothing. Every job we read is up, or on its way.

@else

These jobs wait; the rest are live. Fix them in your system and they come through at the next read.

@foreach ($attn as $i) @endforeach
JobWhat's needed
{{ \Illuminate\Support\Str::limit((string) (((array) $i->raw)['title'] ?? $i->external_id), 80) }} @if ($i->url)
Open in {{ $i->source?->kindLabel() }}@endif
{{ $i->reason }}
@endif

Recent changes

@if ($reports->isEmpty() && $changes->isEmpty())

Nothing yet.

@else @if ($reports->isNotEmpty()) @endif @if ($changes->isNotEmpty())
@foreach ($changes as $i) @php $d = \App\Services\Sync\SyncEngine::describe($i); @endphp @endforeach
JobNowWhen
@if ($d['url']){{ \Illuminate\Support\Str::limit((string) (((array) $i->raw)['title'] ?? $i->external_id), 80) }}@else{{ \Illuminate\Support\Str::limit((string) (((array) $i->raw)['title'] ?? $i->external_id), 80) }}@endif {{ $d['label'] }}@if ($i->reason && $i->state !== 'live')
{{ $i->reason }}@endif
{{ $i->updated_at?->diffForHumans() }}
@endif @endif

Synced jobs are changed in your own system, not here: anything edited on healthcareers.app would be replaced at the next read.

@endif
@endsection