diff --git a/bugsnag-types.cabal b/bugsnag-types.cabal
--- a/bugsnag-types.cabal
+++ b/bugsnag-types.cabal
@@ -1,6 +1,6 @@
 cabal-version:   1.18
 name:            bugsnag-types
-version:         1.1.0.1
+version:         1.1.1.0
 license:         MIT
 maintainer:      pbrisbin@gmail.com
 author:          Patrick Brisbin
diff --git a/src/Data/Bugsnag/Types/Application.hs b/src/Data/Bugsnag/Types/Application.hs
--- a/src/Data/Bugsnag/Types/Application.hs
+++ b/src/Data/Bugsnag/Types/Application.hs
@@ -1,7 +1,9 @@
 module Data.Bugsnag.Types.Application
   ( Application (..)
   , exampleApplication
-  ) where
+  , defaultApplication
+  )
+where
 
 import Data.Bugsnag.Types.Prelude
 
@@ -53,7 +55,7 @@
   , runningOnRosetta :: Maybe Bool
   -- ^ Whether the application is running on the Rosetta emulator for Mac.
   }
-  deriving stock (Eq, Show, Generic)
+  deriving stock (Eq, Generic, Show)
 
 instance FromJSON Application where
   parseJSON = genericParseJSON aesonOptions
@@ -62,21 +64,42 @@
   toJSON = genericToJSON aesonOptions
   toEncoding = genericToEncoding aesonOptions
 
+defaultApplication :: Application
+defaultApplication =
+  Application
+    { id = Nothing
+    , version = Nothing
+    , versionCode = Nothing
+    , bundleVersion = Nothing
+    , codeBundleId = Nothing
+    , buildUUID = Nothing
+    , releaseStage = Nothing
+    , type_ = Nothing
+    , dsymUUIDs = Nothing
+    , duration = Nothing
+    , durationInForeground = Nothing
+    , inForeground = Nothing
+    , isLaunching = Nothing
+    , binaryArch = Nothing
+    , runningOnRosetta = Nothing
+    }
+
 exampleApplication :: Application
-exampleApplication = Application
-  { id = Just "com.bugsnag.android.example.debug"
-  , version = Just "1.1.3"
-  , versionCode = Just 12
-  , bundleVersion = Just "1.0.2"
-  , codeBundleId = Just "1.0-1234"
-  , buildUUID = Just "BE5BA3D0-971C-4418-9ECF-E2D1ABCB66BE"
-  , releaseStage = Just "staging"
-  , type_ = Just "rails"
-  , dsymUUIDs = Just ["e6173678256785afd940392abee"]
-  , duration = Just 1275
-  , durationInForeground = Just 983
-  , inForeground = Just True
-  , isLaunching = Just True
-  , binaryArch = Just exampleBinaryArch
-  , runningOnRosetta = Just True
-  }
+exampleApplication =
+  Application
+    { id = Just "com.bugsnag.android.example.debug"
+    , version = Just "1.1.3"
+    , versionCode = Just 12
+    , bundleVersion = Just "1.0.2"
+    , codeBundleId = Just "1.0-1234"
+    , buildUUID = Just "BE5BA3D0-971C-4418-9ECF-E2D1ABCB66BE"
+    , releaseStage = Just "staging"
+    , type_ = Just "rails"
+    , dsymUUIDs = Just ["e6173678256785afd940392abee"]
+    , duration = Just 1275
+    , durationInForeground = Just 983
+    , inForeground = Just True
+    , isLaunching = Just True
+    , binaryArch = Just exampleBinaryArch
+    , runningOnRosetta = Just True
+    }
diff --git a/src/Data/Bugsnag/Types/BinaryArch.hs b/src/Data/Bugsnag/Types/BinaryArch.hs
--- a/src/Data/Bugsnag/Types/BinaryArch.hs
+++ b/src/Data/Bugsnag/Types/BinaryArch.hs
@@ -1,7 +1,8 @@
 module Data.Bugsnag.Types.BinaryArch
   ( BinaryArch (..)
   , exampleBinaryArch
-  ) where
+  )
+where
 
 import Data.Bugsnag.Types.Prelude
 
@@ -19,7 +20,7 @@
   | Armv7s
   | Armv8
   | Amd64
-  deriving stock (Bounded, Enum, Eq, Show, Generic)
+  deriving stock (Bounded, Enum, Eq, Generic, Show)
 
 instance FromJSON BinaryArch where
   parseJSON = genericParseJSON aesonOptions
diff --git a/src/Data/Bugsnag/Types/Breadcrumb.hs b/src/Data/Bugsnag/Types/Breadcrumb.hs
--- a/src/Data/Bugsnag/Types/Breadcrumb.hs
+++ b/src/Data/Bugsnag/Types/Breadcrumb.hs
@@ -1,7 +1,9 @@
 module Data.Bugsnag.Types.Breadcrumb
   ( Breadcrumb (..)
   , exampleBreadcrumb
-  ) where
+  , defaultBreadcrumb
+  )
+where
 
 import Data.Bugsnag.Types.Prelude
 
@@ -47,7 +49,7 @@
   -- >     "from": "PodBayDoorView"
   -- > }
   }
-  deriving stock (Eq, Show, Generic)
+  deriving stock (Eq, Generic, Show)
 
 instance FromJSON Breadcrumb where
   parseJSON = genericParseJSON aesonOptions
@@ -56,10 +58,20 @@
   toJSON = genericToJSON aesonOptions
   toEncoding = genericToEncoding aesonOptions
 
+defaultBreadcrumb :: Text -> Text -> BreadcrumbType -> Breadcrumb
+defaultBreadcrumb timestamp name type_ =
+  Breadcrumb
+    { timestamp
+    , name
+    , type_
+    , metaData = Nothing
+    }
+
 exampleBreadcrumb :: Breadcrumb
-exampleBreadcrumb = Breadcrumb
-  { timestamp = "2016-07-19T12:17:27-0700"
-  , name = "Open menu"
-  , type_ = exampleBreadcrumbType
-  , metaData = Nothing
-  }
+exampleBreadcrumb =
+  Breadcrumb
+    { timestamp = "2016-07-19T12:17:27-0700"
+    , name = "Open menu"
+    , type_ = exampleBreadcrumbType
+    , metaData = Nothing
+    }
diff --git a/src/Data/Bugsnag/Types/BreadcrumbType.hs b/src/Data/Bugsnag/Types/BreadcrumbType.hs
--- a/src/Data/Bugsnag/Types/BreadcrumbType.hs
+++ b/src/Data/Bugsnag/Types/BreadcrumbType.hs
@@ -1,7 +1,8 @@
 module Data.Bugsnag.Types.BreadcrumbType
   ( BreadcrumbType (..)
   , exampleBreadcrumbType
-  ) where
+  )
+where
 
 import Data.Bugsnag.Types.Prelude
 
