Outlook contact groups have no export/API. This is copy-paste, done once per group, with a grid-view paste at the end to avoid adding ~500 rows by hand.
Before touching any members, create all 50 rows in BM Groups (just the group names). This is small enough to do as a single grid-view paste: type your 50 group names into one column in Excel, open BM Groups in the browser, switch to grid view (the grid/pencil icon above the list, or View → "Edit in grid view"), and paste the column straight into the Title column. Set ThursdayBatch to Batch 1 or Batch 2 for the known Thursday groups afterwards — either in grid view, or faster, just use the app's own Manage Groups screen once it's built (pencil icon → pick the batch from the dropdown).
Ctrl+A then Ctrl+C.Name <email@domain>.Name <email>, add two helper columns next to it:
Name: =TRIM(LEFT(A1,FIND("<",A1)-1))
Email: =TRIM(MID(A1,FIND("<",A1)+1,FIND(">",A1)-FIND("<",A1)-1))
GroupName, and fill it down with the exact group name you used in BM Groups.Title for this group./O=EXCHANGE/OU=.../CN=RECIPIENTS/CN=jbloggs123 instead of jbloggs@mod.gov.uk. This happens when Outlook has cached a resolved internal directory entry rather than an SMTP address. These can't be BCC'd or used in Graph as-is. When you spot one, look the person up in the GAL by name and manually type their real SMTP email into that row instead.Build one running Excel sheet with exactly three columns in this order: Title (the person's display name), Email, GroupName. Append each group's cleaned member block underneath the last. By the end you'll have roughly one row per person-per-group — duplicates across different groups are expected and correct (that's the point of the denormalised design).
BM Memberships in the browser, switch to grid view the same way as Step 1.Alternative once the app is built: for each group, copy just its Name+Email columns (from Step 3, no GroupName column needed) and use the app's own Replace membership from paste button on Manage Groups → Manage members instead of the SharePoint grid-view paste. It's scoped to the right group automatically, does its own email validation, and logs the import as a history entry — arguably safer than a single giant 500-row grid paste, just done 50 times instead of once. Either path ends at the same result.