Single Page Applications (SPA) does not require a page to be reloaded when the URL changes therefore a different approach to event tracking with the Meta Pixel has to be followed.
Note: You can set disablePushState to true to stop sending PageView events on history state changes but it is not recommended.
Track a specific area where an action it taking place using the History State API. There is no one one-size fits all solution to this as it highly depends on the framework and the implementation details. The general idea is to track the event whenever there is a URL change in the SPA. Hooking it into the routing system of the framework or application is required.
...
<body>
<ul id="menu" class="clearfix">
<li><a href="link1">Link 1</a></li> //Link to ViewContent
<li><a href="link2">Link 2</a></li> //Link to AddPaymentInfo
<li><a href="link3">Link 3</a></li> //Link to CompleteRegistration
</ul>
...
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min.js"></script>
<script>
(function($) {
var loadContent = function(href) { // Simulates an AJAX call to the server to grab new content
$.ajax(href + ".html", {
success: function(data) {
history.pushState({ 'url': href }, 'New URL: ' + href, href); // Called to the the URL on link click
$('#content').html(data + new Date());
var eventname = null; //Optional Section - Demonstrates that additional
switch (href) { // events can be tracked on particular path changes
case 'link1':
eventname = 'ViewContent';
break;
case 'link2':
eventname = 'AddPaymentInfo';
break;
case 'link3':
eventname = 'CompleteRegistration';
break;
default:
}
fbq('track', eventname) //Tracking event function is called
},
error: function() {
console.log('An error occurred');
}
});
};
var init = function() {
$('#menu a').click(function(e) {
e.preventDefault();
loadContent($(this).attr("href"));
});
};
$(document).ready(function() {
init();
});
})(jQuery);
</script>
</body>
...