@@ -38,7 +39,7 @@
   | State
   | Error
   | Manual
-  deriving stock (Bounded, Enum, Eq, Show, Generic)
+  deriving stock (Bounded, Enum, Eq, Generic, Show)
 
 instance FromJSON BreadcrumbType where
   parseJSON = genericParseJSON aesonOptions
diff --git a/src/Data/Bugsnag/Types/DependentNotifier.hs b/src/Data/Bugsnag/Types/DependentNotifier.hs
--- a/src/Data/Bugsnag/Types/DependentNotifier.hs
+++ b/src/Data/Bugsnag/Types/DependentNotifier.hs
@@ -1,7 +1,9 @@
 module Data.Bugsnag.Types.DependentNotifier
   ( DependentNotifier (..)
   , exampleDependentNotifier
-  ) where
+  , defaultDependentNotifier
+  )
+where
 
 import Data.Bugsnag.Types.Prelude
 
@@ -13,7 +15,7 @@
   , url :: Text
   -- ^ The URL associated with the notifier.
   }
-  deriving stock (Eq, Show, Generic)
+  deriving stock (Eq, Generic, Show)
 
 instance FromJSON DependentNotifier where
   parseJSON = genericParseJSON aesonOptions
@@ -22,9 +24,18 @@
   toJSON = genericToJSON aesonOptions
   toEncoding = genericToEncoding aesonOptions
 
+defaultDependentNotifier :: Text -> Text -> Text -> DependentNotifier
+defaultDependentNotifier name version url =
+  DependentNotifier
+    { name
+    , version
+    , url
+    }
+
 exampleDependentNotifier :: DependentNotifier
-exampleDependentNotifier = DependentNotifier
-  { name = "Bugsnag Android"
-  , version = "2.1.10"
-  , url = "https://github.com/bugsnag/bugsnag-android"
-  }
+exampleDependentNotifier =
+  DependentNotifier
+    { name = "Bugsnag Android"
+    , version = "2.1.10"
+    , url = "https://github.com/bugsnag/bugsnag-android"
+    }
diff --git a/src/Data/Bugsnag/Types/Device.hs b/src/Data/Bugsnag/Types/Device.hs
--- a/src/Data/Bugsnag/Types/Device.hs
+++ b/src/Data/Bugsnag/Types/Device.hs
@@ -1,7 +1,9 @@
 module Data.Bugsnag.Types.Device
   ( Device (..)
   , exampleDevice
-  ) where
+  , defaultDevice
+  )
+where
 
 import Data.Bugsnag.Types.Prelude
 
@@ -50,7 +52,7 @@
   , macCatalystiOSVersion :: Maybe Text
   -- ^ The device\'s Mac Catalyst iOS version.
   }
-  deriving stock (Eq, Show, Generic)
+  deriving stock (Eq, Generic, Show)
 
 instance FromJSON Device where
   parseJSON = genericParseJSON aesonOptions
@@ -59,24 +61,48 @@
   toJSON = genericToJSON aesonOptions
   toEncoding = genericToEncoding aesonOptions
 
+defaultDevice :: Device
+defaultDevice =
+  Device
+    { hostname = Nothing
+    , id = Nothing
+    , manufacturer = Nothing
+    , model = Nothing
+    , modelNumber = Nothing
+    , osName = Nothing
+    , osVersion = Nothing
+    , freeMemory = Nothing
+    , totalMemory = Nothing
+    , freeDisk = Nothing
+    , browserName = Nothing
+    , browserVersion = Nothing
+    , jailbroken = Nothing
+    , orientation = Nothing
+    , time = Nothing
+    , cpuAbi = Nothing
+    , runtimeVersions = Nothing
+    , macCatalystiOSVersion = Nothing
+    }
+
 exampleDevice :: Device
-exampleDevice = Device
-  { hostname = Just "web1.internal"
-  , id = Just "fd124e87760c4281aef"
-  , manufacturer = Just "LGE"
-  , model = Just "Nexus 6P"
-  , modelNumber = Just "600"
-  , osName = Just "android"
-  , osVersion = Just "8.0.1"
-  , freeMemory = Just 183879616
-  , totalMemory = Just 201326592
-  , freeDisk = Just 13478064128
-  , browserName = Just "Chrome"
-  , browserVersion = Just "61.0.3163.100"
-  , jailbroken = Nothing
-  , orientation = Just "portrait"
-  , time = Just "2018-08-07T10:16:34.564Z"
-  , cpuAbi = Just ["x86_64"]
-  , runtimeVersions = Just exampleRuntimeVersion
-  , macCatalystiOSVersion = Just "14.0"
-  }
+exampleDevice =
+  Device
+    { hostname = Just "web1.internal"
+    , id = Just "fd124e87760c4281aef"
+    , manufacturer = Just "LGE"
+    , model = Just "Nexus 6P"
+    , modelNumber = Just "600"
+    , osName = Just "android"
+    , osVersion = Just "8.0.1"
+    , freeMemory = Just 183879616
+    , totalMemory = Just 201326592
+    , freeDisk = Just 13478064128
+    , browserName = Just "Chrome"
+    , browserVersion = Just "61.0.3163.100"
+    , jailbroken = Nothing
+    , orientation = Just "portrait"
+    , time = Just "2018-08-07T10:16:34.564Z"
+    , cpuAbi = Just ["x86_64"]
+    , runtimeVersions = Just exampleRuntimeVersion
+    , macCatalystiOSVersion = Just "14.0"
+    }
diff --git a/src/Data/Bugsnag/Types/ErrorType.hs b/src/Data/Bugsnag/Types/ErrorType.hs
--- a/src/Data/Bugsnag/Types/ErrorType.hs
+++ b/src/Data/Bugsnag/Types/ErrorType.hs
@@ -1,7 +1,8 @@
 module Data.Bugsnag.Types.ErrorType
   ( ErrorType (..)
   , exampleErrorType
-  ) where
+  )
+where
 
 import Data.Bugsnag.Types.Prelude
 
