Activity being completed on a prospect (e.g. calls, emails, meetings) sync to Salesforce but do not appear as related activity under the Salesforce opportunity.
The first step in resolving this issue, assuming that the Opportunity object is already synced properly, is making sure that you have your Opportunity Contact Role object synced up to Outreach. To do this, navigate to your CRM settings and click on the Opportunity Contact Role object.
Clicking into the Opportunity Contact Role option, Inbound Create and Update should be enabled if you want any new contact roles from Salesforce to pull into Outreach, or any updates to reflect in Outreach, as well.
The standard field mappings are shown below.
You will likely want to make sure you can easily bring them into Outreach but you may not want it to be automatic. In that case, select the Polling frequency of "Only when synced manually".
Next, click on the Validations option in the System Config menu on the left and click the 'Add validation rule' button.
As shown above, the Type is Prospect role and the Field is Role. After clicking Next, you can either manually add each Opportunity Contact Role, or click the Poll button to bring them in from Salesforce. Remember that each role needs to match exactly to the one in Salesforce.
Click Save and you're done! Any new activity completed in Outreach will sync to Salesforce, as normal, but it will also be added as related activity under the opportunity.
While there may be outlier causes, the primary cause is that the opportunity contact role is not mapped to the Prospect role validation in Outreach.