Skip to content

Opportunity Targeting

Matching respondents to the right opportunity is an important part of the REX integration. To target effectively, it’s helpful to understand how all the different parts works together. We’ve created some high-level diagrams to try to help simplify and unite the different targeting pieces.

This is meant to be supplemental to our Opportunity Registry documentation. You can find the full details about opportunity targeting here.


The three main components of filters are filter groupsfilter objects and filters cells. For a respondent to successfully match filters they must do the following.

Please note that it is common for opportunities to have no filters defined. In this case, everyone will qualify as long as they match the specified country, language, targeted device types, and open quota cells.

flowchart TB
	f[filters]:::main -.-
	fdes("Match all<br>filter groups.")
	%% style f fill:#EC4A31,color:#fff

	g(filter groups) -.-
	gdes("Match at least<br/>one filter object.")
	%% style g fill:#FFA799

	o(filter objects) -.-
	odes("Match ALL <br/>filter cells.")
	%% style o fill:#FDCAA3

	c([filter cells]) -.-
	cdes("Match cell<br/>criteria.")
	%% style c fill:#FCE3AB

	%% main style
	%% classDef main stroke:#1B365D,color:#000,padding:8px
	%% class f,g,o,c main

	%% description style
	%% classDef desc fill:#EEF8FC,color:#000,stroke-width:0
	%% class fdes,gdes,odes,cdes desc

	%% link style
	linkStyle 0,1,2,3 display:none
  1. Match all filter groups.
  2. To match a filter group a respondent must match at least 1 filter object of the filter group.
  3. Lastly, to match a filter group a respondent must match all filter cells within the filter object.
flowchart TB 
	subgraph C
		direction TB
		gc === 
		o5(OBJ):::o ===
		c5a([CELL]):::c ===
		c5b([CELL]):::c ===
		GC2(("✓")):::match 

		gc[GRP]:::g ===
		o4(OBJ):::o === 
		c4a([CELL]):::c ===
		c4b([CELL]):::c ===
		GC1(("✓")):::match
	end

	subgraph B
		direction TB
		ga[GRP]:::g ===
		o1(OBJ):::o ===
		c1([CELL]):::c ===
		GA(("✓")):::match
	end

	subgraph A
		direction TB
		gb(GRP):::g ---
		o3(OBJ):::o ---
		c3([CELL]):::c -.-
		GB2(("⚠")):::mismatch

		gb[GRP]:::g ===
		o2(OBJ):::o ===
		c2c([CELL]):::c === c2b([CELL]):::c === c2a([CELL]):::c ===
		GB(("✓")):::match 
	end
flowchart TB
	subgraph "C"
		direction TB
		gc[GRP]:::g ---
		o5(OBJ):::o ---
		c5a([CELL]):::c -.-
		GC2(("⚠")):::mismatch

		gc ---
		o4(OBJ):::o ---
		c4a([CELL]):::c ---
		c4b([CELL]):::c ---
		c4c([CELL]):::c -.-
		GC1(("⚠")):::mismatch
	end

	subgraph B
		direction TB
		ga[GRP]:::g ===
		o1(OBJ):::o ===
		c1a([CELL]):::c ===
		c1b([CELL]):::c ===
		GA(("✓")):::match
	end

	subgraph A
		direction TB
		gb[GRP]:::g ---
		o2(OBJ):::o ---
		c2a([CELL]):::c -.-
		c2b([CELL]):::c -.-
		GB2(("⚠")):::mismatch

		gb ===
		o3(OBJ):::o ===
		c3a([CELL]):::c ===
		c3b([CELL]):::c ===
		c3c([CELL]):::c ===
		GB(("✓")):::match
	end
flowchart TB
	f[filter] --- fg1[filter group] & fg2[filter group] & fg3[filter group]
	%% style f fill:#EC4A31,color:white

	fg1:::g === fo1(filter object):::o === fc1([filter cell]):::c -.-
	fc1val("attribute_id: 80<br/>negate: false<br/>range:<br/>   from: 18<br/>   to: 99"):::val -.-
	fc1des("Include attribute 80<br/>values from 18 to 99."):::desc

	fg2:::g === fo2(filter object):::o === fc2([filter cell]):::c -.-
	fc2val("attribute_id: 1<br/>negate: true<br/>value: 1"):::val -.-
	fc2des("Exclude attribute 1<br/>value 1"):::desc

	fg3:::g === fo3(filter object):::o === fc3([filter cell]):::c -.-
	fc3val("attribute_id: 8<br/>negate: false<br/>collection: 2169971"):::val -.-
	fc3des("Include attribute 8<br/>values in collection 2169971 "):::desc

	%% classDef g fill:#FFA799,color:#000,stroke:#1B365D
	%% classDef o fill:#FDCAA3,color:#000,stroke:#1B365D
	%% classDef c fill:#FCE3AB,color:#000,stroke:#1B365D

	%% value style
	%% classDef val fill:#000,color:#fafafa,stroke:#333

	%% description style
	%% classDef desc fill:#EEF8FC,color:#000,stroke-width:0
	%% class fdes,gdes,odes,cdes desc

	%% link style
	linkStyle 6,10,14 display:none