@@ -23,7 +24,7 @@
   | Python
   | Reactnativejs
   | Ruby
-  deriving stock (Bounded, Enum, Eq, Show, Generic)
+  deriving stock (Bounded, Enum, Eq, Generic, Show)
 
 instance FromJSON ErrorType where
   parseJSON = genericParseJSON aesonOptions
diff --git a/src/Data/Bugsnag/Types/Event.hs b/src/Data/Bugsnag/Types/Event.hs
--- a/src/Data/Bugsnag/Types/Event.hs
+++ b/src/Data/Bugsnag/Types/Event.hs
@@ -1,21 +1,23 @@
 module Data.Bugsnag.Types.Event
   ( Event (..)
   , exampleEvent
-  ) where
+  , defaultEvent
+  )
+where
 
 import Data.Bugsnag.Types.Prelude
 
-import Data.Bugsnag.Types.Exception
+import Data.Bugsnag.Types.Application
 import Data.Bugsnag.Types.Breadcrumb
+import Data.Bugsnag.Types.Device
+import Data.Bugsnag.Types.Exception
+import Data.Bugsnag.Types.FeatureFlag
 import Data.Bugsnag.Types.Request
-import Data.Bugsnag.Types.Thread
+import Data.Bugsnag.Types.Session
 import Data.Bugsnag.Types.Severity
 import Data.Bugsnag.Types.SeverityReason
+import Data.Bugsnag.Types.Thread
 import Data.Bugsnag.Types.User
-import Data.Bugsnag.Types.Application
-import Data.Bugsnag.Types.Device
-import Data.Bugsnag.Types.Session
-import Data.Bugsnag.Types.FeatureFlag
 
 data Event = Event
   { exceptions :: [Exception]
@@ -127,7 +129,7 @@
   -- >       }
   -- >   }
   }
-  deriving stock (Eq, Show, Generic)
+  deriving stock (Eq, Generic, Show)
 
 instance FromJSON Event where
   parseJSON = genericParseJSON aesonOptions
@@ -136,22 +138,44 @@
   toJSON = genericToJSON aesonOptions
   toEncoding = genericToEncoding aesonOptions
 
+defaultEvent :: [Exception] -> Event
+defaultEvent exceptions =
+  Event
+    { exceptions
+    , breadcrumbs = Nothing
+    , request = Nothing
+    , threads = Nothing
+    , context = Nothing
+    , groupingHash = Nothing
+    , unhandled = Nothing
+    , severity = Nothing
+    , severityReason = Nothing
+    , projectPackages = Nothing
+    , user = Nothing
+    , app = Nothing
+    , device = Nothing
+    , session = Nothing
+    , featureFlags = Nothing
+    , metaData = Nothing
+    }
+
 exampleEvent :: Event
-exampleEvent = Event
-  { exceptions = [exampleException]
-  , breadcrumbs = Just [exampleBreadcrumb]
-  , request = Just exampleRequest
-  , threads = Just [exampleThread]
-  , context = Just "auth/session#create"
-  , groupingHash = Just "buggy_file.rb"
-  , unhandled = Just True
-  , severity = Just exampleSeverity
-  , severityReason = Just exampleSeverityReason
-  , projectPackages = Just ["com.example.package1","com.example.package2"]
-  , user = Just exampleUser
-  , app = Just exampleApplication
-  , device = Just exampleDevice
-  , session = Just exampleSession
-  , featureFlags = Just [exampleFeatureFlag]
-  , metaData = Nothing
-  }
+exampleEvent =
+  Event
+    { exceptions = [exampleException]
+    , breadcrumbs = Just [exampleBreadcrumb]
+    , request = Just exampleRequest
+    , threads = Just [exampleThread]
+    , context = Just "auth/session#create"
+    , groupingHash = Just "buggy_file.rb"
+    , unhandled = Just True
+    , severity = Just exampleSeverity
+    , severityReason = Just exampleSeverityReason
+    , projectPackages = Just ["com.example.package1", "com.example.package2"]
+    , user = Just exampleUser
+    , app = Just exampleApplication
+    , device = Just exampleDevice
+    , session = Just exampleSession
+    , featureFlags = Just [exampleFeatureFlag]
+    , metaData = Nothing
+    }
diff --git a/src/Data/Bugsnag/Types/Exception.hs b/src/Data/Bugsnag/Types/Exception.hs
--- a/src/Data/Bugsnag/Types/Exception.hs
+++ b/src/Data/Bugsnag/Types/Exception.hs
@@ -1,12 +1,14 @@
 module Data.Bugsnag.Types.Exception
   ( Exception (..)
   , exampleException
-  ) where
+  , defaultException
+  )
+where
 
 import Data.Bugsnag.Types.Prelude
 
-import Data.Bugsnag.Types.Stackframe
 import Data.Bugsnag.Types.ErrorType
+import Data.Bugsnag.Types.Stackframe
 
 data Exception = Exception
   { errorClass :: Text
@@ -24,7 +26,7 @@
   -- grouping, as well as displaying it to the user.
   , type_ :: Maybe ErrorType
   }
-  deriving stock (Eq, Show, Generic)
+  deriving stock (Eq, Generic, Show)
 
 instance FromJSON Exception where
   parseJSON = genericParseJSON aesonOptions
@@ -33,10 +35,20 @@
   toJSON = genericToJSON aesonOptions
   toEncoding = genericToEncoding aesonOptions
 
+defaultException :: Text -> [Stackframe] -> Exception
+defaultException errorClass stacktrace =
+  Exception
+    { errorClass
+    , stacktrace
+    , message = Nothing
+    , type_ = Nothing
+    }
+
 exampleException :: Exception
-exampleException = Exception
-  { errorClass = "NoMethodError"
-  , message = Just "Unable to connect to database"
-  , stacktrace = [exampleStackframe]
-  , type_ = Just exampleErrorType
-  }
+exampleException =
+  Exception
+    { errorClass = "NoMethodError"
+    , message = Just "Unable to connect to database"
+    , stacktrace = [exampleStackframe]
+    , type_ = Just exampleErrorType
+    }
diff --git a/src/Data/Bugsnag/Types/FeatureFlag.hs b/src/Data/Bugsnag/Types/FeatureFlag.hs
--- a/src/Data/Bugsnag/Types/FeatureFlag.hs
+++ b/src/Data/Bugsnag/Types/FeatureFlag.hs
@@ -1,7 +1,9 @@
 module Data.Bugsnag.Types.FeatureFlag
   ( FeatureFlag (..)
   , exampleFeatureFlag
-  ) where
+  , defaultFeatureFlag
+  )
+where
 
 import Data.Bugsnag.Types.Prelude
 
