***

title: "PromotionService"
generated: true
---------------

<GenerationInfo sourceFile="packages/core/src/service/services/promotion.service.ts" sourceLine="58" packageName="@vendure/core" />

Contains methods relating to [Promotion](/current/core/reference/typescript-api/entities/promotion#promotion) entities.

```ts title="Signature"
class PromotionService {
    availableConditions: PromotionCondition[] = [];
    availableActions: PromotionAction[] = [];
    constructor(connection: TransactionalConnection, configService: ConfigService, channelService: ChannelService, listQueryBuilder: ListQueryBuilder, configArgService: ConfigArgService, customFieldRelationService: CustomFieldRelationService, eventBus: EventBus, translatableSaver: TranslatableSaver, translator: TranslatorService)
    findAll(ctx: RequestContext, options?: ListQueryOptions<Promotion>, relations: RelationPaths<Promotion> = []) => Promise<PaginatedList<Promotion>>;
    findOne(ctx: RequestContext, adjustmentSourceId: ID, relations: RelationPaths<Promotion> = []) => Promise<Promotion | undefined>;
    getPromotionConditions(ctx: RequestContext) => ConfigurableOperationDefinition[];
    getPromotionActions(ctx: RequestContext) => ConfigurableOperationDefinition[];
    createPromotion(ctx: RequestContext, input: CreatePromotionInput) => Promise<ErrorResultUnion<CreatePromotionResult, Promotion>>;
    updatePromotion(ctx: RequestContext, input: UpdatePromotionInput) => Promise<ErrorResultUnion<UpdatePromotionResult, Promotion>>;
    softDeletePromotion(ctx: RequestContext, promotionId: ID) => Promise<DeletionResponse>;
    assignPromotionsToChannel(ctx: RequestContext, input: AssignPromotionsToChannelInput) => Promise<Promotion[]>;
    removePromotionsFromChannel(ctx: RequestContext, input: RemovePromotionsFromChannelInput) => ;
    validateCouponCode(ctx: RequestContext, couponCode: string, customerId?: ID, excludeOrderId?: ID) => Promise<JustErrorResults<ApplyCouponCodeResult> | Promotion>;
    getActivePromotionsInChannel(ctx: RequestContext) => ;
    getActivePromotionsOnOrder(ctx: RequestContext, orderId: ID) => Promise<Promotion[]>;
    runPromotionSideEffects(ctx: RequestContext, order: Order, promotionsPre: Promotion[]) => ;
    addPromotionsToOrder(ctx: RequestContext, order: Order) => Promise<Order>;
    getExhaustedPromotionIds(ctx: RequestContext, promotions: Promotion[], customerId?: ID) => Promise<Set<string>>;
}
```

<div className="members-wrapper">

### availableConditions

\<MemberInfo kind="property" type={`<a href='/current/core/reference/typescript-api/promotions/promotion-condition#promotioncondition'>PromotionCondition</a>[]`}   />

### availableActions

\<MemberInfo kind="property" type={`<a href='/current/core/reference/typescript-api/promotions/promotion-action#promotionaction'>PromotionAction</a>[]`}   />

### findAll

\<MemberInfo kind="method" type={`(ctx: <a href='/current/core/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, options?: ListQueryOptions<<a href='/current/core/reference/typescript-api/entities/promotion#promotion'>Promotion</a>>, relations: RelationPaths<<a href='/current/core/reference/typescript-api/entities/promotion#promotion'>Promotion</a>> = []) => Promise<<a href='/current/core/reference/typescript-api/common/paginated-list#paginatedlist'>PaginatedList</a><<a href='/current/core/reference/typescript-api/entities/promotion#promotion'>Promotion</a>>>`}   />

### findOne

\<MemberInfo kind="method" type={`(ctx: <a href='/current/core/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, adjustmentSourceId: <a href='/current/core/reference/typescript-api/common/id#id'>ID</a>, relations: RelationPaths<<a href='/current/core/reference/typescript-api/entities/promotion#promotion'>Promotion</a>> = []) => Promise<<a href='/current/core/reference/typescript-api/entities/promotion#promotion'>Promotion</a> | undefined>`}   />

### getPromotionConditions

\<MemberInfo kind="method" type={`(ctx: <a href='/current/core/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>) => ConfigurableOperationDefinition[]`}   />

### getPromotionActions

\<MemberInfo kind="method" type={`(ctx: <a href='/current/core/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>) => ConfigurableOperationDefinition[]`}   />

### createPromotion

\<MemberInfo kind="method" type={`(ctx: <a href='/current/core/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, input: CreatePromotionInput) => Promise<<a href='/current/core/reference/typescript-api/errors/error-result-union#errorresultunion'>ErrorResultUnion</a><CreatePromotionResult, <a href='/current/core/reference/typescript-api/entities/promotion#promotion'>Promotion</a>>>`}   />

### updatePromotion

\<MemberInfo kind="method" type={`(ctx: <a href='/current/core/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, input: UpdatePromotionInput) => Promise<<a href='/current/core/reference/typescript-api/errors/error-result-union#errorresultunion'>ErrorResultUnion</a><UpdatePromotionResult, <a href='/current/core/reference/typescript-api/entities/promotion#promotion'>Promotion</a>>>`}   />

### softDeletePromotion

\<MemberInfo kind="method" type={`(ctx: <a href='/current/core/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, promotionId: <a href='/current/core/reference/typescript-api/common/id#id'>ID</a>) => Promise<DeletionResponse>`}   />

### assignPromotionsToChannel

\<MemberInfo kind="method" type={`(ctx: <a href='/current/core/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, input: AssignPromotionsToChannelInput) => Promise<<a href='/current/core/reference/typescript-api/entities/promotion#promotion'>Promotion</a>[]>`}   />

### removePromotionsFromChannel

\<MemberInfo kind="method" type={`(ctx: <a href='/current/core/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, input: RemovePromotionsFromChannelInput) => `}   />

### validateCouponCode

\<MemberInfo kind="method" type={`(ctx: <a href='/current/core/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, couponCode: string, customerId?: <a href='/current/core/reference/typescript-api/common/id#id'>ID</a>, excludeOrderId?: <a href='/current/core/reference/typescript-api/common/id#id'>ID</a>) => Promise<JustErrorResults<ApplyCouponCodeResult> | <a href='/current/core/reference/typescript-api/entities/promotion#promotion'>Promotion</a>>`}   />

Checks the validity of a coupon code, by checking that it is associated with an existing,
enabled and non-expired Promotion. The comparison is case-insensitive, so e.g. "SUMMER20"
and "summer20" are treated as the same code. Additionally, if there is a usage limit on the
coupon code, this method will enforce that limit against the specified Customer.

### getActivePromotionsInChannel

\<MemberInfo kind="method" type={`(ctx: <a href='/current/core/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>) => `}   />

### getActivePromotionsOnOrder

\<MemberInfo kind="method" type={`(ctx: <a href='/current/core/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, orderId: <a href='/current/core/reference/typescript-api/common/id#id'>ID</a>) => Promise<<a href='/current/core/reference/typescript-api/entities/promotion#promotion'>Promotion</a>[]>`}   />

### runPromotionSideEffects

\<MemberInfo kind="method" type={`(ctx: <a href='/current/core/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, order: <a href='/current/core/reference/typescript-api/entities/order#order'>Order</a>, promotionsPre: <a href='/current/core/reference/typescript-api/entities/promotion#promotion'>Promotion</a>[]) => `}   />

### addPromotionsToOrder

\<MemberInfo kind="method" type={`(ctx: <a href='/current/core/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, order: <a href='/current/core/reference/typescript-api/entities/order#order'>Order</a>) => Promise<<a href='/current/core/reference/typescript-api/entities/order#order'>Order</a>>`}   />

Used internally to associate a Promotion with an Order, once an Order has been placed.

### getExhaustedPromotionIds

\<MemberInfo kind="method" type={`(ctx: <a href='/current/core/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, promotions: <a href='/current/core/reference/typescript-api/entities/promotion#promotion'>Promotion</a>[], customerId?: <a href='/current/core/reference/typescript-api/common/id#id'>ID</a>) => Promise<Set<string>>`}   />

Returns a Set of Promotion IDs (as strings) that have exceeded their `usageLimit` or
`perCustomerUsageLimit`. Only checks promotions without a coupon code
(coupon-based promotions are validated separately in `validateCouponCode()`).

</div>
