diff --git a/config/webhooks.yml b/config/webhooks.yml
index 41c60e7e2..283a23ed4 100644
--- a/config/webhooks.yml
+++ b/config/webhooks.yml
@@ -7,11 +7,11 @@ beforeSendSingleMsg:
   # If not set, all contentType messages will through this filter.
   deniedTypes: []
 beforeUpdateUserInfoEx:
-  enable:  false
+  enable: false
   timeout: 5
   failedContinue: true
 afterUpdateUserInfoEx:
-  enable:  false
+  enable: false
   timeout: 5
 afterSendSingleMsg:
   enable: false
@@ -181,3 +181,19 @@ afterImportFriends:
 afterRemoveBlack:
   enable: false
   timeout: 5
+beforeCreateSingleChatConversations:
+  enable: false
+  timeout: 5
+  failedContinue: false
+afterCreateSingleChatConversations:
+  enable: false
+  timeout: 5
+  failedContinue: false
+beforeCreateGroupChatConversations:
+  enable: false
+  timeout: 5
+  failedContinue: false
+afterCreateGroupChatConversations:
+  enable: false
+  timeout: 5
+  failedContinue: false
diff --git a/internal/rpc/conversation/callback.go b/internal/rpc/conversation/callback.go
new file mode 100644
index 000000000..93e925afd
--- /dev/null
+++ b/internal/rpc/conversation/callback.go
@@ -0,0 +1,117 @@
+package conversation
+
+import (
+	"context"
+
+	"github.com/openimsdk/open-im-server/v3/pkg/callbackstruct"
+	"github.com/openimsdk/open-im-server/v3/pkg/common/config"
+	dbModel "github.com/openimsdk/open-im-server/v3/pkg/common/storage/model"
+	"github.com/openimsdk/open-im-server/v3/pkg/common/webhook"
+	"github.com/openimsdk/tools/utils/datautil"
+)
+
+func (c *conversationServer) webhookBeforeCreateSingleChatConversations(ctx context.Context, before *config.BeforeConfig, req *dbModel.Conversation) error {
+	return webhook.WithCondition(ctx, before, func(ctx context.Context) error {
+		cbReq := &callbackstruct.CallbackBeforeCreateSingleChatConversationsReq{
+			CallbackCommand:  callbackstruct.CallbackBeforeCreateSingleChatConversationsCommand,
+			OwnerUserID:      req.OwnerUserID,
+			ConversationID:   req.ConversationID,
+			ConversationType: req.ConversationType,
+			UserID:           req.UserID,
+			RecvMsgOpt:       req.RecvMsgOpt,
+			IsPinned:         req.IsPinned,
+			IsPrivateChat:    req.IsPrivateChat,
+			BurnDuration:     req.BurnDuration,
+			GroupAtType:      req.GroupAtType,
+			AttachedInfo:     req.AttachedInfo,
+			Ex:               req.Ex,
+		}
+
+		resp := &callbackstruct.CallbackBeforeCreateSingleChatConversationsResp{}
+
+		if err := c.webhookClient.SyncPost(ctx, cbReq.GetCallbackCommand(), cbReq, resp, before); err != nil {
+			return err
+		}
+
+		datautil.NotNilReplace(&req.RecvMsgOpt, resp.RecvMsgOpt)
+		datautil.NotNilReplace(&req.IsPinned, resp.IsPinned)
+		datautil.NotNilReplace(&req.IsPrivateChat, resp.IsPrivateChat)
+		datautil.NotNilReplace(&req.BurnDuration, resp.BurnDuration)
+		datautil.NotNilReplace(&req.GroupAtType, resp.GroupAtType)
+		datautil.NotNilReplace(&req.AttachedInfo, resp.AttachedInfo)
+		datautil.NotNilReplace(&req.Ex, resp.Ex)
+		return nil
+	})
+}
+
+func (c *conversationServer) webhookAfterCreateSingleChatConversations(ctx context.Context, after *config.AfterConfig, req *dbModel.Conversation) error {
+	cbReq := &callbackstruct.CallbackAfterCreateSingleChatConversationsReq{
+		CallbackCommand:  callbackstruct.CallbackAfterCreateSingleChatConversationsCommand,
+		OwnerUserID:      req.OwnerUserID,
+		ConversationID:   req.ConversationID,
+		ConversationType: req.ConversationType,
+		UserID:           req.UserID,
+		RecvMsgOpt:       req.RecvMsgOpt,
+		IsPinned:         req.IsPinned,
+		IsPrivateChat:    req.IsPrivateChat,
+		BurnDuration:     req.BurnDuration,
+		GroupAtType:      req.GroupAtType,
+		AttachedInfo:     req.AttachedInfo,
+		Ex:               req.Ex,
+	}
+
+	c.webhookClient.AsyncPost(ctx, cbReq.GetCallbackCommand(), cbReq, &callbackstruct.CallbackAfterCreateSingleChatConversationsResp{}, after)
+	return nil
+}
+
+func (c *conversationServer) webhookBeforeCreateGroupChatConversations(ctx context.Context, before *config.BeforeConfig, req *dbModel.Conversation) error {
+	return webhook.WithCondition(ctx, before, func(ctx context.Context) error {
+		cbReq := &callbackstruct.CallbackBeforeCreateGroupChatConversationsReq{
+			CallbackCommand:  callbackstruct.CallbackBeforeCreateGroupChatConversationsCommand,
+			ConversationID:   req.ConversationID,
+			ConversationType: req.ConversationType,
+			GroupID:          req.GroupID,
+			RecvMsgOpt:       req.RecvMsgOpt,
+			IsPinned:         req.IsPinned,
+			IsPrivateChat:    req.IsPrivateChat,
+			BurnDuration:     req.BurnDuration,
+			GroupAtType:      req.GroupAtType,
+			AttachedInfo:     req.AttachedInfo,
+			Ex:               req.Ex,
+		}
+
+		resp := &callbackstruct.CallbackBeforeCreateGroupChatConversationsResp{}
+
+		if err := c.webhookClient.SyncPost(ctx, cbReq.GetCallbackCommand(), cbReq, resp, before); err != nil {
+			return err
+		}
+
+		datautil.NotNilReplace(&req.RecvMsgOpt, resp.RecvMsgOpt)
+		datautil.NotNilReplace(&req.IsPinned, resp.IsPinned)
+		datautil.NotNilReplace(&req.IsPrivateChat, resp.IsPrivateChat)
+		datautil.NotNilReplace(&req.BurnDuration, resp.BurnDuration)
+		datautil.NotNilReplace(&req.GroupAtType, resp.GroupAtType)
+		datautil.NotNilReplace(&req.AttachedInfo, resp.AttachedInfo)
+		datautil.NotNilReplace(&req.Ex, resp.Ex)
+		return nil
+	})
+}
+
+func (c *conversationServer) webhookAfterCreateGroupChatConversations(ctx context.Context, after *config.AfterConfig, req *dbModel.Conversation) error {
+	cbReq := &callbackstruct.CallbackAfterCreateGroupChatConversationsReq{
+		CallbackCommand:  callbackstruct.CallbackAfterCreateGroupChatConversationsCommand,
+		ConversationID:   req.ConversationID,
+		ConversationType: req.ConversationType,
+		GroupID:          req.GroupID,
+		RecvMsgOpt:       req.RecvMsgOpt,
+		IsPinned:         req.IsPinned,
+		IsPrivateChat:    req.IsPrivateChat,
+		BurnDuration:     req.BurnDuration,
+		GroupAtType:      req.GroupAtType,
+		AttachedInfo:     req.AttachedInfo,
+		Ex:               req.Ex,
+	}
+
+	c.webhookClient.AsyncPost(ctx, cbReq.GetCallbackCommand(), cbReq, &callbackstruct.CallbackAfterCreateGroupChatConversationsResp{}, after)
+	return nil
+}
diff --git a/internal/rpc/conversation/conversation.go b/internal/rpc/conversation/conversation.go
index 76dd606aa..436a433ec 100644
--- a/internal/rpc/conversation/conversation.go
+++ b/internal/rpc/conversation/conversation.go
@@ -26,6 +26,7 @@ import (
 	"github.com/openimsdk/open-im-server/v3/pkg/common/storage/database/mgo"
 	"github.com/openimsdk/open-im-server/v3/pkg/common/storage/model"
 	dbModel "github.com/openimsdk/open-im-server/v3/pkg/common/storage/model"
+	"github.com/openimsdk/open-im-server/v3/pkg/common/webhook"
 	"github.com/openimsdk/open-im-server/v3/pkg/localcache"
 	"github.com/openimsdk/open-im-server/v3/pkg/msgprocessor"
 	"github.com/openimsdk/tools/db/redisutil"
@@ -51,9 +52,10 @@ type conversationServer struct {
 	conversationNotificationSender *ConversationNotificationSender
 	config                         *Config
 
-	userClient  *rpcli.UserClient
-	msgClient   *rpcli.MsgClient
-	groupClient *rpcli.GroupClient
+	webhookClient *webhook.Client
+	userClient    *rpcli.UserClient
+	msgClient     *rpcli.MsgClient
+	groupClient   *rpcli.GroupClient
 }
 
 type Config struct {
@@ -62,6 +64,7 @@ type Config struct {
 	MongodbConfig      config.Mongo
 	NotificationConfig config.Notification
 	Share              config.Share
+	WebhooksConfig     config.Webhooks
 	LocalCacheConfig   config.LocalCache
 	Discovery          config.Discovery
 }
@@ -91,16 +94,25 @@ func Start(ctx context.Context, config *Config, client discovery.SvcDiscoveryReg
 	if err != nil {
 		return err
 	}
+
 	msgClient := rpcli.NewMsgClient(msgConn)
+
+	cs := conversationServer{
+		config:        config,
+		webhookClient: webhook.NewWebhookClient(config.WebhooksConfig.URL),
+		userClient:    rpcli.NewUserClient(userConn),
+		groupClient:   rpcli.NewGroupClient(groupConn),
+		msgClient:     msgClient,
+	}
+
+	cs.conversationNotificationSender = NewConversationNotificationSender(&config.NotificationConfig, msgClient)
+	cs.conversationDatabase = controller.NewConversationDatabase(
+		conversationDB,
+		redis.NewConversationRedis(rdb, &config.LocalCacheConfig, conversationDB),
+		mgocli.GetTx())
+
 	localcache.InitLocalCache(&config.LocalCacheConfig)
-	pbconversation.RegisterConversationServer(server, &conversationServer{
-		conversationNotificationSender: NewConversationNotificationSender(&config.NotificationConfig, msgClient),
-		conversationDatabase: controller.NewConversationDatabase(conversationDB,
-			redis.NewConversationRedis(rdb, &config.LocalCacheConfig, redis.GetRocksCacheOptions(), conversationDB), mgocli.GetTx()),
-		userClient:  rpcli.NewUserClient(userConn),
-		groupClient: rpcli.NewGroupClient(groupConn),
-		msgClient:   msgClient,
-	})
+	pbconversation.RegisterConversationServer(server, &cs)
 	return nil
 }
 
@@ -406,49 +418,76 @@ func (c *conversationServer) GetRecvMsgNotNotifyUserIDs(ctx context.Context, req
 func (c *conversationServer) CreateSingleChatConversations(ctx context.Context,
 	req *pbconversation.CreateSingleChatConversationsReq,
 ) (*pbconversation.CreateSingleChatConversationsResp, error) {
+	var conversation dbModel.Conversation
 	switch req.ConversationType {
 	case constant.SingleChatType:
-		var conversation dbModel.Conversation
+		// sendUser create
 		conversation.ConversationID = req.ConversationID
 		conversation.ConversationType = req.ConversationType
 		conversation.OwnerUserID = req.SendID
 		conversation.UserID = req.RecvID
+		if err := c.webhookBeforeCreateSingleChatConversations(ctx, &c.config.WebhooksConfig.BeforeCreateSingleChatConversations, &conversation); err != nil && err != servererrs.ErrCallbackContinue {
+			return nil, err
+		}
+
 		err := c.conversationDatabase.CreateConversation(ctx, []*dbModel.Conversation{&conversation})
 		if err != nil {
 			log.ZWarn(ctx, "create conversation failed", err, "conversation", conversation)
 		}
 
+		c.webhookAfterCreateSingleChatConversations(ctx, &c.config.WebhooksConfig.AfterCreateSingleChatConversations, &conversation)
+
+		// recvUser create
 		conversation2 := conversation
 		conversation2.OwnerUserID = req.RecvID
 		conversation2.UserID = req.SendID
+		if err := c.webhookBeforeCreateSingleChatConversations(ctx, &c.config.WebhooksConfig.BeforeCreateSingleChatConversations, &conversation); err != nil && err != servererrs.ErrCallbackContinue {
+			return nil, err
+		}
+
 		err = c.conversationDatabase.CreateConversation(ctx, []*dbModel.Conversation{&conversation2})
 		if err != nil {
 			log.ZWarn(ctx, "create conversation failed", err, "conversation2", conversation)
 		}
+
+		c.webhookAfterCreateSingleChatConversations(ctx, &c.config.WebhooksConfig.AfterCreateSingleChatConversations, &conversation2)
 	case constant.NotificationChatType:
-		var conversation dbModel.Conversation
 		conversation.ConversationID = req.ConversationID
 		conversation.ConversationType = req.ConversationType
 		conversation.OwnerUserID = req.RecvID
 		conversation.UserID = req.SendID
+		if err := c.webhookBeforeCreateSingleChatConversations(ctx, &c.config.WebhooksConfig.BeforeCreateSingleChatConversations, &conversation); err != nil && err != servererrs.ErrCallbackContinue {
+			return nil, err
+		}
+
 		err := c.conversationDatabase.CreateConversation(ctx, []*dbModel.Conversation{&conversation})
 		if err != nil {
 			log.ZWarn(ctx, "create conversation failed", err, "conversation2", conversation)
 		}
+
+		c.webhookAfterCreateSingleChatConversations(ctx, &c.config.WebhooksConfig.AfterCreateSingleChatConversations, &conversation)
 	}
 
 	return &pbconversation.CreateSingleChatConversationsResp{}, nil
 }
 
 func (c *conversationServer) CreateGroupChatConversations(ctx context.Context, req *pbconversation.CreateGroupChatConversationsReq) (*pbconversation.CreateGroupChatConversationsResp, error) {
-	err := c.conversationDatabase.CreateGroupChatConversation(ctx, req.GroupID, req.UserIDs)
+	var conversation dbModel.Conversation
+
+	conversation.ConversationID = msgprocessor.GetConversationIDBySessionType(constant.ReadGroupChatType, req.GroupID)
+	conversation.GroupID = req.GroupID
+	conversation.ConversationType = constant.ReadGroupChatType
+
+	if err := c.webhookBeforeCreateGroupChatConversations(ctx, &c.config.WebhooksConfig.BeforeCreateGroupChatConversations, &conversation); err != nil {
+		return nil, err
+	}
+
+	err := c.conversationDatabase.CreateGroupChatConversation(ctx, req.GroupID, req.UserIDs, &conversation)
 	if err != nil {
 		return nil, err
 	}
-	conversationID := msgprocessor.GetConversationIDBySessionType(constant.ReadGroupChatType, req.GroupID)
-	if err := c.msgClient.SetUserConversationMaxSeq(ctx, conversationID, req.UserIDs, 0); err != nil {
-		return nil, err
-	}
+
+	c.webhookAfterCreateGroupChatConversations(ctx, &c.config.WebhooksConfig.AfterCreateGroupChatConversations, &conversation)
 	return &pbconversation.CreateGroupChatConversationsResp{}, nil
 }
 
diff --git a/internal/tools/cron/cron_test.go b/internal/tools/cron/cron_test.go
new file mode 100644
index 000000000..af827fc38
--- /dev/null
+++ b/internal/tools/cron/cron_test.go
@@ -0,0 +1,64 @@
+package cron
+
+import (
+	"context"
+	"testing"
+
+	"github.com/openimsdk/open-im-server/v3/pkg/common/config"
+	kdisc "github.com/openimsdk/open-im-server/v3/pkg/common/discovery"
+	pbconversation "github.com/openimsdk/protocol/conversation"
+	"github.com/openimsdk/protocol/msg"
+	"github.com/openimsdk/protocol/third"
+	"github.com/openimsdk/tools/mcontext"
+	"github.com/openimsdk/tools/mw"
+	"github.com/robfig/cron/v3"
+	"google.golang.org/grpc"
+	"google.golang.org/grpc/credentials/insecure"
+)
+
+func TestName(t *testing.T) {
+	conf := &config.Discovery{
+		Enable: config.ETCD,
+		Etcd: config.Etcd{
+			RootDirectory: "openim",
+			Address:       []string{"localhost:12379"},
+		},
+	}
+	client, err := kdisc.NewDiscoveryRegister(conf, nil)
+	if err != nil {
+		panic(err)
+	}
+	client.AddOption(mw.GrpcClient(), grpc.WithTransportCredentials(insecure.NewCredentials()))
+	ctx := mcontext.SetOpUserID(context.Background(), "imAdmin")
+	msgConn, err := client.GetConn(ctx, "msg-rpc-service")
+	if err != nil {
+		panic(err)
+	}
+	thirdConn, err := client.GetConn(ctx, "third-rpc-service")
+	if err != nil {
+		panic(err)
+	}
+
+	conversationConn, err := client.GetConn(ctx, "conversation-rpc-service")
+	if err != nil {
+		panic(err)
+	}
+
+	srv := &cronServer{
+		ctx: ctx,
+		config: &Config{
+			CronTask: config.CronTask{
+				RetainChatRecords: 1,
+				FileExpireTime:    1,
+				DeleteObjectType:  []string{"msg-picture", "msg-file", "msg-voice", "msg-video", "msg-video-snapshot", "sdklog", ""},
+			},
+		},
+		cron:               cron.New(),
+		msgClient:          msg.NewMsgClient(msgConn),
+		conversationClient: pbconversation.NewConversationClient(conversationConn),
+		thirdClient:        third.NewThirdClient(thirdConn),
+	}
+	srv.deleteMsg()
+	//srv.clearS3()
+	//srv.clearUserMsg()
+}
diff --git a/pkg/callbackstruct/constant.go b/pkg/callbackstruct/constant.go
index 73f89a719..bbc34e71f 100644
--- a/pkg/callbackstruct/constant.go
+++ b/pkg/callbackstruct/constant.go
@@ -15,51 +15,55 @@
 package callbackstruct
 
 const (
-	CallbackBeforeInviteJoinGroupCommand    = "callbackBeforeInviteJoinGroupCommand"
-	CallbackAfterJoinGroupCommand           = "callbackAfterJoinGroupCommand"
-	CallbackAfterSetGroupInfoCommand        = "callbackAfterSetGroupInfoCommand"
-	CallbackAfterSetGroupInfoExCommand      = "callbackAfterSetGroupInfoExCommand"
-	CallbackBeforeSetGroupInfoCommand       = "callbackBeforeSetGroupInfoCommand"
-	CallbackBeforeSetGroupInfoExCommand     = "callbackBeforeSetGroupInfoExCommand"
-	CallbackAfterRevokeMsgCommand           = "callbackBeforeAfterMsgCommand"
-	CallbackBeforeAddBlackCommand           = "callbackBeforeAddBlackCommand"
-	CallbackAfterAddFriendCommand           = "callbackAfterAddFriendCommand"
-	CallbackBeforeAddFriendAgreeCommand     = "callbackBeforeAddFriendAgreeCommand"
-	CallbackAfterAddFriendAgreeCommand      = "callbackAfterAddFriendAgreeCommand"
-	CallbackAfterDeleteFriendCommand        = "callbackAfterDeleteFriendCommand"
-	CallbackBeforeImportFriendsCommand      = "callbackBeforeImportFriendsCommand"
-	CallbackAfterImportFriendsCommand       = "callbackAfterImportFriendsCommand"
-	CallbackAfterRemoveBlackCommand         = "callbackAfterRemoveBlackCommand"
-	CallbackAfterQuitGroupCommand           = "callbackAfterQuitGroupCommand"
-	CallbackAfterKickGroupCommand           = "callbackAfterKickGroupCommand"
-	CallbackAfterDisMissGroupCommand        = "callbackAfterDisMissGroupCommand"
-	CallbackBeforeJoinGroupCommand          = "callbackBeforeJoinGroupCommand"
-	CallbackAfterGroupMsgReadCommand        = "callbackAfterGroupMsgReadCommand"
-	CallbackBeforeMsgModifyCommand          = "callbackBeforeMsgModifyCommand"
-	CallbackAfterUpdateUserInfoCommand      = "callbackAfterUpdateUserInfoCommand"
-	CallbackAfterUpdateUserInfoExCommand    = "callbackAfterUpdateUserInfoExCommand"
-	CallbackBeforeUpdateUserInfoExCommand   = "callbackBeforeUpdateUserInfoExCommand"
-	CallbackBeforeUserRegisterCommand       = "callbackBeforeUserRegisterCommand"
-	CallbackAfterUserRegisterCommand        = "callbackAfterUserRegisterCommand"
-	CallbackAfterTransferGroupOwnerCommand  = "callbackAfterTransferGroupOwnerCommand"
-	CallbackBeforeSetFriendRemarkCommand    = "callbackBeforeSetFriendRemarkCommand"
-	CallbackAfterSetFriendRemarkCommand     = "callbackAfterSetFriendRemarkCommand"
-	CallbackAfterSingleMsgReadCommand       = "callbackAfterSingleMsgReadCommand"
-	CallbackBeforeSendSingleMsgCommand      = "callbackBeforeSendSingleMsgCommand"
-	CallbackAfterSendSingleMsgCommand       = "callbackAfterSendSingleMsgCommand"
-	CallbackBeforeSendGroupMsgCommand       = "callbackBeforeSendGroupMsgCommand"
-	CallbackAfterSendGroupMsgCommand        = "callbackAfterSendGroupMsgCommand"
-	CallbackAfterUserOnlineCommand          = "callbackAfterUserOnlineCommand"
-	CallbackAfterUserOfflineCommand         = "callbackAfterUserOfflineCommand"
-	CallbackAfterUserKickOffCommand         = "callbackAfterUserKickOffCommand"
-	CallbackBeforeOfflinePushCommand        = "callbackBeforeOfflinePushCommand"
-	CallbackBeforeOnlinePushCommand         = "callbackBeforeOnlinePushCommand"
-	CallbackBeforeGroupOnlinePushCommand    = "callbackBeforeGroupOnlinePushCommand"
-	CallbackBeforeAddFriendCommand          = "callbackBeforeAddFriendCommand"
-	CallbackBeforeUpdateUserInfoCommand     = "callbackBeforeUpdateUserInfoCommand"
-	CallbackBeforeCreateGroupCommand        = "callbackBeforeCreateGroupCommand"
-	CallbackAfterCreateGroupCommand         = "callbackAfterCreateGroupCommand"
-	CallbackBeforeMembersJoinGroupCommand   = "callbackBeforeMembersJoinGroupCommand"
-	CallbackBeforeSetGroupMemberInfoCommand = "callbackBeforeSetGroupMemberInfoCommand"
-	CallbackAfterSetGroupMemberInfoCommand  = "callbackAfterSetGroupMemberInfoCommand"
+	CallbackBeforeInviteJoinGroupCommand               = "callbackBeforeInviteJoinGroupCommand"
+	CallbackAfterJoinGroupCommand                      = "callbackAfterJoinGroupCommand"
+	CallbackAfterSetGroupInfoCommand                   = "callbackAfterSetGroupInfoCommand"
+	CallbackAfterSetGroupInfoExCommand                 = "callbackAfterSetGroupInfoExCommand"
+	CallbackBeforeSetGroupInfoCommand                  = "callbackBeforeSetGroupInfoCommand"
+	CallbackBeforeSetGroupInfoExCommand                = "callbackBeforeSetGroupInfoExCommand"
+	CallbackAfterRevokeMsgCommand                      = "callbackBeforeAfterMsgCommand"
+	CallbackBeforeAddBlackCommand                      = "callbackBeforeAddBlackCommand"
+	CallbackAfterAddFriendCommand                      = "callbackAfterAddFriendCommand"
+	CallbackBeforeAddFriendAgreeCommand                = "callbackBeforeAddFriendAgreeCommand"
+	CallbackAfterAddFriendAgreeCommand                 = "callbackAfterAddFriendAgreeCommand"
+	CallbackAfterDeleteFriendCommand                   = "callbackAfterDeleteFriendCommand"
+	CallbackBeforeImportFriendsCommand                 = "callbackBeforeImportFriendsCommand"
+	CallbackAfterImportFriendsCommand                  = "callbackAfterImportFriendsCommand"
+	CallbackAfterRemoveBlackCommand                    = "callbackAfterRemoveBlackCommand"
+	CallbackAfterQuitGroupCommand                      = "callbackAfterQuitGroupCommand"
+	CallbackAfterKickGroupCommand                      = "callbackAfterKickGroupCommand"
+	CallbackAfterDisMissGroupCommand                   = "callbackAfterDisMissGroupCommand"
+	CallbackBeforeJoinGroupCommand                     = "callbackBeforeJoinGroupCommand"
+	CallbackAfterGroupMsgReadCommand                   = "callbackAfterGroupMsgReadCommand"
+	CallbackBeforeMsgModifyCommand                     = "callbackBeforeMsgModifyCommand"
+	CallbackAfterUpdateUserInfoCommand                 = "callbackAfterUpdateUserInfoCommand"
+	CallbackAfterUpdateUserInfoExCommand               = "callbackAfterUpdateUserInfoExCommand"
+	CallbackBeforeUpdateUserInfoExCommand              = "callbackBeforeUpdateUserInfoExCommand"
+	CallbackBeforeUserRegisterCommand                  = "callbackBeforeUserRegisterCommand"
+	CallbackAfterUserRegisterCommand                   = "callbackAfterUserRegisterCommand"
+	CallbackAfterTransferGroupOwnerCommand             = "callbackAfterTransferGroupOwnerCommand"
+	CallbackBeforeSetFriendRemarkCommand               = "callbackBeforeSetFriendRemarkCommand"
+	CallbackAfterSetFriendRemarkCommand                = "callbackAfterSetFriendRemarkCommand"
+	CallbackAfterSingleMsgReadCommand                  = "callbackAfterSingleMsgReadCommand"
+	CallbackBeforeSendSingleMsgCommand                 = "callbackBeforeSendSingleMsgCommand"
+	CallbackAfterSendSingleMsgCommand                  = "callbackAfterSendSingleMsgCommand"
+	CallbackBeforeSendGroupMsgCommand                  = "callbackBeforeSendGroupMsgCommand"
+	CallbackAfterSendGroupMsgCommand                   = "callbackAfterSendGroupMsgCommand"
+	CallbackAfterUserOnlineCommand                     = "callbackAfterUserOnlineCommand"
+	CallbackAfterUserOfflineCommand                    = "callbackAfterUserOfflineCommand"
+	CallbackAfterUserKickOffCommand                    = "callbackAfterUserKickOffCommand"
+	CallbackBeforeOfflinePushCommand                   = "callbackBeforeOfflinePushCommand"
+	CallbackBeforeOnlinePushCommand                    = "callbackBeforeOnlinePushCommand"
+	CallbackBeforeGroupOnlinePushCommand               = "callbackBeforeGroupOnlinePushCommand"
+	CallbackBeforeAddFriendCommand                     = "callbackBeforeAddFriendCommand"
+	CallbackBeforeUpdateUserInfoCommand                = "callbackBeforeUpdateUserInfoCommand"
+	CallbackBeforeCreateGroupCommand                   = "callbackBeforeCreateGroupCommand"
+	CallbackAfterCreateGroupCommand                    = "callbackAfterCreateGroupCommand"
+	CallbackBeforeMembersJoinGroupCommand              = "callbackBeforeMembersJoinGroupCommand"
+	CallbackBeforeSetGroupMemberInfoCommand            = "callbackBeforeSetGroupMemberInfoCommand"
+	CallbackAfterSetGroupMemberInfoCommand             = "callbackAfterSetGroupMemberInfoCommand"
+	CallbackBeforeCreateSingleChatConversationsCommand = "callbackBeforeCreateSingleChatConversationsCommand"
+	CallbackAfterCreateSingleChatConversationsCommand  = "callbackAfterCreateSingleChatConversationsCommand"
+	CallbackBeforeCreateGroupChatConversationsCommand  = "callbackBeforeCreateGroupChatConversationsCommand"
+	CallbackAfterCreateGroupChatConversationsCommand   = "callbackAfterCreateGroupChatConversationsCommand"
 )
diff --git a/pkg/callbackstruct/conversation.go b/pkg/callbackstruct/conversation.go
new file mode 100644
index 000000000..14e78094c
--- /dev/null
+++ b/pkg/callbackstruct/conversation.go
@@ -0,0 +1,91 @@
+package callbackstruct
+
+type CallbackBeforeCreateSingleChatConversationsReq struct {
+	CallbackCommand  `json:"callbackCommand"`
+	OwnerUserID      string `json:"owner_user_id"`
+	ConversationID   string `json:"conversation_id"`
+	ConversationType int32  `json:"conversation_type"`
+	UserID           string `json:"user_id"`
+	RecvMsgOpt       int32  `json:"recv_msg_opt"`
+	IsPinned         bool   `json:"is_pinned"`
+	IsPrivateChat    bool   `json:"is_private_chat"`
+	BurnDuration     int32  `json:"burn_duration"`
+	GroupAtType      int32  `json:"group_at_type"`
+	AttachedInfo     string `json:"attached_info"`
+	Ex               string `json:"ex"`
+}
+
+type CallbackBeforeCreateSingleChatConversationsResp struct {
+	CommonCallbackResp
+	RecvMsgOpt    *int32  `json:"recv_msg_opt"`
+	IsPinned      *bool   `json:"is_pinned"`
+	IsPrivateChat *bool   `json:"is_private_chat"`
+	BurnDuration  *int32  `json:"burn_duration"`
+	GroupAtType   *int32  `json:"group_at_type"`
+	AttachedInfo  *string `json:"attached_info"`
+	Ex            *string `json:"ex"`
+}
+
+type CallbackAfterCreateSingleChatConversationsReq struct {
+	CallbackCommand  `json:"callbackCommand"`
+	OwnerUserID      string `json:"owner_user_id"`
+	ConversationID   string `json:"conversation_id"`
+	ConversationType int32  `json:"conversation_type"`
+	UserID           string `json:"user_id"`
+	RecvMsgOpt       int32  `json:"recv_msg_opt"`
+	IsPinned         bool   `json:"is_pinned"`
+	IsPrivateChat    bool   `json:"is_private_chat"`
+	BurnDuration     int32  `json:"burn_duration"`
+	GroupAtType      int32  `json:"group_at_type"`
+	AttachedInfo     string `json:"attached_info"`
+	Ex               string `json:"ex"`
+}
+
+type CallbackAfterCreateSingleChatConversationsResp struct {
+	CommonCallbackResp
+}
+
+type CallbackBeforeCreateGroupChatConversationsReq struct {
+	CallbackCommand  `json:"callbackCommand"`
+	OwnerUserID      string `json:"owner_user_id"`
+	ConversationID   string `json:"conversation_id"`
+	ConversationType int32  `json:"conversation_type"`
+	GroupID          string `json:"group_id"`
+	RecvMsgOpt       int32  `json:"recv_msg_opt"`
+	IsPinned         bool   `json:"is_pinned"`
+	IsPrivateChat    bool   `json:"is_private_chat"`
+	BurnDuration     int32  `json:"burn_duration"`
+	GroupAtType      int32  `json:"group_at_type"`
+	AttachedInfo     string `json:"attached_info"`
+	Ex               string `json:"ex"`
+}
+
+type CallbackBeforeCreateGroupChatConversationsResp struct {
+	CommonCallbackResp
+	RecvMsgOpt    *int32  `json:"recv_msg_opt"`
+	IsPinned      *bool   `json:"is_pinned"`
+	IsPrivateChat *bool   `json:"is_private_chat"`
+	BurnDuration  *int32  `json:"burn_duration"`
+	GroupAtType   *int32  `json:"group_at_type"`
+	AttachedInfo  *string `json:"attached_info"`
+	Ex            *string `json:"ex"`
+}
+
+type CallbackAfterCreateGroupChatConversationsReq struct {
+	CallbackCommand  `json:"callbackCommand"`
+	OwnerUserID      string `json:"owner_user_id"`
+	ConversationID   string `json:"conversation_id"`
+	ConversationType int32  `json:"conversation_type"`
+	GroupID          string `json:"group_id"`
+	RecvMsgOpt       int32  `json:"recv_msg_opt"`
+	IsPinned         bool   `json:"is_pinned"`
+	IsPrivateChat    bool   `json:"is_private_chat"`
+	BurnDuration     int32  `json:"burn_duration"`
+	GroupAtType      int32  `json:"group_at_type"`
+	AttachedInfo     string `json:"attached_info"`
+	Ex               string `json:"ex"`
+}
+
+type CallbackAfterCreateGroupChatConversationsResp struct {
+	CommonCallbackResp
+}
diff --git a/pkg/common/cmd/conversation.go b/pkg/common/cmd/conversation.go
index 2f8769897..428c442da 100644
--- a/pkg/common/cmd/conversation.go
+++ b/pkg/common/cmd/conversation.go
@@ -41,6 +41,7 @@ func NewConversationRpcCmd() *ConversationRpcCmd {
 		config.MongodbConfigFileName:            &conversationConfig.MongodbConfig,
 		config.ShareFileName:                    &conversationConfig.Share,
 		config.NotificationFileName:             &conversationConfig.NotificationConfig,
+		config.WebhooksConfigFileName:           &conversationConfig.WebhooksConfig,
 		config.LocalCacheConfigFileName:         &conversationConfig.LocalCacheConfig,
 		config.DiscoveryConfigFilename:          &conversationConfig.Discovery,
 	}
@@ -67,6 +68,7 @@ func (a *ConversationRpcCmd) runE() error {
 			a.conversationConfig.NotificationConfig.GetConfigFileName(),
 			a.conversationConfig.Share.GetConfigFileName(),
 			a.conversationConfig.LocalCacheConfig.GetConfigFileName(),
+			a.conversationConfig.WebhooksConfig.GetConfigFileName(),
 			a.conversationConfig.Discovery.GetConfigFileName(),
 		}, nil,
 		conversation.Start)
diff --git a/pkg/common/config/config.go b/pkg/common/config/config.go
index ca448083c..a2c46e7e5 100644
--- a/pkg/common/config/config.go
+++ b/pkg/common/config/config.go
@@ -416,55 +416,59 @@ func (r *RpcRegisterName) GetServiceNames() []string {
 
 // FullConfig stores all configurations for before and after events
 type Webhooks struct {
-	URL                      string       `mapstructure:"url"`
-	BeforeSendSingleMsg      BeforeConfig `mapstructure:"beforeSendSingleMsg"`
-	BeforeUpdateUserInfoEx   BeforeConfig `mapstructure:"beforeUpdateUserInfoEx"`
-	AfterUpdateUserInfoEx    AfterConfig  `mapstructure:"afterUpdateUserInfoEx"`
-	AfterSendSingleMsg       AfterConfig  `mapstructure:"afterSendSingleMsg"`
-	BeforeSendGroupMsg       BeforeConfig `mapstructure:"beforeSendGroupMsg"`
-	BeforeMsgModify          BeforeConfig `mapstructure:"beforeMsgModify"`
-	AfterSendGroupMsg        AfterConfig  `mapstructure:"afterSendGroupMsg"`
-	AfterUserOnline          AfterConfig  `mapstructure:"afterUserOnline"`
-	AfterUserOffline         AfterConfig  `mapstructure:"afterUserOffline"`
-	AfterUserKickOff         AfterConfig  `mapstructure:"afterUserKickOff"`
-	BeforeOfflinePush        BeforeConfig `mapstructure:"beforeOfflinePush"`
-	BeforeOnlinePush         BeforeConfig `mapstructure:"beforeOnlinePush"`
-	BeforeGroupOnlinePush    BeforeConfig `mapstructure:"beforeGroupOnlinePush"`
-	BeforeAddFriend          BeforeConfig `mapstructure:"beforeAddFriend"`
-	BeforeUpdateUserInfo     BeforeConfig `mapstructure:"beforeUpdateUserInfo"`
-	AfterUpdateUserInfo      AfterConfig  `mapstructure:"afterUpdateUserInfo"`
-	BeforeCreateGroup        BeforeConfig `mapstructure:"beforeCreateGroup"`
-	AfterCreateGroup         AfterConfig  `mapstructure:"afterCreateGroup"`
-	BeforeMemberJoinGroup    BeforeConfig `mapstructure:"beforeMemberJoinGroup"`
-	BeforeSetGroupMemberInfo BeforeConfig `mapstructure:"beforeSetGroupMemberInfo"`
-	AfterSetGroupMemberInfo  AfterConfig  `mapstructure:"afterSetGroupMemberInfo"`
-	AfterQuitGroup           AfterConfig  `mapstructure:"afterQuitGroup"`
-	AfterKickGroupMember     AfterConfig  `mapstructure:"afterKickGroupMember"`
-	AfterDismissGroup        AfterConfig  `mapstructure:"afterDismissGroup"`
-	BeforeApplyJoinGroup     BeforeConfig `mapstructure:"beforeApplyJoinGroup"`
-	AfterGroupMsgRead        AfterConfig  `mapstructure:"afterGroupMsgRead"`
-	AfterSingleMsgRead       AfterConfig  `mapstructure:"afterSingleMsgRead"`
-	BeforeUserRegister       BeforeConfig `mapstructure:"beforeUserRegister"`
-	AfterUserRegister        AfterConfig  `mapstructure:"afterUserRegister"`
-	AfterTransferGroupOwner  AfterConfig  `mapstructure:"afterTransferGroupOwner"`
-	BeforeSetFriendRemark    BeforeConfig `mapstructure:"beforeSetFriendRemark"`
-	AfterSetFriendRemark     AfterConfig  `mapstructure:"afterSetFriendRemark"`
-	AfterGroupMsgRevoke      AfterConfig  `mapstructure:"afterGroupMsgRevoke"`
-	AfterJoinGroup           AfterConfig  `mapstructure:"afterJoinGroup"`
-	BeforeInviteUserToGroup  BeforeConfig `mapstructure:"beforeInviteUserToGroup"`
-	AfterSetGroupInfo        AfterConfig  `mapstructure:"afterSetGroupInfo"`
-	BeforeSetGroupInfo       BeforeConfig `mapstructure:"beforeSetGroupInfo"`
-	AfterSetGroupInfoEx      AfterConfig  `mapstructure:"afterSetGroupInfoEx"`
-	BeforeSetGroupInfoEx     BeforeConfig `mapstructure:"beforeSetGroupInfoEx"`
-	AfterRevokeMsg           AfterConfig  `mapstructure:"afterRevokeMsg"`
-	BeforeAddBlack           BeforeConfig `mapstructure:"beforeAddBlack"`
-	AfterAddFriend           AfterConfig  `mapstructure:"afterAddFriend"`
-	BeforeAddFriendAgree     BeforeConfig `mapstructure:"beforeAddFriendAgree"`
-	AfterAddFriendAgree      AfterConfig  `mapstructure:"afterAddFriendAgree"`
-	AfterDeleteFriend        AfterConfig  `mapstructure:"afterDeleteFriend"`
-	BeforeImportFriends      BeforeConfig `mapstructure:"beforeImportFriends"`
-	AfterImportFriends       AfterConfig  `mapstructure:"afterImportFriends"`
-	AfterRemoveBlack         AfterConfig  `mapstructure:"afterRemoveBlack"`
+	URL                                 string       `yaml:"url"`
+	BeforeSendSingleMsg                 BeforeConfig `yaml:"beforeSendSingleMsg"`
+	BeforeUpdateUserInfoEx              BeforeConfig `yaml:"beforeUpdateUserInfoEx"`
+	AfterUpdateUserInfoEx               AfterConfig  `yaml:"afterUpdateUserInfoEx"`
+	AfterSendSingleMsg                  AfterConfig  `yaml:"afterSendSingleMsg"`
+	BeforeSendGroupMsg                  BeforeConfig `yaml:"beforeSendGroupMsg"`
+	BeforeMsgModify                     BeforeConfig `yaml:"beforeMsgModify"`
+	AfterSendGroupMsg                   AfterConfig  `yaml:"afterSendGroupMsg"`
+	AfterUserOnline                     AfterConfig  `yaml:"afterUserOnline"`
+	AfterUserOffline                    AfterConfig  `yaml:"afterUserOffline"`
+	AfterUserKickOff                    AfterConfig  `yaml:"afterUserKickOff"`
+	BeforeOfflinePush                   BeforeConfig `yaml:"beforeOfflinePush"`
+	BeforeOnlinePush                    BeforeConfig `yaml:"beforeOnlinePush"`
+	BeforeGroupOnlinePush               BeforeConfig `yaml:"beforeGroupOnlinePush"`
+	BeforeAddFriend                     BeforeConfig `yaml:"beforeAddFriend"`
+	BeforeUpdateUserInfo                BeforeConfig `yaml:"beforeUpdateUserInfo"`
+	AfterUpdateUserInfo                 AfterConfig  `yaml:"afterUpdateUserInfo"`
+	BeforeCreateGroup                   BeforeConfig `yaml:"beforeCreateGroup"`
+	AfterCreateGroup                    AfterConfig  `yaml:"afterCreateGroup"`
+	BeforeMemberJoinGroup               BeforeConfig `yaml:"beforeMemberJoinGroup"`
+	BeforeSetGroupMemberInfo            BeforeConfig `yaml:"beforeSetGroupMemberInfo"`
+	AfterSetGroupMemberInfo             AfterConfig  `yaml:"afterSetGroupMemberInfo"`
+	AfterQuitGroup                      AfterConfig  `yaml:"afterQuitGroup"`
+	AfterKickGroupMember                AfterConfig  `yaml:"afterKickGroupMember"`
+	AfterDismissGroup                   AfterConfig  `yaml:"afterDismissGroup"`
+	BeforeApplyJoinGroup                BeforeConfig `yaml:"beforeApplyJoinGroup"`
+	AfterGroupMsgRead                   AfterConfig  `yaml:"afterGroupMsgRead"`
+	AfterSingleMsgRead                  AfterConfig  `yaml:"afterSingleMsgRead"`
+	BeforeUserRegister                  BeforeConfig `yaml:"beforeUserRegister"`
+	AfterUserRegister                   AfterConfig  `yaml:"afterUserRegister"`
+	AfterTransferGroupOwner             AfterConfig  `yaml:"afterTransferGroupOwner"`
+	BeforeSetFriendRemark               BeforeConfig `yaml:"beforeSetFriendRemark"`
+	AfterSetFriendRemark                AfterConfig  `yaml:"afterSetFriendRemark"`
+	AfterGroupMsgRevoke                 AfterConfig  `yaml:"afterGroupMsgRevoke"`
+	AfterJoinGroup                      AfterConfig  `yaml:"afterJoinGroup"`
+	BeforeInviteUserToGroup             BeforeConfig `yaml:"beforeInviteUserToGroup"`
+	AfterSetGroupInfo                   AfterConfig  `yaml:"afterSetGroupInfo"`
+	BeforeSetGroupInfo                  BeforeConfig `yaml:"beforeSetGroupInfo"`
+	AfterSetGroupInfoEx                 AfterConfig  `yaml:"afterSetGroupInfoEx"`
+	BeforeSetGroupInfoEx                BeforeConfig `yaml:"beforeSetGroupInfoEx"`
+	AfterRevokeMsg                      AfterConfig  `yaml:"afterRevokeMsg"`
+	BeforeAddBlack                      BeforeConfig `yaml:"beforeAddBlack"`
+	AfterAddFriend                      AfterConfig  `yaml:"afterAddFriend"`
+	BeforeAddFriendAgree                BeforeConfig `yaml:"beforeAddFriendAgree"`
+	AfterAddFriendAgree                 AfterConfig  `yaml:"afterAddFriendAgree"`
+	AfterDeleteFriend                   AfterConfig  `yaml:"afterDeleteFriend"`
+	BeforeImportFriends                 BeforeConfig `yaml:"beforeImportFriends"`
+	AfterImportFriends                  AfterConfig  `yaml:"afterImportFriends"`
+	AfterRemoveBlack                    AfterConfig  `yaml:"afterRemoveBlack"`
+	BeforeCreateSingleChatConversations BeforeConfig `yaml:"beforeCreateSingleChatConversations"`
+	AfterCreateSingleChatConversations  AfterConfig  `yaml:"afterCreateSingleChatConversations"`
+	BeforeCreateGroupChatConversations  BeforeConfig `yaml:"beforeCreateGroupChatConversations"`
+	AfterCreateGroupChatConversations   AfterConfig  `yaml:"afterCreateGroupChatConversations"`
 }
 
 type ZooKeeper struct {
diff --git a/pkg/common/config/load_config_test.go b/pkg/common/config/load_config_test.go
index 763bffd9f..94f0596d6 100644
--- a/pkg/common/config/load_config_test.go
+++ b/pkg/common/config/load_config_test.go
@@ -7,21 +7,36 @@ import (
 
 func TestLoadLogConfig(t *testing.T) {
 	var log Log
-	err := LoadConfig("../../../config/log.yml", "IMENV_LOG", &log)
+	os.Setenv("IMENV_LOG_REMAINLOGLEVEL", "5")
+	err := Load("../../../config/", "log.yml", "IMENV_LOG", &log)
+	assert.Nil(t, err)
+	t.Log(log.RemainLogLevel)
+	// assert.Equal(t, "../../../../logs/", log.StorageLocation)
+}
+
+func TestLoadMongoConfig(t *testing.T) {
+	var mongo Mongo
+	// os.Setenv("DEPLOYMENT_TYPE", "kubernetes")
+	os.Setenv("IMENV_MONGODB_PASSWORD", "openIM1231231")
+	// os.Setenv("IMENV_MONGODB_URI", "openIM123")
+	// os.Setenv("IMENV_MONGODB_USERNAME", "openIM123")
+	err := Load("../../../config/", "mongodb.yml", "IMENV_MONGODB", &mongo)
+	// err := LoadApiConfig("../../../config/mongodb.yml", "IMENV_MONGODB", &mongo)
+
 	assert.Nil(t, err)
 	assert.Equal(t, "../../../../logs/", log.StorageLocation)
 }
 
 func TestLoadMinioConfig(t *testing.T) {
 	var storageConfig Minio
-	err := LoadConfig("../../../config/minio.yml", "IMENV_MINIO", &storageConfig)
+	err := Load("../../../config/minio.yml", "IMENV_MINIO", "", &storageConfig)
 	assert.Nil(t, err)
 	assert.Equal(t, "openim", storageConfig.Bucket)
 }
 
 func TestLoadWebhooksConfig(t *testing.T) {
 	var webhooks Webhooks
-	err := LoadConfig("../../../config/webhooks.yml", "IMENV_WEBHOOKS", &webhooks)
+	err := Load("../../../config/webhooks.yml", "IMENV_WEBHOOKS", "", &webhooks)
 	assert.Nil(t, err)
 	assert.Equal(t, 5, webhooks.BeforeAddBlack.Timeout)
 
@@ -29,7 +44,7 @@ func TestLoadWebhooksConfig(t *testing.T) {
 
 func TestLoadOpenIMRpcUserConfig(t *testing.T) {
 	var user User
-	err := LoadConfig("../../../config/openim-rpc-user.yml", "IMENV_OPENIM_RPC_USER", &user)
+	err := Load("../../../config/openim-rpc-user.yml", "IMENV_OPENIM_RPC_USER", "", &user)
 	assert.Nil(t, err)
 	//export IMENV_OPENIM_RPC_USER_RPC_LISTENIP="0.0.0.0"
 	assert.Equal(t, "0.0.0.0", user.RPC.ListenIP)
@@ -39,14 +54,14 @@ func TestLoadOpenIMRpcUserConfig(t *testing.T) {
 
 func TestLoadNotificationConfig(t *testing.T) {
 	var noti Notification
-	err := LoadConfig("../../../config/notification.yml", "IMENV_NOTIFICATION", &noti)
+	err := Load("../../../config/notification.yml", "IMENV_NOTIFICATION", "", &noti)
 	assert.Nil(t, err)
 	assert.Equal(t, "Your friend's profile has been changed", noti.FriendRemarkSet.OfflinePush.Title)
 }
 
 func TestLoadOpenIMThirdConfig(t *testing.T) {
 	var third Third
-	err := LoadConfig("../../../config/openim-rpc-third.yml", "IMENV_OPENIM_RPC_THIRD", &third)
+	err := Load("../../../config/openim-rpc-third.yml", "IMENV_OPENIM_RPC_THIRD", "", &third)
 	assert.Nil(t, err)
 	assert.Equal(t, "enabled", third.Object.Enable)
 	assert.Equal(t, "https://oss-cn-chengdu.aliyuncs.com", third.Object.Oss.Endpoint)
@@ -62,7 +77,7 @@ func TestLoadOpenIMThirdConfig(t *testing.T) {
 
 func TestTransferConfig(t *testing.T) {
 	var tran MsgTransfer
-	err := LoadConfig("../../../config/openim-msgtransfer.yml", "IMENV_OPENIM-MSGTRANSFER", &tran)
+	err := Load("../../../config/openim-msgtransfer.yml", "IMENV_OPENIM-MSGTRANSFER", "", &tran)
 	assert.Nil(t, err)
 	assert.Equal(t, true, tran.Prometheus.Enable)
 	assert.Equal(t, true, tran.Prometheus.AutoSetPorts)
diff --git a/pkg/common/storage/controller/conversation.go b/pkg/common/storage/controller/conversation.go
index d4088e0c0..7578394b5 100644
--- a/pkg/common/storage/controller/conversation.go
+++ b/pkg/common/storage/controller/conversation.go
@@ -22,7 +22,6 @@ import (
 	relationtb "github.com/openimsdk/open-im-server/v3/pkg/common/storage/model"
 
 	"github.com/openimsdk/open-im-server/v3/pkg/common/storage/cache"
-	"github.com/openimsdk/open-im-server/v3/pkg/msgprocessor"
 	"github.com/openimsdk/protocol/constant"
 	"github.com/openimsdk/tools/db/pagination"
 	"github.com/openimsdk/tools/db/tx"
@@ -48,7 +47,7 @@ type ConversationDatabase interface {
 	// transactional.
 	SetUsersConversationFieldTx(ctx context.Context, userIDs []string, conversation *relationtb.Conversation, fieldMap map[string]any) error
 	// CreateGroupChatConversation creates a group chat conversation for the specified group ID and user IDs.
-	CreateGroupChatConversation(ctx context.Context, groupID string, userIDs []string) error
+	CreateGroupChatConversation(ctx context.Context, groupID string, userIDs []string, conversations *relationtb.Conversation) error
 	// GetConversationIDs retrieves conversation IDs for a given user.
 	GetConversationIDs(ctx context.Context, userID string) ([]string, error)
 	// GetUserConversationIDsHash gets the hash of conversation IDs for a given user.
@@ -298,10 +297,10 @@ func (c *conversationDatabase) SetUserConversations(ctx context.Context, ownerUs
 //	return c.cache.GetSuperGroupRecvMsgNotNotifyUserIDs(ctx, groupID)
 //}
 
-func (c *conversationDatabase) CreateGroupChatConversation(ctx context.Context, groupID string, userIDs []string) error {
+func (c *conversationDatabase) CreateGroupChatConversation(ctx context.Context, groupID string, userIDs []string, conversation *relationtb.Conversation) error {
 	return c.tx.Transaction(ctx, func(ctx context.Context) error {
 		cache := c.cache.CloneConversationCache()
-		conversationID := msgprocessor.GetConversationIDBySessionType(constant.ReadGroupChatType, groupID)
+		conversationID := conversation.ConversationID
 		existConversationUserIDs, err := c.conversationDB.FindUserID(ctx, userIDs, []string{conversationID})
 		if err != nil {
 			return err
@@ -309,7 +308,15 @@ func (c *conversationDatabase) CreateGroupChatConversation(ctx context.Context,
 		notExistUserIDs := stringutil.DifferenceString(userIDs, existConversationUserIDs)
 		var conversations []*relationtb.Conversation
 		for _, v := range notExistUserIDs {
-			conversation := relationtb.Conversation{ConversationType: constant.ReadGroupChatType, GroupID: groupID, OwnerUserID: v, ConversationID: conversationID}
+			conversation := relationtb.Conversation{
+				ConversationType: conversation.ConversationType, GroupID: groupID, OwnerUserID: v, ConversationID: conversationID,
+				// the parameters have default value
+				RecvMsgOpt: conversation.RecvMsgOpt, IsPinned: conversation.IsPinned, IsPrivateChat: conversation.IsPrivateChat,
+				BurnDuration: conversation.BurnDuration, GroupAtType: conversation.GroupAtType, AttachedInfo: conversation.AttachedInfo,
+				Ex: conversation.Ex, MaxSeq: conversation.MaxSeq, MinSeq: conversation.MinSeq, CreateTime: conversation.CreateTime,
+				MsgDestructTime: conversation.MsgDestructTime, IsMsgDestruct: conversation.IsMsgDestruct, LatestMsgDestructTime: conversation.LatestMsgDestructTime,
+			}
+
 			conversations = append(conversations, &conversation)
 			cache = cache.DelConversations(v, conversationID).DelConversationNotReceiveMessageUserIDs(conversationID)
 		}
@@ -320,7 +327,7 @@ func (c *conversationDatabase) CreateGroupChatConversation(ctx context.Context,
 				return err
 			}
 		}
-		_, err = c.conversationDB.UpdateByMap(ctx, existConversationUserIDs, conversationID, map[string]any{"max_seq": 0})
+		_, err = c.conversationDB.UpdateByMap(ctx, existConversationUserIDs, conversationID, map[string]any{"max_seq": conversation.MaxSeq})
 		if err != nil {
 			return err
 		}