@@ -11,7 +13,7 @@
   , variant :: Maybe Text
   -- ^ The name of the variant.
   }
-  deriving stock (Eq, Show, Generic)
+  deriving stock (Eq, Generic, Show)
 
 instance FromJSON FeatureFlag where
   parseJSON = genericParseJSON aesonOptions
@@ -20,8 +22,16 @@
   toJSON = genericToJSON aesonOptions
   toEncoding = genericToEncoding aesonOptions
 
+defaultFeatureFlag :: Text -> FeatureFlag
+defaultFeatureFlag featureFlag =
+  FeatureFlag
+    { featureFlag
+    , variant = Nothing
+    }
+
 exampleFeatureFlag :: FeatureFlag
-exampleFeatureFlag = FeatureFlag
-  { featureFlag = "share_ios_photo_sharing_button"
-  , variant = Just "blue_button"
-  }
+exampleFeatureFlag =
+  FeatureFlag
+    { featureFlag = "share_ios_photo_sharing_button"
+    , variant = Just "blue_button"
+    }
diff --git a/src/Data/Bugsnag/Types/Notifier.hs b/src/Data/Bugsnag/Types/Notifier.hs
--- a/src/Data/Bugsnag/Types/Notifier.hs
+++ b/src/Data/Bugsnag/Types/Notifier.hs
@@ -1,7 +1,9 @@
 module Data.Bugsnag.Types.Notifier
   ( Notifier (..)
   , exampleNotifier
-  ) where
+  , defaultNotifier
+  )
+where
 
 import Data.Bugsnag.Types.Prelude
 
@@ -21,7 +23,7 @@
   -- optional array containing the details of the additional notifiers can be
   -- specified.
   }
-  deriving stock (Eq, Show, Generic)
+  deriving stock (Eq, Generic, Show)
 
 instance FromJSON Notifier where
   parseJSON = genericParseJSON aesonOptions
@@ -30,10 +32,20 @@
   toJSON = genericToJSON aesonOptions
   toEncoding = genericToEncoding aesonOptions
 
+defaultNotifier :: Text -> Text -> Text -> Notifier
+defaultNotifier name version url =
+  Notifier
+    { name
+    , version
+    , url
+    , dependencies = Nothing
+    }
+
 exampleNotifier :: Notifier
-exampleNotifier = Notifier
-  { name = "Bugsnag Ruby"
-  , version = "1.0.11"
-  , url = "https://github.com/bugsnag/bugsnag-ruby"
-  , dependencies = Just [exampleDependentNotifier]
-  }
+exampleNotifier =
+  Notifier
+    { name = "Bugsnag Ruby"
+    , version = "1.0.11"
+    , url = "https://github.com/bugsnag/bugsnag-ruby"
+    , dependencies = Just [exampleDependentNotifier]
+    }
diff --git a/src/Data/Bugsnag/Types/Payload.hs b/src/Data/Bugsnag/Types/Payload.hs
--- a/src/Data/Bugsnag/Types/Payload.hs
+++ b/src/Data/Bugsnag/Types/Payload.hs
@@ -1,12 +1,14 @@
 module Data.Bugsnag.Types.Payload
   ( Payload (..)
   , examplePayload
-  ) where
+  , defaultPayload
+  )
+where
 
 import Data.Bugsnag.Types.Prelude
 
-import Data.Bugsnag.Types.Notifier
 import Data.Bugsnag.Types.Event
+import Data.Bugsnag.Types.Notifier
 
 data Payload = Payload
   { apiKey :: Maybe Text
@@ -24,7 +26,7 @@
   -- or can notify BugSnag each time an event occurs. Should contain at least
   -- 1 event.
   }
-  deriving stock (Eq, Show, Generic)
+  deriving stock (Eq, Generic, Show)
 
 instance FromJSON Payload where
   parseJSON = genericParseJSON aesonOptions
@@ -33,10 +35,20 @@
   toJSON = genericToJSON aesonOptions
   toEncoding = genericToEncoding aesonOptions
 
+defaultPayload :: Text -> Notifier -> [Event] -> Payload
+defaultPayload payloadVersion notifier events =
+  Payload
+    { payloadVersion
+    , notifier
+    , events
+    , apiKey = Nothing
+    }
+
 examplePayload :: Payload
-examplePayload = Payload
-  { apiKey = Just "YOUR-NOTIFIER-API-KEY"
-  , payloadVersion = "5"
-  , notifier = exampleNotifier
-  , events = [exampleEvent]
-  }
+examplePayload =
+  Payload
+    { apiKey = Just "YOUR-NOTIFIER-API-KEY"
+    , payloadVersion = "5"
+    , notifier = exampleNotifier
+    , events = [exampleEvent]
+    }
diff --git a/src/Data/Bugsnag/Types/Prelude.hs b/src/Data/Bugsnag/Types/Prelude.hs
--- a/src/Data/Bugsnag/Types/Prelude.hs
+++ b/src/Data/Bugsnag/Types/Prelude.hs
@@ -1,9 +1,10 @@
 module Data.Bugsnag.Types.Prelude
   ( module X
   , aesonOptions
-  ) where
+  )
+where
 
-import Prelude as X
+import Prelude as X hiding (id)
 
 import Control.Monad as X (void)
 import Data.Aeson (Options (..), defaultOptions)
diff --git a/src/Data/Bugsnag/Types/Request.hs b/src/Data/Bugsnag/Types/Request.hs
--- a/src/Data/Bugsnag/Types/Request.hs
+++ b/src/Data/Bugsnag/Types/Request.hs
@@ -1,7 +1,9 @@
 module Data.Bugsnag.Types.Request
   ( Request (..)
   , exampleRequest
-  ) where
+  , defaultRequest
+  )
+where
 
 import Data.Bugsnag.Types.Prelude
 
@@ -27,7 +29,7 @@
   , referer :: Maybe Text
   -- ^ The <https://en.wikipedia.org/wiki/HTTP_referer HTTP referer>
   }