Quotas are very similar to filters, they are made up of quota groups, quota objects and quota cells. For a respondent to successfully match quotas they must meet the following criteria.

flowchart
    q[quota]:::q -.-
    fdes("Match all<br/>quota groups")
		%% style q fill:#217AB5,color:#fff

    g(quota groups):::g -.-
    gdes("Match at least<br/>one quota object.")
		%% style g fill:#95CFEC

    o(quota objects):::o -.-
    odes("Match all<br/>quota cells, count is <br/>greater than 0, and<br/>status is OPEN.")
		%% style o fill:#DAE3F7

    c([quota cells]):::c -.-
    cdes("Match cell<br/>criteria.")
		%% style c fill:#FCE3AB

		%% main style
		%% classDef main stroke:#1B365D,color:#000,padding:8px
		%% class q,g,o,c main

		%% description style
		%% classDef desc fill:#EEF8FC,color:#000,stroke-width:0
		%% class fdes,gdes,odes,cdes desc

		%% link style
		linkStyle 0,1,2,3 display:none
  1. Match all quota groups.
  2. To match a quota group a respondent must match at least 1 quota object in the quota group.
  3. The quota group must have an OPEN value for status, and the count must be greater than 0.
  4. Additionally to match a quota group a respondent must match all quota cells within the quota object.
flowchart TB
	subgraph C
		direction TB
		qc[GRP]:::g ===
		o5(OBJ):::o ===
		o5des(OPEN<br>50):::desc ===
		c5a([CELL]):::c ===
		c5b([CELL]):::c ===
		QC0(("✓")):::match

		qc -.-
		o6(OBJ):::o -.-
		o6des(PAUSED<br>30):::desc -.-
		c6a([CELL]):::c -.-
		c6b([CELL]):::c -.-
		c6c([CELL]):::c 
	end

	subgraph B
		direction TB
		qb[GRP]:::g -.-
		o2(OBJ):::o -.-
		o2des(CLOSED<br>0):::desc -.-
		c2a([CELL]):::c -.-
		c2b([CELL]):::c

		qb ===
		o3(OBJ):::o ===
		o3des(OPEN<br>60):::desc ===
		c3a([CELL]):::c ===
		c3b([CELL]):::c ===
		QB0(("✓")):::match

		qb ---
		o4(OBJ):::o ---
		o4des(OPEN<br>10):::desc ---
		c4c([CELL]):::c -.-
		c4b([CELL]):::c -.-
		c4a([CELL]):::c
	end

	subgraph A
		direction TB
		qa[GRP]:::g ===
		o1(OBJ):::o ===
		o1des(OPEN<br>80):::desc ===
		c1b([CELL]):::c ===
		c1a([CELL]):::c ===
		QA0(("✓")):::match
	end
flowchart TB
	subgraph C
		direction TB
		qc[GRP]:::g ---
		o5(OBJ):::o ---
		o5des(OPEN<br>50):::desc ---
		c5a([CELL]):::c -.-
		c5b([CELL]):::c -.-
		QC0(("⚠")):::mismatch

		qc -.-
		o6(OBJ):::o -.-
		o6des(CLOSED<br>0):::desc -.-
		c6a([CELL]):::c -.-
		c6b([CELL]):::c
	end

	subgraph B
		direction TB
		qb[GRP]:::g ---
		o2(OBJ):::o ---
		o2des(OPEN<br>10):::desc ---
		c2a([CELL]):::c ---
		c2b([CELL]):::c -.-
		QB0(("⚠")):::mismatch

		qb -.-
		o3(OBJ):::o -.-
		o3des(PAUSED<br>70):::desc -.-
		c3a([CELL]):::c -.-
		c3b([CELL]):::c -.-
		c3c([CELL]):::c

		qb ---
		o4(OBJ):::o ---
		o4des(OPEN<br>10):::desc ---
		c4a([CELL]):::c ---
		c4b([CELL]):::c ---
		c4c([CELL]):::c -.-
		QB1(("⚠")):::mismatch
	end

	subgraph A
		direction TB
		qa[GRP]:::g ===
		o1(OBJ):::o ===
		o1des(OPEN<br>80):::desc ===
		c1a([CELL]):::c ===
		c1b([CELL]):::c ===
		QA0(("✓")):::match
	end
