             let properties = ["distinct_id": distinctId, "alias": alias]
             track(event: "$create_alias", properties: properties)
             identify(distinctId: distinctId, usePeople: usePeople)
-            flush()
+            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.
-     */
-    open func reset() {
+     
+     - 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

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

     - parameter alias:      A unique identifier that you want to use as an identifier for this user.
     - parameter distinctId: The current user identifier.
     - parameter usePeople: boolean that controls whether or not to set the people distinctId to the event distinctId.
     - parameter completion: an optional completion handler for when the createAlias has completed.
     This should only be set to false if you wish to prevent people profile updates for that user.
     */
    open func createAlias(_ alias: String, distinctId: String, usePeople: Bool = true, completion: (() -> Void)? = nil) {
        if hasOptedOutTracking() {
            return
        }