-  deriving stock (Eq, Show, Generic)
+  deriving stock (Eq, Generic, Show)
 
 instance FromJSON Request where
   parseJSON = genericParseJSON aesonOptions
@@ -36,11 +38,22 @@
   toJSON = genericToJSON aesonOptions
   toEncoding = genericToEncoding aesonOptions
 
+defaultRequest :: Request
+defaultRequest =
+  Request
+    { clientIp = Nothing
+    , headers = Nothing
+    , httpMethod = Nothing
+    , url = Nothing
+    , referer = Nothing
+    }
+
 exampleRequest :: Request
-exampleRequest = Request
-  { clientIp = Just "192.168.44.0"
-  , headers = Nothing
-  , httpMethod = Just "PUT"
-  , url = Just "http://example.com/users/19/settings"
-  , referer = Just "http://example.com?q=awesome"
-  }
+exampleRequest =
+  Request
+    { clientIp = Just "192.168.44.0"
+    , headers = Nothing
+    , httpMethod = Just "PUT"
+    , url = Just "http://example.com/users/19/settings"
+    , referer = Just "http://example.com?q=awesome"
+    }
diff --git a/src/Data/Bugsnag/Types/RuntimeVersion.hs b/src/Data/Bugsnag/Types/RuntimeVersion.hs
--- a/src/Data/Bugsnag/Types/RuntimeVersion.hs
+++ b/src/Data/Bugsnag/Types/RuntimeVersion.hs
@@ -1,7 +1,9 @@
 module Data.Bugsnag.Types.RuntimeVersion
   ( RuntimeVersion (..)
   , exampleRuntimeVersion
-  ) where
+  , defaultRuntimeVersion
+  )
+where
 
 import Data.Bugsnag.Types.Prelude
 
@@ -113,7 +115,7 @@
   , wordpress :: Maybe Text
   -- ^ Wordpress version (PHP only).
   }
-  deriving stock (Eq, Show, Generic)
+  deriving stock (Eq, Generic, Show)
 
 instance FromJSON RuntimeVersion where
   parseJSON = genericParseJSON aesonOptions
@@ -122,58 +124,116 @@
   toJSON = genericToJSON aesonOptions
   toEncoding = genericToEncoding aesonOptions
 
+defaultRuntimeVersion :: RuntimeVersion
+defaultRuntimeVersion =
+  RuntimeVersion
+    { androidApiLevel = Nothing
+    , bottle = Nothing
+    , celery = Nothing
+    , clangVersion = Nothing
+    , cocos2dx = Nothing
+    , delayedJob = Nothing
+    , django = Nothing
+    , dotnet = Nothing
+    , dotnetApiCompatibility = Nothing
+    , dotnetClr = Nothing
+    , dotnetScriptingRuntime = Nothing
+    , electron = Nothing
+    , eventMachine = Nothing
+    , expoApp = Nothing
+    , expoSdk = Nothing
+    , flask = Nothing
+    , gin = Nothing
+    , go = Nothing
+    , javaType = Nothing
+    , javaVersion = Nothing
+    , jruby = Nothing
+    , laravel = Nothing
+    , lumen = Nothing
+    , magento = Nothing
+    , mailman = Nothing
+    , martini = Nothing
+    , negroni = Nothing
+    , node = Nothing
+    , osBuild = Nothing
+    , php = Nothing
+    , python = Nothing
+    , que = Nothing
+    , rack = Nothing
+    , rails = Nothing
+    , rake = Nothing
+    , reactNative = Nothing
+    , reactNativeJsEngine = Nothing
+    , resque = Nothing
+    , revel = Nothing
+    , ruby = Nothing
+    , shoryoken = Nothing
+    , sidekiq = Nothing
+    , silex = Nothing
+    , sinatra = Nothing
+    , springBoot = Nothing
+    , springFramework = Nothing
+    , swift = Nothing
+    , symfony = Nothing
+    , tornado = Nothing
+    , unity = Nothing
+    , unityScriptingBackend = Nothing
+    , wordpress = Nothing
+    }
+
 exampleRuntimeVersion :: RuntimeVersion
