Skip to content

Programmatic examples

Quick reference for using the CRM Membership API in custom modules. Assumes CRM Contact entities already exist.

Check membership

$membership_service = \Drupal::service('crm_membership.service');
$is_member = $membership_service->isMember($contact, $target);

isMember() queries status = active memberships, checks term plugin activity (including grace), indirect periods, and dispatches IS_MEMBER for subscribers. See MembershipService.

Load memberships for a contact

$memberships = \Drupal::service('crm_membership.service')->getMemberships($contact);
// Array of Membership entities keyed by ID; status = active only.

Create a membership type

$type = \Drupal::entityTypeManager()
  ->getStorage('crm_membership_type')
  ->create([
    'id' => 'annual',
    'label' => 'Annual member',
    'membership_term' => 'fixed_duration',
    'membership_term_config' => [
      'duration' => 'P1Y',
      'grace_period' => 30,
    ],
  ]);
$type->save();

Create and activate a membership

$storage = \Drupal::entityTypeManager()->getStorage('crm_membership');

$membership = $storage->create([
  'type' => 'annual',
  'contacts' => [$contact],
  'target_contact' => $organization,
]);
$membership->save();

// Activation creates the first period(s).
$membership->getMembershipTerm()?->activate();

When using the admin form, activation happens automatically on first save (MembershipForm::save()).

Renew programmatically

$membership->getMembershipTerm()?->renew();

Equivalent to the renew admin form’s save handler.

Expire programmatically

$membership->getMembershipTerm()?->expire();

Same path the queue worker uses after cron enqueues the membership.

Cancel programmatically

$membership->getMembershipTerm()?->cancel();

No admin UI calls cancel() — use for custom cancellation workflows.

Override dates before activate/renew

When the plugin allows overrides:

$term = $membership->getMembershipTerm();
$term->setStartDate(new \Drupal\Core\Datetime\DrupalDateTime('2026-01-01'));
$term->setEndDate(new \Drupal\Core\Datetime\DrupalDateTime('2026-12-31'));
$term->activate();

Subscribe to IS_MEMBER event

See Events for a full EventSubscriber example.