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.
Related
- MembershipService — Method reference
- Status and periods — Status field semantics
- Custom plugins — Implement custom term logic