-exampleRuntimeVersion = RuntimeVersion
-  { androidApiLevel = Just "28"
-  , bottle = Just "0.12.8"
-  , celery = Just "4.2.0"
-  , clangVersion = Just "7.0.1"
-  , cocos2dx = Just "3.17.2"
-  , delayedJob = Just "4.1.8"
-  , django = Just "2.1.7"
-  , dotnet = Just ".NET Framework 4.7.3416.0"
-  , dotnetApiCompatibility = Just ".NET 2.0 Subset"
-  , dotnetClr = Just "4.0.30319.17379"
-  , dotnetScriptingRuntime = Just ".NET 3.5 equivalent"
-  , electron = Just "11.4.3"
-  , eventMachine = Just "1.2.7"
-  , expoApp = Just "2.10.0.105125"
-  , expoSdk = Just "32.0.0"
-  , flask = Just "1.0.2"
-  , gin = Just "1.3.0"
-  , go = Just "1.11.2"
-  , javaType = Just "Java(TM) SE Runtime Environment"
-  , javaVersion = Just "1.8.0_131-b11"
-  , jruby = Just "9.2.5.0"
-  , laravel = Just "5.7.22"
-  , lumen = Just "5.7"
-  , magento = Just "2.3.0"
-  , mailman = Just "0.8.0"
-  , martini = Just "1.0"
-  , negroni = Just "1.0.0"
-  , node = Just "10.14.1"
-  , osBuild = Just "16D57"
-  , php = Just "7.2.12"
-  , python = Just "3.7.1"
-  , que = Just "0.14.3"
-  , rack = Just "2.0.6"
-  , rails = Just "5.2.2"
-  , rake = Just "12.3.2"
-  , reactNative = Just "0.57.5"
-  , reactNativeJsEngine = Just "hermes"
-  , resque = Just "2.0.0"
-  , revel = Just "0.21.0"
-  , ruby = Just "2.5.3"
-  , shoryoken = Just "5.0.1"
-  , sidekiq = Just "5.1.3"
-  , silex = Just "2.1.0"
-  , sinatra = Just "2.0.3"
-  , springBoot = Just "1.5.13.RELEASE"
-  , springFramework = Just "4.2.13.RELEASE"
-  , swift = Just "4.2"
-  , symfony = Just "4.2.11"
-  , tornado = Just "5.1.1"
-  , unity = Just "2018.2.17"
-  , unityScriptingBackend = Just "Mono"
-  , wordpress = Just "5.1"
-  }
+exampleRuntimeVersion =
+  RuntimeVersion
+    { androidApiLevel = Just "28"
+    , bottle = Just "0.12.8"
+    , celery = Just "4.2.0"
+    , clangVersion = Just "7.0.1"
+    , cocos2dx = Just "3.17.2"
+    , delayedJob = Just "4.1.8"
+    , django = Just "2.1.7"
+    , dotnet = Just ".NET Framework 4.7.3416.0"
+    , dotnetApiCompatibility = Just ".NET 2.0 Subset"
+    , dotnetClr = Just "4.0.30319.17379"
+    , dotnetScriptingRuntime = Just ".NET 3.5 equivalent"
+    , electron = Just "11.4.3"
+    , eventMachine = Just "1.2.7"
+    , expoApp = Just "2.10.0.105125"
+    , expoSdk = Just "32.0.0"
+    , flask = Just "1.0.2"
+    , gin = Just "1.3.0"
+    , go = Just "1.11.2"
+    , javaType = Just "Java(TM) SE Runtime Environment"
+    , javaVersion = Just "1.8.0_131-b11"
+    , jruby = Just "9.2.5.0"
+    , laravel = Just "5.7.22"
+    , lumen = Just "5.7"
+    , magento = Just "2.3.0"
+    , mailman = Just "0.8.0"
+    , martini = Just "1.0"
+    , negroni = Just "1.0.0"
+    , node = Just "10.14.1"
+    , osBuild = Just "16D57"
+    , php = Just "7.2.12"
+    , python = Just "3.7.1"
+    , que = Just "0.14.3"
+    , rack = Just "2.0.6"
+    , rails = Just "5.2.2"
+    , rake = Just "12.3.2"
+    , reactNative = Just "0.57.5"
+    , reactNativeJsEngine = Just "hermes"
+    , resque = Just "2.0.0"
+    , revel = Just "0.21.0"
+    , ruby = Just "2.5.3"
+    , shoryoken = Just "5.0.1"
+    , sidekiq = Just "5.1.3"
+    , silex = Just "2.1.0"
+    , sinatra = Just "2.0.3"
+    , springBoot = Just "1.5.13.RELEASE"
+    , springFramework = Just "4.2.13.RELEASE"
+    , swift = Just "4.2"
+    , symfony = Just "4.2.11"
+    , tornado = Just "5.1.1"
+    , unity = Just "2018.2.17"
+    , unityScriptingBackend = Just "Mono"
+    , wordpress = Just "5.1"
+    }
diff --git a/src/Data/Bugsnag/Types/Session.hs b/src/Data/Bugsnag/Types/Session.hs
--- a/src/Data/Bugsnag/Types/Session.hs
+++ b/src/Data/Bugsnag/Types/Session.hs
@@ -1,7 +1,9 @@
 module Data.Bugsnag.Types.Session
   ( Session (..)
   , exampleSession
-  ) where
+  , defaultSession
+  )
+where
 
 import Data.Bugsnag.Types.Prelude
 
@@ -21,7 +23,7 @@
   -- at which the session started.
   , events :: SessionEvent
   }
-  deriving stock (Eq, Show, Generic)
+  deriving stock (Eq, Generic, Show)
 
 instance FromJSON Session where
   parseJSON = genericParseJSON aesonOptions
@@ -30,9 +32,18 @@
   toJSON = genericToJSON aesonOptions
   toEncoding = genericToEncoding aesonOptions
 
+defaultSession :: Text -> Text -> SessionEvent -> Session
+defaultSession id startedAt events =
+  Session
+    { id
+    , startedAt
+    , events
+    }
+
 exampleSession :: Session
-exampleSession = Session
-  { id = "9f65c975-8155-456f-91e5-c4c4b3db0555"
-  , startedAt = "2017-01-01T14:30:00.000Z"
-  , events = exampleSessionEvent
-  }
+exampleSession =
+  Session
+    { id = "9f65c975-8155-456f-91e5-c4c4b3db0555"
+    , startedAt = "2017-01-01T14:30:00.000Z"
+    , events = exampleSessionEvent
+    }
diff --git a/src/Data/Bugsnag/Types/SessionEvent.hs b/src/Data/Bugsnag/Types/SessionEvent.hs
--- a/src/Data/Bugsnag/Types/SessionEvent.hs
+++ b/src/Data/Bugsnag/Types/SessionEvent.hs
@@ -1,7 +1,9 @@
 module Data.Bugsnag.Types.SessionEvent
   ( SessionEvent (..)
   , exampleSessionEvent
-  ) where
+  , defaultSessionEvent
+  )
+where
 
 import Data.Bugsnag.Types.Prelude
 
@@ -15,7 +17,7 @@
   -- ^ The number of unhandled events that have occurred in this session
   -- (including this event)
   }
-  deriving stock (Eq, Show, Generic)
+  deriving stock (Eq, Generic, Show)
 
 instance FromJSON SessionEvent where
   parseJSON = genericParseJSON aesonOptions
@@ -24,8 +26,16 @@
   toJSON = genericToJSON aesonOptions
   toEncoding = genericToEncoding aesonOptions
 
+defaultSessionEvent :: Int -> Int -> SessionEvent
+defaultSessionEvent handled unhandled =
+  SessionEvent
+    { handled
+    , unhandled
+    }
+
 exampleSessionEvent :: SessionEvent
-exampleSessionEvent = SessionEvent
-  { handled = 1
-  , unhandled = 1
-  }
+exampleSessionEvent =
+  SessionEvent
+    { handled = 1
+    , unhandled = 1
+    }
diff --git a/src/Data/Bugsnag/Types/Severity.hs b/src/Data/Bugsnag/Types/Severity.hs
--- a/src/Data/Bugsnag/Types/Severity.hs
+++ b/src/Data/Bugsnag/Types/Severity.hs
@@ -1,7 +1,8 @@
 module Data.Bugsnag.Types.Severity
   ( Severity (..)
   , exampleSeverity
-  ) where
+  )
+where
 
 import Data.Bugsnag.Types.Prelude
 
@@ -16,7 +17,7 @@
   = Error
   | Warning
   | Info
