      - parameter distinctId: string that uniquely identifies the current user
      - parameter usePeople: boolean that controls whether or not to set the people distinctId to the event distinctId.
                             This should only be set to false if you wish to prevent people profile updates for that user.
-     */
-    open func identify(distinctId: String, usePeople: Bool = true) {
+     - parameter completion: an optional completion handler for when the identify has completed.
+     */
+    open func identify(distinctId: String, usePeople: Bool = true, completion: (() -> Void)? = nil) {
         if hasOptedOutTracking() {
             return
         }

                    self.connectIntegrations.reset()
                    MixpanelTweaks.defaultStore.reset()
                    #endif // DECIDE
                }
                self?.archive()
            }

            let properties = ["distinct_id": distinctId, "alias": alias]
            track(event: "$create_alias", properties: properties)
            identify(distinctId: distinctId, usePeople: usePeople)
            flush(completion: completion)
        } else {
            Logger.error(message: "alias: \(alias) matches distinctId: \(distinctId) - skipping api call.")
            if let completion = completion {
                DispatchQueue.main.async(execute: completion)
            }
        }
    }

    /**
     Clears all stored properties including the distinct Id.
     Useful if your app's user logs out.
     
     - parameter completion: an optional completion handler for when the reset has completed.
     */
    open func reset(completion: (() -> Void)? = nil) {
        flush()
        trackingQueue.async { [weak self] in
            self?.networkQueue.sync { [weak self] in
