Loop through object and send analytics code based on objects properties value
Should I be checking if the main function's argument is an object?


No, document it as it accepts objects, the params are straight forward no need to check them for the consumer


Is there a way I wouldn't have to check if the campaignCode is falsy? Could I check it in the if statement of the for loop?


No need to loop just access the property directly

campaignCode = lookupTable[prop];


Am I declaring the analyticsTrack function in the correct way?


Yes and no, every time you invoke the main function you are allocating the method.  There are no closures around it so it doesn't need to be done.  Just move it outside of the main method but wrap everything in a self invoking method (if you are not already with some other tool) so it won't be global.  

If I had to rewrite everything here is how I would do it.  Instead of having a bunch of if path contains x then do something with the campainCode statements I  just put it in an object.  It might be overkill but it is a good pattern to use in other places.  Say you want to handle books instead of adding another if indexof .. just add books to the pathsHandlers object.  

(function() {

    function analyticsTrack(id) {
        return Bootstrapper.insertScript('//www.example.com/click/services/Tracking/Click.ashx?CR_EAC=' + id);
    }

    var pathHandlers = {
        topics: function(campaignCode) {
            analyticsTrack(campaignCode)
        },
        courses: function(campaignCode) {
            $(window).on('message', function(e) {

                // check the message from the iframe, fire a RIO tag
                if (e.originalEvent.data === 'play button clicked') {
                    analyticsTrack(campaignCode);
                }
            });
        }
    }

    window.analytics.campaign.main = function(lookupTable) {
        var path = window.location.pathname,
            campaignCode = lookupTable[path],
            handlerKey;

        if (campaignCode) {
            for (handlerKey in pathHandlers) {
                if (pathHandlers.hasOwnProperty(handlerKey) &amp;&amp; path.indexOf(handlerKey) &gt; -1) {
                    pathHandlers[handlerKey](campaignCode);
                }
            }
        }
    };

})();


--edit to answer comment

Your function was defined in the main function but it didn't need to be because it wasn't using any locally scoped variables in main (no variables being accessed in the function via closure).

If the method was for example :

window.analytics.campaign.main = function (lookupTable) {
    var path = window.location.pathname,
        campaignCode = '',
        prop;

    function analyticsTrack (id) {
        console.log('current path is ' + path)
        return Bootstrapper.insertScript('//www.example.com/click/services/Tracking/Click.ashx?CR_EAC=' + id);
    }


The method couldn't be moved outside of main because it is referencing the path variable within a closure.