-  deriving stock (Bounded, Enum, Eq, Show, Generic)
+  deriving stock (Bounded, Enum, Eq, Generic, Show)
 
 instance FromJSON Severity where
   parseJSON = genericParseJSON aesonOptions
diff --git a/src/Data/Bugsnag/Types/SeverityReason.hs b/src/Data/Bugsnag/Types/SeverityReason.hs
--- a/src/Data/Bugsnag/Types/SeverityReason.hs
+++ b/src/Data/Bugsnag/Types/SeverityReason.hs
@@ -1,12 +1,14 @@
 module Data.Bugsnag.Types.SeverityReason
   ( SeverityReason (..)
   , exampleSeverityReason
-  ) where
+  , defaultSeverityReason
+  )
+where
 
 import Data.Bugsnag.Types.Prelude
 
-import Data.Bugsnag.Types.SeverityReasonType
 import Data.Bugsnag.Types.SeverityReasonAttributes
+import Data.Bugsnag.Types.SeverityReasonType
 
 -- | Information about why the severity was picked.
 data SeverityReason = SeverityReason
@@ -54,7 +56,7 @@
   -- ^ Whether the event\'s @unhandled@ flag was overridden from the
   -- notifier\'s default value.
   }
-  deriving stock (Eq, Show, Generic)
+  deriving stock (Eq, Generic, Show)
 
 instance FromJSON SeverityReason where
   parseJSON = genericParseJSON aesonOptions
@@ -63,9 +65,18 @@
   toJSON = genericToJSON aesonOptions
   toEncoding = genericToEncoding aesonOptions
 
+defaultSeverityReason :: SeverityReason
+defaultSeverityReason =
+  SeverityReason
+    { type_ = Nothing
+    , attributes = Nothing
+    , unhandledOverridden = Nothing
+    }
+
 exampleSeverityReason :: SeverityReason
-exampleSeverityReason = SeverityReason
-  { type_ = Just exampleSeverityReasonType
-  , attributes = Just exampleSeverityReasonAttributes
-  , unhandledOverridden = Just False
-  }
+exampleSeverityReason =
+  SeverityReason
+    { type_ = Just exampleSeverityReasonType
+    , attributes = Just exampleSeverityReasonAttributes
+    , unhandledOverridden = Just False
+    }
diff --git a/src/Data/Bugsnag/Types/SeverityReasonAttributes.hs b/src/Data/Bugsnag/Types/SeverityReasonAttributes.hs
--- a/src/Data/Bugsnag/Types/SeverityReasonAttributes.hs
+++ b/src/Data/Bugsnag/Types/SeverityReasonAttributes.hs
@@ -1,7 +1,9 @@
 module Data.Bugsnag.Types.SeverityReasonAttributes
   ( SeverityReasonAttributes (..)
   , exampleSeverityReasonAttributes
-  ) where
+  , defaultSeverityReasonAttributes
+  )
+where
 
 import Data.Bugsnag.Types.Prelude
 
@@ -29,7 +31,7 @@
   -- ^ Included for @exceptionClass@ severity reason. Specifies the error class
   -- that is automatically sent.
   }
-  deriving stock (Eq, Show, Generic)
+  deriving stock (Eq, Generic, Show)
 
 instance FromJSON SeverityReasonAttributes where
   parseJSON = genericParseJSON aesonOptions
@@ -38,13 +40,26 @@
   toJSON = genericToJSON aesonOptions
   toEncoding = genericToEncoding aesonOptions
 
+defaultSeverityReasonAttributes :: SeverityReasonAttributes
+defaultSeverityReasonAttributes =
+  SeverityReasonAttributes
+    { errorType = Nothing
+    , level = Nothing
+    , signalType = Nothing
+    , violationType = Nothing
+    , errorClass = Nothing
+    , framework = Nothing
+    , exceptionClass = Nothing
+    }
+
 exampleSeverityReasonAttributes :: SeverityReasonAttributes
-exampleSeverityReasonAttributes = SeverityReasonAttributes
-  { errorType = Just "E_ERROR"
-  , level = Just "Error"
-  , signalType = Just "SIGSEGV"
-  , violationType = Just "NetworkOnMainThread"
-  , errorClass = Just "ActiveRecord::RecordNotFound"
-  , framework = Just "Rack"
-  , exceptionClass = Just "TypeMismatchException"
-  }
+exampleSeverityReasonAttributes =
+  SeverityReasonAttributes
+    { errorType = Just "E_ERROR"
+    , level = Just "Error"
+    , signalType = Just "SIGSEGV"
+    , violationType = Just "NetworkOnMainThread"
+    , errorClass = Just "ActiveRecord::RecordNotFound"
+    , framework = Just "Rack"
+    , exceptionClass = Just "TypeMismatchException"
+    }
diff --git a/src/Data/Bugsnag/Types/SeverityReasonType.hs b/src/Data/Bugsnag/Types/SeverityReasonType.hs
--- a/src/Data/Bugsnag/Types/SeverityReasonType.hs
+++ b/src/Data/Bugsnag/Types/SeverityReasonType.hs
@@ -1,7 +1,8 @@
 module Data.Bugsnag.Types.SeverityReasonType
   ( SeverityReasonType (..)
   , exampleSeverityReasonType
-  ) where
+  )
+where
 
 import Data.Bugsnag.Types.Prelude
 
@@ -66,7 +67,7 @@
   | AppHang
   | OutOfMemory
   | ThermalKill
-  deriving stock (Bounded, Enum, Eq, Show, Generic)
+  deriving stock (Bounded, Enum, Eq, Generic, Show)
 
 instance FromJSON SeverityReasonType where
   parseJSON = genericParseJSON aesonOptions
diff --git a/src/Data/Bugsnag/Types/Stackframe.hs b/src/Data/Bugsnag/Types/Stackframe.hs
--- a/src/Data/Bugsnag/Types/Stackframe.hs
+++ b/src/Data/Bugsnag/Types/Stackframe.hs
@@ -1,7 +1,9 @@
 module Data.Bugsnag.Types.Stackframe
   ( Stackframe (..)
   , exampleStackframe
-  ) where
+  , defaultStackframe
+  )
+where
 
 import Data.Bugsnag.Types.Prelude
 
@@ -54,7 +56,7 @@
   , codeIdentifier :: Maybe Text
   -- ^ The ID of the executable\/library that the frame relates to.
   }
