This is a choice the development team has made.
The suggested solution is to write a method that wraps upsert. This makes the server request come from server code while the client code only runs for latency compensation. Example:
//shared code
Meteor.methods({
customersUpsert: function( id, doc ){
Customers.upsert( id, doc );
}
});
//called from client
Meteor.call( 'customersUpsert', Customers.maybeFindOne( attr )._id, attr );