flowchart TB
	qg[quota group] --- qo1(quota object) & qo2(quota object) & qo3(quota object)
	%% style qg fill:#95CFEC

	qo1:::o === qo1val["status: CLOSED<br>count: 100"]:::val ---
	qc1([quota cell]):::c === qc1val("attribute_id: 80<br>negate: true<br>range: <br>   from: 18<br>   to: 24"):::val -.-
	qc2([quota cell]):::c === qc2val("attribute_id: 1<br>negate: false<br>value: 1"):::val -.-
	qo1des("Exclude attribute 80 <br>values from 18 to 24.<br>Include attribute 1 <br>value 1"):::desc

	qo2:::o === qo2val["status: PAUSED<br>count: 45"]:::val ---
	qo2des("PAUSED quota<br>objects will result<br>in termination"):::desc -.-
	qc3([quota cell]):::c === qc3val("attribute_id: 80<br>negate: false<br>range: <br>   from: 18<br>
   to: 24"):::val -.-
	qc4([quota cell]):::c === qc4val("attribute_id: 1<br>negate: true<br>range: 1"):::val

	qo3:::o === qo3val["status: CLOSED<br>count: 10"]:::val ---
	qo3des("CLOSED quota<br>objects will result in<br>termination"):::desc -.-
	qc5([quota cell]):::c ===
	qc5val("attribute_id: 80<br>negate: false<br>range:<br>   from: 18<br>   to: 24"):::val

	%% classDef o fill:#DAE3F7,stroke:#1B365D
	%% classDef c fill:#FCE3AB,stroke:#1B365D

	%% value style
	%% classDef val fill:#000,color:#fafafa,stroke:#333

	%% description style
	%% classDef desc fill:#EEF8FC,color:#000,stroke-width:0

	%% opacity
	%% classDef opa opacity:.59
	%% class qc3,qc3val,qc4,qc4val,qc5,qc5val opa
	%% link
	linkStyle 12,13,14,18 opacity:.59

	%% link style
	linkStyle 8,10,11,16,17 display:none

flowchart LR
		%%    start --- filter
		%%    b[end] --- quota
	subgraph filter
		direction TB
		fg1[GRP]:::fg ===
		fo1a(OBJ):::fo ===
		fc1a([CELL]):::c ===
		fc1b([CELL]):::c ===
		fg1stat(("✓")):::match

		fg2[GRP]:::fg ===
		fo2a[OBJ]:::fo ===
		fc2a([CELL]):::c ===
		fg2stat(("✓")):::match
	end

	subgraph quota
		direction TB
		qg1[GRP]:::qg ===
		qo1a(OBJ):::qo ===
		qo1ades["OPEN<br>60"]:::desc ===
		qc1a([CELL]):::c ===
		qc1b([CELL]):::c ===
		qg1stat(("✓")):::match 

		qg2[GRP]:::qg ===
		qo2a(OBJ):::qo ===
		qo2ades["OPEN<br>50"]:::desc ===
		qc2a([CELL]):::c ===
		qg2stat(("✓")):::match

		qg2[GRP] -.-
		qo3a(OBJ):::qo -.-
		qo3ades["PAUSED<br>50"]:::desc -.-
		qc3a([CELL]):::c -.-
		qc3b([CELL]):::c -.-
		qc3c([CELL]):::c
	end

	filter === quota
flowchart LR
%%    start --- filter
%%    b[end] --- quota
	subgraph filter
		direction TB
		fg1[GRP]:::fg ===
		fo1a(OBJ):::fo ===
		fc1a([CELL]):::c ===
		fc1b([CELL]):::c ===
		fg1stat(("✓")):::match
				
		fg2[GRP]:::fg -.-
		fo2a[OBJ]:::fo ---
		fc2a([CELL]):::c ---
		fg2stat(("⚠")):::mismatch
	end

	subgraph quota
		direction TB
		qg1[GRP]:::qg -.-
		qo1a(OBJ):::qo -.-
		qo1ades["OPEN<br>60"]:::desc -.-
		qc1a([CELL]):::c -.-
		qc1b([CELL]):::c
			
		qg2[GRP]:::qg -.-
		qo2a(OBJ):::qo -.-
		qo2ades["OPEN<br>50"]:::desc -.-
		qc2a([CELL]):::c
			
		qg2[GRP]:::qg -.-
		qo3a(OBJ):::qo -.-
		qo3ades["PAUSED<br>50"]:::desc -.-
		qc3a([CELL]):::c -.-
		qc3b([CELL]):::c -.-
		qc3c([CELL]):::c
	end

	filter -.- quota
flowchart LR
%%    start --- filter
%%    b[end] --- quota
	subgraph filter
		direction TB
		fg1[GRP]:::fg ===
		fo1a(OBJ):::fo ===
		fc1a([CELL]):::c ===
		fc1b([CELL]):::c ===
		fg1stat(("✓")):::match

		fg2[GRP]:::fg ===
		fo2a[OBJ]:::fo ===
		fc2a([CELL]):::c ===
		fg2stat(("✓")):::match
	end

	subgraph quota
		direction TB
		qg1[GRP]:::qg ===
		qo1a(OBJ):::qo ===
		qo1ades["OPEN<br>60"]:::desc ===
		qc1a([CELL]):::c ===
		qc1b([CELL]):::c ===
		qg1stat(("✓")):::match

		qg2[GRP]:::qg -.-
		qo2a(OBJ):::qo -.-
		qo2ades["CLOSED<br>30"]:::desc -.-
		qc2a([CELL]):::c -.-
		qc2b([CELL]):::c -.-
		qc2c([CELL]):::c

		qg2[GRP]:::qg -.-
		qo3a(OBJ):::qo ---
		qo3ades["OPEN<br>50"]:::desc ---
		qc3a([CELL]):::c ---
		qc3b([CELL]):::c -.-
		qg2stat(("⚠")):::mismatch
	end

		filter === quota