Version 2.10.0 (2019-01-17)
--------------------------
Transpile helpers.js and detectors.js (#693)
Allow dynamic context callbacks for link and form tracking (#585)
Fix default configOptOutCookie value (#672)
Remove outdated addClickListener method (#667)
Error-handling for tracker methods (#675)
Beacon API option for sending events to collector (#674)
Tracking click events on forms (#579)
Update tracker script banner (#684)
Add new local testing workflow (#686)
Clean up indentation of integration test template (#691)
Update outdated dependencies (#685)
Fix typo in sesname variable (#671)
Add global contexts features (#405)
Add Babel to build process (#665)
Replace YUI Compressor with UglifyJS (#687)
Fix log output for failed integration tests (#689)
Use modularized imports for lodash (#502)
Update npm steps in .travis.yml (#690)
Consolidate request method API (#700)
Fix Beacon API support (#702)

Version 2.9.3 (2019-01-09)
--------------------------
Add option to set a custom POST request path (#696)
Refresh npm authentication token (#688)

Version 2.9.2 (2018-07-24)
--------------------------
Remove wheel and passive event listener feature flags (#661)

Version 2.9.1 (2018-06-20)
--------------------------
Keep node type definitions at version 9.6.7 (#649)
Update page ping context on every call to trackPageView (#612)
Core: fix type incompatibility in consent methods (#652)
Added src/js/lib_managed to .gitignore (#650)
Use passive event listeners for mouse wheel event (#478)
Check if browser has full support of Performance Timing API (#539)
Add Java 10 to Ansible playbooks (#657)

Version 2.9.0 (2018-02-27)
--------------------------
Add ability to change field content before sending form tracking (#465)
Add a method to start a new session (#515)
Make newDocumentTitle variable local (#580)
Enforce that geolocation.timestamp is an integer (#602)
Remove respectOptOutCookie from the Tracker function comments (#605)
Add jsDelivr hits badge (#611)
Add identifyUser as alias for setUserId (#621)
Add trackConsentGranted method (#623)
Add trackConsentWithdrawn method (#624)
Bump semver to 4.3.2 (#625)
LocalStorage domain user ID is not persisted properly (#627)
Core: add trackConsentGranted method (#629)
Core: add trackConsentWithdrawn method (#630)
Update OS X test targets for Saucelabs (#632)
Install dependencies and update shrinkwrap before deployment (#633)

Version 2.8.2 (2017-08-21)
--------------------------
Fix opt-out cookie check (#604)

Version 2.8.1 (2017-07-26)
--------------------------
Use trackCallback for all events (#589)
Fix grunt ts in CI/CD (#598)
Fix tech docs icon (#596)
Fix string ids in Optimizely Summary context (#591)
Fix race condition with pageViewId creation (#592)

Version 2.8.0 (2017-05-18)
--------------------------
Add support for users opting out of state tracking using cookie or localStorage (#459)
Add support for recording state in localStorage rather than cookies (#506)
Exclude password fields from form tracking (#521)
Add Parrable context (#525)
Add support for OptimizelyX context (#551)
Update README markdown in according with CommonMark (#561)
Add support for not recording any state (#563)
Deprecate useCookies (#565)
Deprecate useLocalStorage (#566)
Prevent multiple setInterval from being created (#571)
Guard against non-integer values for minimumVisitLength and heartBeatDelay (#572)
Provide read-only access to domainSessionIndex (#573)
Provide read-only access to cookieName (#574)
Provide read-only access to pageViewId (#575)

Version 2.7.2 (2017-03-07)
--------------------------
Add defensive check for window.optimizely.data in getOptimizelyStateContexts (#555)

Version 2.7.1 (2017-03-06)
--------------------------
Add defensive check for window.optimizely.data (#553)

Version 2.7.0 (2017-01-09)
--------------------------
Add CI/CD (#529)
Add ngrok credentials (#527)
Add Sauce Labs credentials (#528)
Add npm credentials to .travis.yml (#536)
Add AWS credentials to .travis.yml (#537)
Remove random upload path (#538)
Add an option to change life of the visitor cookie, or disable, on tracker creation (#504)
Make tracker Content Security Policy (CSP) compliant (#490)
Add Optimizely summary context (#466)
Add the option to regenerate the page view ID with each page view event (#436)
Add automatic & manual tracking of JS errors to JavaScript tracker (#16)
Get Code Climate badge to green (#152)
Add ability to set true timestamp (#484)
Add timestamp argument for tracking methods (#532)
Remove deprecated visibility state check (#470)
Update Selenium version to 2.48.0 (#487)
Add date for release 2.6.2 to CHANGELOG (#520)
Add trackSelfDescribingEvent method (#471)
Fix integration tests suite (#523)
Bump Core version to 0.5.0 (#301)
Restrict package versions (#522)
Core: only send custom contexts if non-empty array (#540)
Core: add support of true timestamp (#531)
Core: add trackSelfDescribing method (#533)
Core: port to TypeScript (#526)

Version 2.6.2 (2016-07-14)
--------------------------
Add date for release 2.6.1 to CHANGELOG (#495)
Don't send invalid viewport dimensions (#488)
Check whether elements of navigator.plugins array are undefined (#492)
Only call navigator.javaEnabled on instances of Navigator (#491)
Stop using String.startsWith (#493)
Ensure page view ID is passed to synchronous tracker (#485)

Version 2.6.1 (2016-04-14)
--------------------------
Prevent CSS class listing from failing for elements with no CSS classes (#473)
Explicitly set suites field in Intern config (#475)

Version 2.6.0 (2016-03-03)
--------------------------
Bumped ngrok version used in CI to 2.x (#460)
Allowed random upload path in grunt task (#461)
Ensured that PerformanceTiming context doesn't contain properties inherited from Object.prototype (#458)
Added `forceUnsecureTracker` Tracker argument, thanks @bloodyowl! (#374)
Added subset of Augur data as a new context (#386)
Added deprecation warning to setSessionCookieTimeout (#394)
Added setting to automatically use top-level domain for duid (#409)
Added Optimizely contexts (#448)
Added trackEnhancedEcommerceAction() method (#452)
Added addEnhancedEcommerceActionContext() method (#453)
Added addEnhancedEcommerceImpressionContext() method (#454)
Added addEnhancedEcommerceProductContext() method (#455)
Added addEnhancedEcommercePromoContext() method (#456)
Made domainUserId a UUID (#274)
Attached device sent timestamp (stm) to events at last possible moment (#355)
Attempting to create a new tracker using an existing namespace should do nothing (#411)
Using a different library to publish to S3 (#422)
Prevented error running grunt-cloudfront (#426)
Respected doNotTrack in IE 11 and Safari 7.1.3+, thanks @grzegorzewald! (#440)

Version 2.5.3 (2015-11-10)
--------------------------
Bumped Node version to 4.1.2 in .travis.yml (#420)
Bumped Intern version to 3.0.6 (#370)
Bumped version of temporary to 0.0.8 (#425)
Bumped grunt-yui-compressor to 0.4.0 (#424)
Bumped grunt-browserify to 3.28.1 (#427)
Fixed jstimezonedetect version at 1.0.5 (#429)
Removed Browserify from devDependencies (#428)
Made extraction of DOM element classes compatible with IE9 (#418)
Stopped dereferencing undefined nodes when setting up form tracking (#423)

Version 2.5.2 (2015-08-13)
--------------------------
Prevented the tracker from setting cookies on initialization if "useCookies" is disabled (#403)
Remove tests for unsupported environments (#406)

Version 2.5.1 (2015-07-27)
--------------------------
Fixed prerender detection (#391)
Made page title tracking dynamic (#392)
Added warning about using a file URL to example pages (#397)

Version 2.5.0 (2015-07-22)
--------------------------
Generated a unique session ID for each new session (#347)
Added a page view UUID (#369)
Maintained visit count when cookies are disabled (#388)
Bumped payload_data schema to 1-0-3 (#385)
Added Grunt task to build the tracker skipping the lodash and minification tasks (#382)
Added ability to configure the session cookie timeout in the argmap (#383)
Removed deprecated performanceTiming argument to trackPageView (#375)
Added ability to pass a context-generating function to trackPageView (#372)
Removed configWriteCookies setting (#390)
Updated browser feature detection tests (#378)

Version 2.4.3 (2015-04-15)
--------------------------
Added License button to README (#357)
Set the ID cookie as soon as the tracker loads (#358)
Updated the session count as soon as the tracker loads (#361)
Made single events exceeding the maximum POST request size attempt to fire exactly once (#359)
Fixed querystring decoration for links with inner elements (#360)

Version 2.4.2 (2015-04-07)
--------------------------
Set a maximum size for POST requests (#353)
Fixed QuotaExceededError bug (#352)

Version 2.4.1 (2015-03-27)
--------------------------
Counted any 2xx or 3xx collector response to a POST request as successful (#343)
Counted any 4xx or 5xx collector response to a POST request as failed (#344)
Prevented the localStorage event buffer from being flushed more than once simultaneously (#345)
Cancelled the XMLHttpRequest timeout callback when the request fails (#348)
Stopped adding null PerformanceTiming context (#354)

Version 2.4.0 (2015-03-16)
--------------------------
Added ability to modify links allowing cross-domain tracking (#109)
Added timing event (#320)
Increased safety of document size detection (#334)
Started randomly generating ngrok subdomain in integration tests (#333)
Fixed Vagrant setup to use latest Peru version (#336)
Stopped caching page URL and referrer URL (#337)
Stopped caching PerformanceTiming context (#339)
Added common contexts to link_click, change_form, and submit_form events (#340)

Version 2.3.0 (2015-03-03)
-------------------------
Added support for sending events via POST (#168)
Removed dependency on fblundun fork of grunt-yui-compressor (#172)
Added support for batching events (#186)
Started sending PerformanceTiming context with all events (#317)
Added ability to send geolocation context with all events (#191)
Added ability to send context containing all GA cookies with all events (#253)
Improved document height detection (#236)
Added integration tests (#154)
Added functional tests for document size detection and browser features (#270)
Added ability to whitelist or blacklist specific forms and specific form fields (#287)
Added dedicated Vagrant setup (#312)
Added Vagrant "push core" to build and publish Tracker Core (#315)
Added Vagrant "push tracker" to build and deploy JavaScript Tracker (#313)
Renamed deploy to dist (#319)
Stopped sending NaN for page scroll offsets (#324)

Version 2.2.2 (2015-03-03)
--------------------------
Corrected time at which minimum and maximum scroll offsets are reset (#325)

Version 2.2.1 (2015-01-28)
--------------------------
Fixed QuotaExceededError bug with localStorage in Safari (#308)
Stopped sending empty PerformanceTiming context (#306)
Prevented PerformanceTiming context being sent multiple times (#309)
Stopped automatically setting Cloudfront URL in synchronous tracker, thanks @vassilevsky! (#311)
Fixed lodash-cli version at 2.4.2 (#314)
Prevented accidental publication of snowplow-tracker to npm (#300)
Added missing tid ticket to CHANGELOG under 2.1.0 (#302)

Version 2.2.0 (2014-12-15)
--------------------------
Made trackerDictionary object available in onload callbacks, thanks @murphybob! (#294)
Ensured all page offsets are integers (#291)
Added public method to get duid (#289)
Added public method to get user fingerprint (#288)
Added bundle.js to deploy/.gitignore (#281)
Started using grunt-cloudfront for cache invalidation (#276)
Added ability to disable use of localStorage (#181)
Added ability to disable cookies (#140)
URL encoded custom contexts if base 64 encoding is disabled (#299)

Version 2.1.2 (2014-11-15)
--------------------------
Removed requestEnd field from PerformanceTiming context (#285)

Version 2.1.1 (2014-11-06)
--------------------------
Rounded chromeFirstPaint field to an integer (#282)

Version 2.1.0 (2014-11-05)
--------------------------
Added automated form submission tracking (#252)
Stopped outbound queue from triggering multiple times per event (#251)
Added PerformanceTiming context using HTML5 Web Performance API (#248)
Added ability to execute a custom callback once sp.js is loaded (#246)
Added internal site search event (#241)
Started using grunt-cloudfront-clear for CloudFront cache invalidation (#230)
Renamed /dist to /deploy (#216)
Moved context querystring to end of JS-generated beacons (#204)
Added guard to wait until outbound queue is empty before unloading (#202)
Added event_id generation (#190)
Stopped sending tid (#218)
Added content field to link click events (#187)
Replaced "Getting started" with Vagrant-using "Contributing quickstart" (#169)
Added async-large.html (#162)
Improved F rating for tracker.js in CodeClimate (#150)
Added trackAddToCart and trackRemoveFromCart events (#97)
Added further Intern unit tests (#76)
Added social tracking features (#12)
Improved efficiency of enableLinkClickTracking (#254)
Integrated the Tracker Core (#255)
Removed deprecated trackImpression method (#256)
Added forceSecureTracker boolean option to the argmap, thanks @kujo4pmZ! (#247)
Moved link click tracking into its own file (#266)
Made IP address regex more strict (#267)
Updated expected browser fingerprints in functional detectors test (#275)
Added check to ensure outQueue is an array, thanks @kevinsimper! (#277)

Version 2.0.2 (2014-10-20)
--------------------------
Changed default configCookiePath to "/" (#250)

Version 2.0.1 (2014-10-12)
--------------------------
Made error logging compatible with Internet Explorer (#264)
Fixed SauceLabs red status (#235)

Version 2.0.0 (2014-07-03)
--------------------------
Moved fixUpUrl into its own file, called lib/proxies.js (#112)
Fixed duplication of querystring parameter lookup (#111)
Added tests for helpers.js (#96)
Added tests for detectors.js (#95)
Replaced cookie.js with browser-cookie-lite (#88)
Added ad conversion tracking (#60)
Added ad click tracking (#59)
Added initial localStorage support for intermittent offline beacons, thanks @rcs! (#24)
Added new trackAdImpression, mapping to unstructured event (#13)
Removed references to referral cookie (#118)
Implemented enableLinkTracking support (#51)
Replaced hard-coded version with template value (#120)
Added Sauce Labs small button at top of README (#123)
Added Sauce full test summary widget (long bar) at bottom of README (#124)
Added support for namespacing (#4)
Passed tracker namespace through to collector in Tracker Protocol (#126)
Moved to argmap-style tracker creation with 'newTracker' (#132)
Added support for cookie namespacing (#131)
Added new tag which allows queue to be renamed (#130)
Started rigorously checking whether a page is cached by Yahoo (#142)
Upgraded Intern to 1.5.0 (#119)
Fixed link to code climate button in README.md (#149)
Added examples of tracker namespacing (#159)
Split async.html into async-small.html, async-medium.html (#160)
Linked the Technical Docs and Setup Guide images to the appropriate pages (#164)
Made JS invocation tag part of the build process (#158)
Fixed warnings generated by the Closure Compiler, thanks @steve-gh! (#170) 
Added untracked files which should be ignored to .gitignore (#173)
Removed ads/sync.html (#182)
Updated ads/async.html (#183)
Added pageUnloadTimer option to argmap (#171)
Removed type hints from unstructured events and custom contexts (#163)
Added hardcoded schema to custom context arrays (#199)
Added hardcoded schema to unstructured events (#196)
Changed trackUnstructEvent to take a JSON containing schema and data fields (#197)

Version 1.0.3 (2014-06-27)
--------------------------
Changed Base64 encoding function to prevent character encoding errors, thanks @shermozle! (#231)

Version 1.0.2 (2014-06-24)
--------------------------
Added guard to prevent document size field from being set as "NaNxNaN" (#220)
Fixed Grunt publish tasks to build sp.js as well as upload it to S3 (#224)
Added cache control to Grunt upload for full semantic version (#225)

Version 1.0.1 (2014-04-09)
--------------------------
Fixed lodash.js to work in the presence of AMD modules (#165)
Added missing variable declarations (#166)

Version 1.0.0 (2014-03-27)
--------------------------
Added extra meta-data to package.json (#83)
Moved part of banner.js into Gruntfile with grunt-concat's banner option so its values are based on package.json (#82)
Started using Browserify for modules (#74)
Replaced some/all of lib/.js with modules (#7)
Added user fingerprinting on/off switch and configurable hash seed (#7)
Deprecated trackImpression (#66)
Removed attachUserId as fully deprecated now (#64)
Removed setSiteId as fully deprecated now (#63)
Removed getVisitor-Id, -Info as fully deprecated now (#62)
Removed trackEvent as fully deprecated now (#61)
Tightened public API for SnowPlow (#29)
Renamed SnowPlow everywhere to Snowplow (#69)
Prepended window. or SnowPlow.windowAlias. onto _snaq everywhere (#39)
Removed legacy Piwik plugin framework (#56)
Moved hasSessionStorage and hasLocalStorage into detectors.js (#91)
Wrote tests for AsyncQueueProxy (#100)
Added Travis CI to the project (#103)
Added a built with Grunt button to the README (#102)
Added codeclimate button to README (#137)
Added named Grunt tasks (#86)
Added Intern unit tests for payload.js (#5)
Replaced all functions in identifiers.js which are directly available from lodash (#85)
Moved functions from identifers.js into payload.js and wrote Intern tests for them (#108)
Added getting started info for developers to README, thanks @pkallos! (#129)

Version 0.14.1 (2014-03-12)
---------------------------
Fixed bug where fromQuerystring was matching fragments instead of just the querystring (#116) 

Version 0.14.0 (2014-02-12)
---------------------------
Bumped version to 0.14.0
Removed all DEBUG blocks from codebase (#65)
Renamed requestStringBuilder to payloadBuilder and moved it into its own file, payload.js (#55)
Introduced gzipped sp.js library (#48)
Updated grunt and intern dependencies (#54)
Replaced snowpak.sh with Grunt and grunt-yui-compressor (#53)
Added setUserIdFromReferrer and setUserIdFromLocation (#57)
Added ability to pass a referrer to Snowplow from an IFRAME (#1)
Tested setDoNotTrack and renamed it to respectDoNotTrack (#28)
Moved detect...() functions into new file context.js (#37)
Moved cookie-related functionality into new file cookie.js (#77)
Removed getLegacyCookieName as no longer needed for migrating cookie IDs (#50)
Switched deployment to use Grunt (#58)
Added setUserIdFromCookie (#78)

Version 0.13.1 (2014-01-28)
---------------------------
Fixed bug where non-String values are not being added to our payload (#71)

Version 0.13.0 (2014-01-26)
---------------------------
Added fully retrospective CHANGELOG (#20)
Added setPlatform support, thanks @rcs! (#25)
Added currency field to ecommerce transactions (#34)
Added custom unstructured contexts (#49)
Added base64decode to Tracker (#36)
Added null check to requestStringBuilder() (#40)
Added array helpers (#41)
Fixed (harmless) bug in base64.js (#35)
Update .gitignore to be node-friendly .gitignore (#52)
Switched to Semantic versioning & only put MAJOR version in hosted path to snowplow.js (#47)
Added package.json (#38)
Added retrospective tags back in (#22)
Restructured folders (#21)

Version 0.12.0 (2013-07-07)
---------------------------
Fixed document reference to use documentAlias (#247)
Fixed bug with setCustomUrl (#267)
Changed ev_ to se_ for structured events (#197)
Fixed Firefox failure when "Always ask" set for cookies (#163)
Fixed bug in page ping functionality detected in IE 8 (#260)
Replaced forEach as not supported in IE 6-8 (#295)

Version 0.11.2 (2013-05-14)
---------------------------
Added unstructured events, thanks @rgabo, @tarsolya, @lackac (#198)
Remove leading ampersand in querystring (#188)

Version 0.11.1 (2013-02-25)
---------------------------
Fixed bug with cookie secure flag killing user ID cookies (#181)

Version 0.11.0 (2013-02-22)
---------------------------
Introduced setAppId() and deprecated setSiteId() (#168)
1st party user ID now transmitted as duid (domain uid) (part of #150)
Now sends dtm - the client timestamp (#149)
Deprecated and disabled attachUserId()
Deprecated getVisitorId() and getVisitorInfo() - use getDomainUserId() and getDomainUserInfo() instead
Added setUserId which sets the uid field (#167)
Snowplow cookies no longer tied to site ID (#148)

Version 0.10.0 (2013-02-15)
---------------------------
Updated copyright notices
Removed deprecated setAccount(), setTracker(), setHeartBeatTimer() - BREAKING CHANGE (#86)
Added document charset to querystring (#138)
Page ping no longer killed by 1 heartbeat w/o activity (#132)
Added document & viewport dimensions (#94)
Introduced trackStructEvent and deprecated trackEvent (#143)
Cleaned up getRequest code to use improved requestStringBuilder
Fixed logImpression (was using wrong argument names) (#162)
Added scroll offsets to page ping (#127)

Version 0.9.1 (2013-01-29)
--------------------------
Fixed bug where secure flag not being set on cookies sent via HTTPS

Version 0.9.0 (2012-12-26)
--------------------------
Each event now sent with an event type `e` (#63)
Refactoring of event definition code
Added attachUserId(boolean) method (#92)
Removed configCustomData from logImpression (#115)
Cleaned up activity tracking (page pings)
Added a combine only option to snowpak.sh

Version 0.8.2 (2012-12-18)
--------------------------
Fixed regressions from splitting JS into multiple files (#103)

Version 0.8.1 (2012-11-29)
--------------------------
Fixed bug with trailing comma (#102)
Removed console.log when not debugging (#101)
Removed minified sp.js from version control (added .gitignore to keep it out)

Version 0.8.0 (2012-11-28)
--------------------------
Rename ice.png to i - BREAKING CHANGE (#29)
Added setCollectorCf() and deprecated setAccount() (#32)
Tracker constructor now supports Cf or Url (part of #44)
getTrackerCf() and -Url() added, getTracker() deprecated (part of #44)
Added tracker version (`tv`) to querystring (#41)
Added color depth tracking (part of #69)
Added timezone tracking (part of #69)
Added user fingerprinting (#70)
Broke out .js into multiple files (#55)

Version 0.7.0 (2012-10-01)
--------------------------
Renamed said to aid for application ID

Version 0.6 (2012-09-05)
------------------------
Added setSiteId functionality
Added ecommerce tracking

Version 0.5 (2012-08-18)
--------------------------
Changed header comments from Doxygen format to JsDoc
Added support for specifying collectorUrl directly
Added versioning into header comment (so survives minification)
Took f_ off res and cookie; added url onto end, renamed rdm to tid

Version 0.4 (2012-05-30)
------------------------
Improved names of querystring params
Added page-url to querystring as fallback

Version 0.3 (2012-05-18)
------------------------
Updated to prepend f_ to browser features
Revised the querystring name-value pairs to make them more user-friendly

Version 0.2 (2012-05-08)
------------------------
Formalised minification process

Version 0.1 (2012-03-21)
------------------------
Initial release
