Opt a custom bridge into the Promote-to-Bridge migration wizard
The Promote-to-Bridge wizard moves a podcaster’s subscribers from wherever they are now into a membership plugin. Every bridge can be the source of that move — the place people are coming from. Far fewer can be the destination, because receiving subscribers means actually creating member records, and reading a plugin’s data is a much easier job than writing to it.
If you maintain a custom bridge, this is what gets it listed as a destination a podcaster can choose. Without it your bridge can only ever be migrated away from, never to.
When to Use This
Only when your bridge can genuinely create members in the underlying system. If it is a read-only integration — reporting on memberships held somewhere else, or wrapping a service that has no way to add people — leaving it out is the correct outcome, not a gap. A bridge offered as a destination that then cannot create anyone is a worse experience than one that was never offered.
What You Have to Provide
Three answers, and the wizard asks them in this order:
-
Can you import at all? Usually this is just “is the plugin I integrate with actually
installed and active right now”. -
Do you support this particular tier? The podcaster is mapping their tiers onto yours,
and this is where you say whether a given one can be honoured. -
Create this member. The real work — add the person at the tier given. Do not charge
them. These are subscribers who are already paying somewhere else and are being moved, not new customers signing up. Taking a payment here bills people for something they have already bought.
The One Rule
Creating a member who already exists must succeed, not fail. If the person already holds the tier, report success and change nothing. Migrations get retried and resumed after interruptions, so the same person will sometimes be created twice — treating the second attempt as an error turns a normal retry into a failed migration, and treating it as new work gives the podcaster duplicate members.
Code
<?php
use Benecaster\Bridge\BridgeInterface;
use Benecaster\Bridge\BridgeWritable;
class MyPlugin_Bridge implements BridgeInterface, BridgeWritable {
public function can_import(): bool {
return function_exists( 'my_plugin_grant_membership' );
}
public function supports_tier( int $tier_id ): bool {
return $tier_id > 0 && (bool) my_plugin_get_level( $tier_id );
}
public function create_member( string $email, int $user_id, int $tier_id, array $meta = [] ): bool {
if ( ! $this->can_import() || ! $this->supports_tier( $tier_id ) ) {
return false;
}
try {
// Use your plugin's canonical "grant membership" API. Do NOT create
// sham orders / charges — the wizard's grace period handles payment
// re-authorization out-of-band.
return (bool) my_plugin_grant_membership( $user_id, $tier_id, [
'created_via' => 'benecaster_migration',
] );
} catch ( \Throwable $e ) {
return false;
}
}
// ... BridgeInterface methods (get_user_tier, on_subscription_activated, etc.)
}
Need this built rather than just documented? See our services →