offload-project/
laravel-invite-only
g4t.io

Laravel Invite Only Adds a Full User Invitation System with Tokens, Events, and Reminders

74 stars by Yannick Lyn Fatt

A Laravel package for managing user invitations with polymorphic relationships, token-based access, scheduled reminders, and event-driven notifications.

README from offload-project/laravel-invite-only Open on GitHub →

Laravel Invite Only

Latest Version on Packagist Tests Build Total Downloads License: MIT

A Laravel package for managing user invitations with polymorphic relationships, token-based access, scheduled reminders, and event-driven notifications.

Features

  • Polymorphic invitations - Invite users to any model (teams, organizations, projects)
  • Bulk invitations - Invite multiple users at once with partial failure handling
  • Token-based secure links - Shareable invitation URLs with secure tokens
  • Status tracking - Pending, accepted, declined, expired, and cancelled states
  • Automatic reminders - Scheduled reminder emails for pending invitations
  • Event-driven - Events fired for all invitation lifecycle changes
  • Translatable notifications - All notification messages customizable via language files
  • Structured exceptions - Error codes and resolution hints for easy debugging

Table of Contents

Requirements

  • PHP 8.2+
  • Laravel 11/12/13

Installation

composer require offload-project/laravel-invite-only

php artisan vendor:publish --tag="invite-only-config"
php artisan vendor:publish --tag="invite-only-migrations"
php artisan migrate

Quick Start

1. Add Traits

// Team.php (or any model that can have invitations)
use OffloadProject\InviteOnly\Traits\HasInvitations;

class Team extends Model
{
    use HasInvitations;
}
// User.php
use OffloadProject\InviteOnly\Traits\CanBeInvited;

class User extends Authenticatable
{
    use CanBeInvited;
}

If a model both sends and receives invitations (e.g. user-to-user friend invitations), apply both traits. The two traits each define an acceptedInvitations() method, so use PHP's trait conflict resolution:

use OffloadProject\InviteOnly\Traits\CanBeInvited;
use OffloadProject\InviteOnly\Traits\HasInvitations;

class User extends Authenticatable
{
    use HasInvitations, CanBeInvited {
        CanBeInvited::acceptedInvitations insteadof HasInvitations;
        HasInvitations::acceptedInvitations as acceptedInvitationsToModel;
    }
}

In v3.0 the HasInvitations::acceptedInvitations() helper will be removed in favour of getAcceptedInvitations(), eliminating the conflict — at which point the insteadof/as clauses can be dropped.

2. Send Invitations

// Single invitation
$team->invite('user@example.com', [
    'role' => 'member',
    'invited_by' => auth()->user(),
]);

// Bulk invitations
$result = $team->inviteMany(
    ['one@example.com', 'two@example.com', 'three@example.com'],
    ['role' => 'member', 'invited_by' => auth()->user()]
);

$result->successful;  // Collection of created invitations
$result->failed;      // Collection of failures with reasons

3. Handle Acceptance

use OffloadProject\InviteOnly\Events\InvitationAccepted;

Event::listen(InvitationAccepted::class, function ($event) {
    $team = $event->invitation->invitable;
    $user = $event->user;
    $role = $event->invitation->role;

    $team->users()->attach($user->id, ['role' => $role]);
});

4. Schedule Reminders (Optional)

// routes/console.php
Schedule::command('invite-only:send-reminders --mark-expired')->daily();

Full Documentation

How-To Guides

AI Coding Assistant Skill

This package ships a Laravel Boost skill so coding assistants (Claude Code, Cursor, etc.) follow the package's conventions when generating code. Install it in your app with:

php artisan boost:add-skill offload-project/laravel-invite-only

The skill source lives at skills/SKILL.md.

Testing

composer test

Contributing

Contributions are welcome! Please see the documents below before getting started.

Security

License

The MIT License (MIT). Please see License File for more information.

More from the ecosystem

marcreichel/
laya-php
g4t.io
3 53

LayaPHP: Self-Hosted Text Classification for PHP and Laravel

Classify text in PHP without an LLM bill: typed decisions in 100+ languages, self-hosted. Laravel-ready SDK for Laya, a Jev AI alternative.

ai classification decision-engine
marcreichel/laya-php via Laravel News
Josh-Dovey/
postcodes-laravel
g4t.io
5 9

Postcodes for Laravel: GB Postcode Lookup and Geography Data

Postcodes for Laravel adds typed GB postcode lookups, validation, geography data, distance searches, and test fakes through the GB Postcodes API.

Josh-Dovey/postcodes-laravel via Laravel News
RedberryProducts/
mailbox-for-laravel
g4t.io
4 115

Mailbox for Laravel: Preview and Test Rendered Email

Mailbox for Laravel captures outgoing mail in a local dashboard and lets you test rendered HTML, recipients, and attachments with fluent assertions.

RedberryProducts/mailbox-for-laravel via Laravel News