Email workspaceAccountant invitation contract
Purpose/audience: The requested email/invite user_email recipient (invited accountant).
Implementation: App\Mail\AccountantInvite. Baseline view: resources/views/emails/users/accountantInvite.blade.php. Usage evidence: app/Http/Controllers/Settings/invitationsController.php:1317 and :1841. These are static references, not proof of current production delivery.
Suggested subject: {{business_name}} invites you to collaborate. HTML title alone does not set the mail header.
Suggested preheader: {{business_name}} invites you to be their accountant on Built.
Portable placeholder contract
| Token | Existing source / derivation | Requirement |
|---|---|---|
| {{logo_url}} | Existing Built app_name PNG | Optional deployment override; the concrete project HTTPS PNG is the default. Approved HTTPS or matching CID only. |
| {{preheader}} | Suggested text above, assembled only from already available values | Required escaped text; not a new backend record or processing guarantee. |
| {{business_name}} | $business->name | Required escaped business identity; do not substitute the recipient name. |
| {{invitation_url}} | $link = config('app.url') + '/confirminvitation/' + encrypt($invite->id) | Required complete trusted application URL; same value in action and visible fallback. |
Content, states and integration decisions
- The invitation relationship is accountant, not an unspecified collaborator. Preserve the visible link, fallback instructions and the existing error/support notice.
- The original view refers to an invite button but only provides a visible link. This design adds a clear Accept accountant invitation button using that same link. This repairs the affordance without creating a new destination or changing acceptance behavior.
- No expiry, approval claim, accountant pairing guarantee or personal greeting is invented. The caller queues this Mailable. Preserve business From and business-email-or-owner Reply-To.
- States: standard and long business/link. Decorative user-invite imagery is omitted; the original Built logo and business identity remain. invite data still belongs to the existing Mailable and is not silently dropped from server-side link generation.
Portable HTML/text and safe handling
ready/accountant-invite.html and ready/accountant-invite.txt provide the portable extracts. Every populated state has matching .html and .txt files under previews/. All sample links are local design explanations; no real invitation, report or account action is executed. Placeholder {{names}} are not automatically Laravel Blade syntax. Convert each mapping explicitly using existing data and server-side URL generation; retain all required values and do not insert untrusted raw HTML.
Escape text and attribute values. Validate any application/CFO AI URL separately against approved HTTPS hosts before escaping it; preserve complete generated links and encrypted/signed parameters. Use the provided concrete public PNG or an approved HTTPS/CID override. There are no hidden optional content sections to populate here; required identities/counts should not be silently omitted. Unsupported data has not been invented.
All drafts use the approved compact transactional shell with 16px body text, a minimal Built footer and native light/dark CSS. Email-client rendering and blocked-image behavior remain separate tests. See integration-notes.html for shared provider/image limitations, and easy-wins-batch.md for the whole batch. No production template, sender, transport or application behavior is changed.