@php $__brandName = (string) \App\Models\SystemSetting::get('app_name', config('app.name', 'WaDesk')); @endphp
{{ __('Step 3 of 3 / Plan') }}

{{ __('Pick a') }} {{ __('plan') }}.

{{ __('Each plan includes a monthly message allowance. Start free, or pick a plan to unlock more.') }}

  1. Account
  2. Workspace
  3. 3Plan
{{-- Billing-model explainer (matches the verified plan-first behaviour). --}}
@php $cpm = max(1, (int) \App\Models\SystemSetting::get('credits_per_message', 1)); @endphp {{ __('Your plan includes a set number of messages/month until your plan end date. When the monthly allowance is used up while your plan is active, extra sends use wallet credits at') }} {{ $cpm }} {{ $cpm === 1 ? __('credit') : __('credits') }}/{{ __('message') }}. {{ __('After your plan ends, sending pauses until you renew.') }}
@forelse ($packages as $p) @php $isFree = $p->free || (float) $p->plan_amount === 0.0; $isCustom = $p->is_custom_quote; $hot = $p->is_highlighted; // Mirror /account/plans price handling: convert to the active currency. $amount = $p->plan_amount; if ($p->currency && strtoupper((string) $p->currency) !== strtoupper((string) $currency)) { $amount = \App\Support\FormatSettings::convert( $p->plan_amount, $p->currency, $currency, ); } // Prefer the admin-set offer price when present (the discounted rate). $offer = $p->offer_price; if ( $offer !== null && (float) $offer > 0 && $p->currency && strtoupper((string) $p->currency) !== strtoupper((string) $currency) ) { $offer = \App\Support\FormatSettings::convert($p->offer_price, $p->currency, $currency); } $hasOffer = !$isFree && !$isCustom && $offer !== null && (float) $offer > 0 && (float) $offer < (float) $amount; $priceHuman = $isCustom ? __('Custom') : ($isFree ? __('Free') : \App\Support\FormatSettings::currency($hasOffer ? $offer : $amount)); $wasHuman = $hasOffer ? \App\Support\FormatSettings::currency($amount) : null; // Monthly message allowance: 0 / null = Unlimited. $msgLimit = (int) ($p->monthly_messages_limit ?? 0); $msgHuman = $msgLimit <= 0 ? __('Unlimited') : number_format($msgLimit) . ' ' . __('messages'); // Billing period — "/ month" or "/ 12 months" etc. $unit = trim((string) $p->plan_unit); $duration = (int) ($p->plan_duration ?? 0); $periodHuman = $isFree || $isCustom ? null : trim( ($duration > 1 ? $duration . ' ' : '') . ($unit !== '' ? \Illuminate\Support\Str::plural($unit, max(1, $duration)) : __('month')), ); // A few headline capability flags to surface on the card. $flagMap = [ 'access_analytics' => __('Analytics'), 'autoflow' => __('Automation'), 'access_ai_agents' => __('AI assistants'), 'integration_woocommerce' => __('WooCommerce'), 'integration_shopify' => __('Shopify'), 'access_waba_calling' => __('WhatsApp calling'), 'remove_branding' => __('White-label'), ]; $flags = []; foreach ($flagMap as $col => $label) { if (!empty($p->$col)) { $flags[] = $label; } if (count($flags) >= 3) { break; } } $borderCls = $hot ? 'border-wa-deep ring-2 ring-wa-deep/15' : 'border-paper-200'; $bgCls = $hot ? 'bg-wa-mint/30' : 'bg-paper-0'; // PLAN checkout — same route /account/plans uses. Free / custom plans // route to the free start / sales, never to a paid checkout. if ($isFree) { $href = route('register.plan.skip'); } elseif ($isCustom) { $href = url('/support'); } else { $href = route('user.checkout.show', $p->id); } @endphp @if ($hot) {{ __('MOST POPULAR') }} @endif
{{ $p->pname }}
@if ($p->subtitle)
{{ $p->subtitle }}
@endif
{{ $msgHuman }}{{ $msgLimit > 0 ? ' / ' . __('month') : '' }}
@if (!empty($flags))
@foreach ($flags as $f) {{ $f }} @endforeach
@endif
@if ($wasHuman)
{!! $wasHuman !!}
@endif
{!! $priceHuman !!}
@if ($periodHuman)
/ {{ $periodHuman }}
@endif
@empty
{{ __('No plans configured yet. The admin can add some at') }} /admin/pricing. {{ __('You can still continue free below.') }}
@endforelse
{{ __('Start free / skip for now') }}

{{ __('Need extra sends past your allowance?') }} @if (!empty($creditPackages) && $creditPackages->isNotEmpty()) {{ __('Top up message credits') }} @else {{ __('Top up message credits') }} @endif