Migration of content
Seems like a bug, but needed to add a complete() function as follows:

class RanchoGroupNewsMigration extends RanchoNodeMigration {
  public function __construct(array $arguments) {
    parent::__construct($arguments);

    // OG Audience field
    $this-&gt;addFieldMapping('og_group_ref', 'og_group_ref')
         -&gt;separator(',')
         -&gt;sourceMigration('RanchoNodeGroup');
    $this-&gt;addFieldMapping('group_access','group_content_access');     

    ...

  }

  protected function query() {
    // Get the default query 
    $query = parent::query();
    $query-&gt;leftJoin('og_ancestry','oga','n.nid = oga.nid');
    $query-&gt;addExpression('GROUP_CONCAT(DISTINCT oga.group_nid)', 'og_group_ref');       
    $query-&gt;addField('oga', 'group_nid', 'group_nid');
    $query-&gt;leftJoin('og_access_post','oa','oa.nid = n.nid');
    $query-&gt;addField('oa','og_public','group_content_access');

    return $query;
  }  

  public function prepareRow($row) {
    if (parent::prepareRow($row) === FALSE) {
      return FALSE;
    } 
    // Seems the access setting is actually the opposite in D7, so we need to
    // toggle the boolean here.
    $row-&gt;group_content_access = !$row-&gt;group_content_access;
    return TRUE;
  }

  public function prepare($node, stdClass $row) {
    // Set og field_mode to 'admin' so we can save this group content despite not being a member of the group.
    // See https://www.drupal.org/node/2399997
    if (!empty($node-&gt;og_group_ref[LANGUAGE_NONE])) {
      foreach($node-&gt;og_group_ref[LANGUAGE_NONE] as $delta =&gt; $value) {
        $node-&gt;og_group_ref[LANGUAGE_NONE][$delta]['field_mode'] = 'admin';
      }
    }
  }

  public function complete($node, stdClass $row) {    
    $values = array(
      'entity_type' =&gt; 'node',
      'entity' =&gt; $node-&gt;nid,
      'state' =&gt; OG_STATE_ACTIVE,
      'membership_type' =&gt; OG_MEMBERSHIP_TYPE_DEFAULT,
      'field_name' =&gt; 'og_group_ref',
    );
    // Update the node
    $group_id = $row-&gt;og_group_ref;
    og_group('node', $group_id, $values);
  }
}


The above works regardless the number of groups the node is assigned to.

Note because this took me quite some time to figure out: the og_access and og_public have the opposite meaning from D6 to D7.