-  deriving stock (Eq, Show, Generic)
+  deriving stock (Eq, Generic, Show)
 
 instance FromJSON Stackframe where
   parseJSON = genericParseJSON aesonOptions
@@ -63,22 +65,44 @@
   toJSON = genericToJSON aesonOptions
   toEncoding = genericToEncoding aesonOptions
 
+defaultStackframe :: Text -> Int -> Text -> Stackframe
+defaultStackframe file lineNumber method =
+  Stackframe
+    { file
+    , lineNumber
+    , method
+    , columnNumber = Nothing
+    , inProject = Nothing
+    , code = Nothing
+    , frameAddress = Nothing
+    , loadAddress = Nothing
+    , isLR = Nothing
+    , isPC = Nothing
+    , symbolAddress = Nothing
+    , machoFile = Nothing
+    , machoLoadAddress = Nothing
+    , machoUUID = Nothing
+    , machoVMAddress = Nothing
+    , codeIdentifier = Nothing
+    }
+
 exampleStackframe :: Stackframe
-exampleStackframe = Stackframe
-  { file = "controllers/auth/session_controller.rb"
-  , lineNumber = 1234
-  , columnNumber = Just 123
-  , method = "create"
-  , inProject = Just True
-  , code = Nothing
-  , frameAddress = Just "0x000000010d131040"
-  , loadAddress = Just "0x000000010d12e000"
-  , isLR = Nothing
-  , isPC = Just True
-  , symbolAddress = Just "0x000000010d130fe6"
-  , machoFile = Just "/System/Library/Frameworks/Foundation.framework/Foundation"
-  , machoLoadAddress = Just "0x000000010d12e000"
-  , machoUUID = Just "B3196052-BAF1-3EA5-AD28-F9E6ECCF0B03"
-  , machoVMAddress = Just "0x0000000100000000"
-  , codeIdentifier = Just "b6b529d5e58421a0fba0fa2c5c2c5f3e"
-  }
+exampleStackframe =
+  Stackframe
+    { file = "controllers/auth/session_controller.rb"
+    , lineNumber = 1234
+    , columnNumber = Just 123
+    , method = "create"
+    , inProject = Just True
+    , code = Nothing
+    , frameAddress = Just "0x000000010d131040"
+    , loadAddress = Just "0x000000010d12e000"
+    , isLR = Nothing
+    , isPC = Just True
+    , symbolAddress = Just "0x000000010d130fe6"
+    , machoFile = Just "/System/Library/Frameworks/Foundation.framework/Foundation"
+    , machoLoadAddress = Just "0x000000010d12e000"
+    , machoUUID = Just "B3196052-BAF1-3EA5-AD28-F9E6ECCF0B03"
+    , machoVMAddress = Just "0x0000000100000000"
+    , codeIdentifier = Just "b6b529d5e58421a0fba0fa2c5c2c5f3e"
+    }
diff --git a/src/Data/Bugsnag/Types/Thread.hs b/src/Data/Bugsnag/Types/Thread.hs
--- a/src/Data/Bugsnag/Types/Thread.hs
+++ b/src/Data/Bugsnag/Types/Thread.hs
@@ -1,12 +1,14 @@
 module Data.Bugsnag.Types.Thread
   ( Thread (..)
   , exampleThread
-  ) where
+  , defaultThread
+  )
+where
 
 import Data.Bugsnag.Types.Prelude
 
-import Data.Bugsnag.Types.Stackframe
 import Data.Bugsnag.Types.ErrorType
+import Data.Bugsnag.Types.Stackframe
 
 data Thread = Thread
   { id :: Maybe Text
@@ -23,7 +25,7 @@
   -- ^ The state of the thread at the time of the error.
   , type_ :: Maybe ErrorType
   }
-  deriving stock (Eq, Show, Generic)
+  deriving stock (Eq, Generic, Show)
 
 instance FromJSON Thread where
   parseJSON = genericParseJSON aesonOptions
@@ -32,12 +34,24 @@
   toJSON = genericToJSON aesonOptions
   toEncoding = genericToEncoding aesonOptions
 
+defaultThread :: Thread
+defaultThread =
+  Thread
+    { id = Nothing
+    , name = Nothing
+    , errorReportingThread = Nothing
+    , stacktrace = Nothing
+    , state = Nothing
+    , type_ = Nothing
+    }
+
 exampleThread :: Thread
-exampleThread = Thread
-  { id = Just "thread_id"
-  , name = Just "thread_name"
-  , errorReportingThread = Just True
-  , stacktrace = Just [exampleStackframe]
-  , state = Just "WAITING"
-  , type_ = Just exampleErrorType
-  }
+exampleThread =
+  Thread
+    { id = Just "thread_id"
+    , name = Just "thread_name"
+    , errorReportingThread = Just True
+    , stacktrace = Just [exampleStackframe]
+    , state = Just "WAITING"
+    , type_ = Just exampleErrorType
+    }
diff --git a/src/Data/Bugsnag/Types/User.hs b/src/Data/Bugsnag/Types/User.hs
--- a/src/Data/Bugsnag/Types/User.hs
+++ b/src/Data/Bugsnag/Types/User.hs
@@ -1,7 +1,9 @@
 module Data.Bugsnag.Types.User
   ( User (..)
   , exampleUser
-  ) where
+  , defaultUser
+  )
+where
 
 import Data.Bugsnag.Types.Prelude
 
@@ -18,7 +20,7 @@
   , email :: Maybe Text
   -- ^ The user\'s email address.
   }
-  deriving stock (Eq, Show, Generic)
+  deriving stock (Eq, Generic, Show)
 
 instance FromJSON User where
   parseJSON = genericParseJSON aesonOptions
@@ -27,9 +29,18 @@
   toJSON = genericToJSON aesonOptions
   toEncoding = genericToEncoding aesonOptions
 
+defaultUser :: User
+defaultUser =
+  User
+    { id = Nothing
+    , name = Nothing
+    , email = Nothing
+    }
+
 exampleUser :: User
-exampleUser = User
-  { id = Just "19"
-  , name = Just "Robert Hawkins"
-  , email = Just "bob@example.com"
-  }
+exampleUser =
+  User
+    { id = Just "19"
+    , name = Just "Robert Hawkins"
+    , email = Just "bob@example.com"
+    }
